首页 > 解决方案 > 如何循环 MoveTowards?

问题描述

在迷你游戏中,我在 Unity 中进行的工作我想循环往复。我想移动对象并回到第一个位置,但不仅仅是 1 次。现在我有了这段代码,它可以让我“移动到位置并返回系统”。如何更改此代码以使循环移动?

public class TestMovement : MonoBehaviour
{
    public float speed = 3;
    public Vector3 target = Vector3.zero;
    private Vector3 origin;

    void Start(){
        origin = transform.position;
    }

    void Update(){
        TestTransform ();
    }


    void TestTransform (){
        transform.position = Vector3.MoveTowards (transform.position, target, speed * Time.deltaTime);
        if (transform.position == target) target = origin;
    }
}

标签: c#unity3d

解决方案


TestTransform 是从 Update 中调用的,这意味着它每帧调用一次。因此,您基本上已经处于一个循环中(只要您的游戏正在运行,就是一个无限循环)。让我们看看您现有的代码和您想要的结果:您现有的代码立即开始向目标移动。到达目标后,它将目标切换回原点,并开始向新目标移动。

您的代码在第一次通过时将“目标”更改为原点。之后,一旦它返回到新的“目标”(现在是“原点”),它就会坐在那里,测试 transform.position == 目标,并在每一帧上一遍又一遍地设置目标 = 原点。

如果您希望对象在原点和目标之间来回反弹,则需要进行一些更改:

  1. 您需要第三个 Vector3(我们称之为“currentTarget”)。
  2. 开始时,设置 currentTarget = target。
  3. 在 TestTransform 中,更改您要测试的位置并将“目标”更改为对“当前目标”进行操作。更改它时,您需要考虑 currentTarget 是否设置为 target 或 origin,然后选择另一个作为您的下一个目标。

最终结果应该是“currentTarget”在“target”和“origin”之间来回变化。

旁注:正如其他人在评论中提到的那样,测试向量的精确相等性并不总是有效 - 您应该检查向量之间的距离并等待它小于某个非常小的值。


推荐阅读