Search code examples
c#unity-game-enginetransformswapgameobject

How do I get an object to move and swap places with another object, on a mouse clic


I have a script so far that moves an object a small distance upon a mouse click, however I want to change it so that when I click this object, it swaps places with another obejct next to it, instead of just the small distance it is moving now. I am a little confused on how to do this, because I am new to unity.

 using UnityEngine;
 using System.Collections;

 public class NewBehaviourScript: MonoBehaviour
 {
     public float movementSpeed = 10;

     void Update(){
         if ( Input.GetMouseButtonDown(0))
         {
             transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
         }


     }
 }

Solution

  • Try this:

     using UnityEngine;
     using System.Collections;
    
     public class NewBehaviourScript: MonoBehaviour {
         public GameObject objectA; //Needs to be initialized in the editor, or on Start
         public GameObject objectB; //Needs to be initialized in the editor, or on Start
         public float movementSpeed = 10;
         private Vector3 posA = Vector3.zero; //Vector3.zero is for initialization
         private Vector3 posB = Vector3.zero; //Vector3.zero is for initialization
    
         void Update() {
             if ( Input.GetMouseButtonDown(0)) {
                 posA = objectA.gameObject.transform.position;
                 posB = objectB.gameObject.transform.position;
                 objectA.gameObject.transform.position = posB;
                 objectB.gameObject.transform.position = posA;
             }
         }
    
     }
    

    This just saves each objects position into the posA and posB variables, then you move objectA to posB and objectB to posA.

    -OR-

    Now if objectB is always a different object (NOT constant) and you aren't sure how to find the nearest object, you could use a raycast. Add the following function to your code:

    gamObject NearestObject () {
        int dist;
        int nearestIndex;
        //Create an array to contain objects to be hit by the raycast
        RaycastHit[] nearby;
        //Hit all objects within 100 units with a raycast, change the 100 as needed
        nearby = Physics.RaycastAll(objectA.transform.position, transform.forward, 100.0f);
        //Check if there is at least one object
        if(nearby.Length > 0) {
            //If there is only one object and it's not objectA
            if(!(nearby.Length == 1 && nearby[0].transform == objectA.transform)) {
                dist = nearby[0].distance;
                nearestIndex = 0;
                for (int i = 1; i < nearby.Length; i++) {
                    if(nearby[i].transform != gameObject.transform && nearby[i].distance < dist)
                        dist = nearby[i].distance;
                        nearestIndex = i;
                    }
                }
            } else {
               //There is only one object in the raycast and it is objectA
               nearestIndex = -1; 
            }
        } else {
            //There are no objects nearby
            nearestIndex = -1;
        }
        //nearestIndex will only be negative one if there are no objects near objectA, so return null
        if (nearestIndex == -1) {
            return null;
        } else {
            //return nearest object to update
            return nearby[nearestIndex].gameObject;
        }
    }
    

    Finally, change Update to:

         void Update() {
             if ( Input.GetMouseButtonDown(0)) {
                 objectB = NearestObject ();
                 if (objectB != null) {
                     posA = objectA.gameObject.transform.position;
                     posB = objectB.gameObject.transform.position;
                     objectA.gameObject.transform.position = posB;
                     objectB.gameObject.transform.position = posA;
                 }
             }
         }