我试图通过更新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);
}
我所期望的是,该对象将浮动到新的矢量位置。但是它似乎没有做到这一点。
有人可以给我一些见识或建议吗?
预先感谢
答案 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;
}
}