我有一个脚本,当前交换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变量未被使用。
答案 0 :(得分:2)
我将解决这个问题的方法如下:
您需要创建一个名为MovePath的函数。 MovePath将由一个公式控制,该公式确定对象如何从A点移动到B点(这可以是线性,exp,log等)。 MovePath有三个参数,矢量Start,vector End和int或double MoveSpeed。从A点到B点将获得等于MoveSpeed的步骤。所以你正在计算每一步的位置。
需要修改更新,以便将MoveSpeed作为参数。更新将通过使用movepath方法继续更新,直到向量开始变为向量结束。您将调用MovePath两次(每个移动的对象一个),直到g1的位置变为g2' s并且g2的位置变为g1' s。更新将跟踪G1 == G2和G2 == G1相对于位置,并在完成后停止更新。
您需要实现异步和等待,以便UI可以更新。可能有一种方法可以同步执行此操作,但我认为从长远来看,async和await路径将更加清晰。
如果您在尝试实施此操作时遇到问题,请与我们联系。一旦你尝试实现这个编辑你的问题,我认为人们(和我自己)将能够解决你在实现这个问题时遇到的问题。
编辑:有很多方法可以实现这一点。另一个示例是您可以更改MovePath,以便它以递归方式调用自身,直到满足结束条件。我只是想提供一个如何解决它的想法。
答案 1 :(得分:1)
如果您希望也可以使用Lerp或任何其他Slerp方法,则可以Vector3以不同的速率转换,这是非常线性的。
您还可以在资产商店中使用提供补间操作的库,例如iTween中的一些其他操作,这些库将负责您的转换。
答案 2 :(得分:1)
我会使用Lerp或Slerp。这些是使用数学的插值方法,非常简单和无缝。您的代码看起来像这样:
void Update() {
if (Input.GetMouseButtonDown(0)) {
vec1 = g1.gameObject.transform.position;
vec2 = g2.gameObject.transform.position;
g1.gameObject.transform.position = Vector3.Lerp(vec1, vec2, 0.5f);
g2.gameObject.transform.position = Vector3.Lerp(vec2, vec1, 0.5f);
}
}
Here是对Lerp的一个很好的解释,在这种情况下它可以帮到你!