Vector3 MoveTowards不能工作吗?

时间:2019-03-29 10:40:52

标签: c# unity3d qvector3d

我试图通过更新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);
    }

我所期望的是,该对象将浮动到新的矢量位置。但是它似乎没有做到这一点。

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

预先感谢

1 个答案:

答案 0 :(得分:0)

摘自Unity文档:

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

  

计算当前点和目标点之间的位置,并且移动的距离不得超过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;
    }
}