我有一个脚本当前可以交换 2 个对象的位置。这些物体的大小和形状相同,因此当它们交换位置时,是即时的,您不会看到它们朝该位置移动。我怎样才能做到当两个物体交换位置时有一个移动速度,这样你就可以看到它们实际移动的位置。我还需要弄清楚如何添加第三个对象,以便它们都随机切换位置。像这样的事情是我的最终目标:http://i249.photobucket.com/albums/gg240/OldNewby4507/shell-game-animated.gif
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
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("object1");
g2 = GameObject.Find("object2");
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))
{
vec1 = g1.gameObject.transform.position;
vec2 = g2.gameObject.transform.position;
g1.gameObject.transform.position = vec2;
g2.gameObject.transform.position = vec1;
}
}
}
现在我的 MovementSpeed 变量尚未使用。
最佳答案
我解决这个问题的方法如下:
您需要创建一个名为 MovePath 的函数。 MovePath 将由一个公式控制,该公式确定对象如何从 A 点移动到 B 点(可以是线性、指数、对数等)。 MovePath 采用三个参数:向量 Start、向量 End 和 int 或 double MoveSpeed。要从 A 点到达 B 点,将采取等于 MoveSpeed 的步数。因此,您正在计算每一步的位置。
Update 需要修改,以便将 int MoveSpeed 作为参数。 Update 将使用 movepath 方法不断更新,直到向量开始变为向量结束。您将调用 MovePath 两次(每个正在移动的对象调用一次),直到 g1 的位置变为 g2 的位置,并且 g2 的位置变为 g1 的位置。更新将跟踪 G1 == G2 和 G2 == G1 相对于位置的时间,并在完成后停止更新。
您将需要实现异步和等待,以便 UI 可以更新。可能有一种方法可以同步执行此操作,但我认为从长远来看,采用异步和等待路径会更加清晰。
如果您在尝试实现此操作时有任何疑问,请告诉我。一旦您尝试实现此编辑您的问题,我认为人们(和我自己)将能够对您在实现此问题时遇到的问题提出意见。
编辑:有很多方法可以实现这一点。另一个示例是您可以更改 MovePath,以便它递归地调用自身,直到满足结束条件。我只是想向您提供如何解决这个问题的想法。
关于c# - 如何以不同的速度交换两个物体的位置,而不是立即交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41003867/