Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何让一个对象在鼠标clic上移动并与另一个对象交换位置_C#_Unity3d_Transform_Swap_Gameobject - Fatal编程技术网

C# 我如何让一个对象在鼠标clic上移动并与另一个对象交换位置

C# 我如何让一个对象在鼠标clic上移动并与另一个对象交换位置,c#,unity3d,transform,swap,gameobject,C#,Unity3d,Transform,Swap,Gameobject,到目前为止,我有一个脚本,可以在鼠标单击时将对象移动一小段距离,但是我想对其进行更改,以便在单击此对象时,它可以与旁边的另一个对象交换位置,而不仅仅是它现在移动的小距离。我有点困惑如何做到这一点,因为我是新的统一 using UnityEngine; using System.Collections; public class NewBehaviourScript: MonoBehaviour { public float movementSpeed = 10;

到目前为止,我有一个脚本,可以在鼠标单击时将对象移动一小段距离,但是我想对其进行更改,以便在单击此对象时,它可以与旁边的另一个对象交换位置,而不仅仅是它现在移动的小距离。我有点困惑如何做到这一点,因为我是新的统一

 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);
         }


     }
 }
试试这个:

 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;
         }
     }

 }
这只是将每个对象位置保存到posA和posB变量中,然后将objectA移动到posB,将objectB移动到posA

-或-

现在,如果objectB始终是不同的对象(不是常量),并且您不确定如何找到最近的对象,那么可以使用光线投射。将以下函数添加到代码中:

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;
    }
}
     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;
             }
         }
     }
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    //making them public just to be able watch values change in game mode
    public float movementSpeed = 10;
    public GameObject g1;
    public GameObject g2;
    public Vector3 vec1;
    public Vector3 vec2 = new Vector3(2F, 2F, 2F);
    public bool swapBack = false;

    void Start()
    {
        g1 = GameObject.Find("Cube");
        g2 = GameObject.Find("Sphere");
        vec1 = new Vector3(g1.gameObject.transform.position.x, g1.gameObject.transform.position.y, g1.gameObject.transform.position.z);
        vec2 = new Vector3(g2.gameObject.transform.position.x, g2.gameObject.transform.position.y, g2.gameObject.transform.position.z);
    }

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

    public void swap(bool back)
    {
        if (back)
        {
            g1.transform.position = vec1;
            g2.transform.position = vec2;
            swapBack = false;
        }
        else
        {
            g1.transform.position = vec2;
            g2.transform.position = vec1;
            swapBack = true;
        }
    }
}