【问题标题】:Vector3.Lerp bug? [duplicate]Vector3.Lerp 错误? [复制]
【发布时间】:2018-10-05 08:38:12
【问题描述】:

我知道如何随着时间推移移动游戏对象,但我有一个奇怪的错误。

我正在尝试创建漂亮的动画,其中相机在按钮单击时向前移动,在第二次按钮单击时向后移动。

我正在使用来自here 的代码来制作动画并且遇到了一个奇怪的问题。

这是我的代码:

private float time = 5, current;
public void MoveBackward()
{
   StartCotoutine(MoveTo(Vector3.zero));
}

public void MoveForward()
{
   StartCotoutine(MoveTo(new Vector3(0,0,15)));
}
private IEnumerator MoveTo(Vector3 target)
{
   current=0;
   while(transform.position!=target)
   {
     transform.position = Vector3.Lerp(transform.position, target, current/time);
     current = Mathf.Clamp(current+Time.deltaTime,0,time);
     yield return null;
   }
}

向前移动效果很好,但由于某种原因,当我尝试向后移动时,它移动得太快了。我尝试打印结果(当前/时间),并且在向后移动时,当变换到达目的地时,它是 0.1(大约)。

附: - 我正在后台运行另一个Cotoutine(如果重要的话)

你知道为什么会这样吗?

提前致谢

【问题讨论】:

  • 我认为你应该记下起始位置,然后从那个位置一直保持到结束,现在你正在从当前位置到结束并改变时间。这会导致非线性运动
  • 我从我添加的链接中复制了代码(稍作修改)。我不明白为什么它不能正确移动......
  • 是的,你改变的一件事正是我提到的那件事
  • 哇,我没有注意到我做到了。我现在看到了。非常感谢。下次我只会复制粘贴而不修改......
  • 不知道你为什么要再问这个问题。在说“它不是重复的”之前,请阅读实际的重复。你会注意到Vector3 startPos = fromPosition.position; 是while 循环之外的起始位置。

标签: unity3d vector lerp


【解决方案1】:

问题在于您在这里如何称呼 lerp:

transform.position = Vector3.Lerp(transform.position, target, current/time);

这将告诉它根据时间从当前位置到结束,这不是线性的。您需要存储起始位置并在所有 lerping 中使用它,以便获得正确的插值。

还取决于 lerp 是如何比较浮点值的,这可能意味着这永远不会结束。最好通过比较 lerping 量来检查 lerping 是否完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多