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

How can I swap the positions of two objects at different speeds, instead of an instant swap?

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

您可以 Lerp the transition at difference rates, which is quite linear, if you would like you can also use Slerp or any of the other Vector3 方法。

您还可以使用提供补间操作的库,例如 iTween 资产商店中的许多其他库,它们将为您处理过渡。

我解决这个问题的方法如下:

您需要创建一个名为 MovePath 的函数。 MovePath 将由确定对象如何从 A 点移动到 B 点的公式控制(这可以是线性的、exp、log 等)。 MovePath 采用三个参数,向量 Start、向量 End 和 int 或 double MoveSpeed。从 A 点到 B 点的步数等于 MoveSpeed。所以你正在计算每一步的位置。

Update 将需要进行修改,以便将 int MoveSpeed 作为参数。 Update 会使用 movepath 方法不断更新,直到 vector start 变为 vector end。您将调用 MovePath 两次(每个对象移动一次)直到 g1 的位置变为 g2 的位置并且 g2 的位置变为 g1 的位置。更新将跟踪 G1 == G2 和 G2 == G1 的位置,并在完成后停止更新。

您需要实施异步和等待,以便 UI 可以更新。可能有一种方法可以同步执行此操作,但我认为在较长的 运行.

中,走异步和等待路径会更清晰

如果您在尝试实现此功能时有任何疑问,请告诉我。一旦您尝试实施此编辑您的问题,我认为人们(和我自己)将能够解决您在实施此问题时 运行 遇到的问题。

编辑:有很多方法可以实现。另一个示例是您可以更改 MovePath,以便它递归调用自身,直到满足结束条件。我只是想为您提供一个解决方法。

我会使用 Lerp, or 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 的一个很好的解释,在这种情况下它可能对你有帮助!