如何让一个对象在鼠标单击时移动并与另一个对象交换位置
Posted
技术标签:
【中文标题】如何让一个对象在鼠标单击时移动并与另一个对象交换位置【英文标题】: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);
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于如何让一个对象在鼠标单击时移动并与另一个对象交换位置的主要内容,如果未能解决你的问题,请参考以下文章
在opengl中,如何将鼠标跟随更改为鼠标单击、拖动和释放?