【问题标题】:How do I get an object to move and swap places with another object, on a mouse clic如何让一个对象在鼠标单击时移动并与另一个对象交换位置
【发布时间】:2017-04-21 10:52:00
【问题描述】:

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

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


     }
 }

【问题讨论】:

    标签: c# unity3d transform swap gameobject


    【解决方案1】:

    试试这个:

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

    最后把Update改成:

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

    【讨论】:

      【解决方案2】:
      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;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多