0

我正在尝试通过更新 transform.position 来移动四个对象和一个 SteamVR 播放器。这工作正常,但它看起来不太好,因为运动就像瞬间。这就是我想使用 Vector3.MoveTowards() 的原因。

不知何故,下面的代码没有完成这项工作。我希望有人可以帮助我。

    private void ZoomObject(Vector3 currentPlayerPosition, float height, float distance)
    {
        TPNorthObject.transform.position = Vector3.MoveTowards(TPNorthObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);
        TPEastObject.transform.position = Vector3.MoveTowards(TPEastObject.transform.position, new Vector3(distance, height, 0), 10 * Time.deltaTime);
        TPSouthObject.transform.position = Vector3.MoveTowards(TPSouthObject.transform.position, new Vector3(0, height, -distance), 10 * Time.deltaTime);
        TPWestObject.transform.position = Vector3.MoveTowards(TPWestObject.transform.position, new Vector3(-distance, height, 0), 10 * Time.deltaTime);
    }

我所期望的是,该对象将浮动到新的向量位置。然而,它似乎并没有这样做。

有人可以给我一些见解或建议吗?

提前致谢

4

1 回答 1

0

来自 Unity 的文档:

https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

计算 current 和 target 指定的点之间的位置,移动不超过 maxDistanceDelta 指定的距离。

使用 MoveTowards 成员将当前位置的对象移向目标位置。通过使用此函数计算的位置更新对象的每帧位置,您可以将其平滑地移向目标。使用 maxDistanceDelta 参数控制移动速度。

也就是说MoveTowards不会为你做流畅的动画。如果您不想要某种动画效果,则需要循环调用 ZoomObject 函数,直到您的对象到达目标位置。查看文档页面上的示例。

您可以使用循环或协程来执行此操作。也许看起来像这样。

IEnumerator Fade() 
{

    while (Vector3.Distance(TPNorthObject.transform.position, new Vector3(0, height, distance)) > 0.001f)
    {
        // Speed = Distance / Time => Distance = speed * Time. => Adapt the speed if move is instant.
        TPNorthObject.transform.position = Vector3.MoveTowards(TPNorthObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);

        yield return null;
    }
}
于 2019-03-29T16:17:39.477 回答