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

标签 c# transform unity-game-engine 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 变量尚未使用。

最佳答案

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

您需要创建一个名为 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/

相关文章:

ios - 计算旋转速度自然旋转view iOS

javascript - 使用 CSS 变换缩放 <div> 容器

c# - 在 Unity 中创建监视器

iphone - 未调用 UIApplicationDelegate 方法

c# - 在 C# 应用程序退出时清理非托管 C++ 线程

c# - IEqualityComparer GetHashCode 被调用但不等于

java - 旋转 BufferedImage 时如何产生清晰的绘制结果?

c# - 更改 ComboBox 的验证样式 WPF

c# - 如何最大程度地减少或通知用户数据库连接延迟/失败?

c# - 从 Unity3d 调用 native DLL 的最佳方法是什么?