如何以不同的速度交换两个物体的位置,而不是即时交换?

时间:2016-12-06 20:03:22

标签: c# unity3d transform unity5 gameobject

我有一个脚本,当前交换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变量未被使用。

3 个答案:

答案 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)

我会使用LerpSlerp。这些是使用数学的插值方法,非常简单和无缝。您的代码看起来像这样:

 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的一个很好的解释,在这种情况下它可以帮到你!