Unity C# - rigidbody.moveposition 的 Lerp 问题

Unity C# - Lerp problem with rigidbody.moveposition

因为我使用 rb.movepos 它没有通过拖动平滑所以我试图重用我有的 lerp 代码。这是代码:

if (HorizontalMov == 0 && VerticalMov == 0 || rb.transform.position.x == 0 && rb.transform.position.y == 0 && rb.transform.position.z == 0)
        {
            rb.transform.position = Vector3.Lerp(rb.velocity, new Vector3(0, rb.transform.position.y, 0), Time.deltaTime * slowDownSpeed);
        }
        
        if(HorizontalMov > 0 && VerticalMov > 0 || rb.transform.position.x > 0 && rb.transform.position.y > 0 && rb.transform.position.z > 0)
        {
            rb.transform.position = rb.transform.position;
        } 

问题是,一开始我的家伙会无限地上下弹跳并且可以移动,然后在松开控制装置后他会迅速回到 og 位置。

Link转视频: https://streamable.com/jhpxe4

如果你想要平滑,你应该使用SmoothDamp()

如果您想继续使用 Lerp,

rb.transform.position = Vector3.Lerp(rb.transform.position, new Vector3(0, rb.transform.position.y, 0), t);

其中 t 应该是一个从 0 到 1 的值,并且可以乘以速度。您可以保留一个 class 变量 float startTime 并在跳跃开始时执行 float startTime = Time.time ,这样它将保存跳跃开始时的时间。然后 t = Time.time - startTime.

如果您想知道,这就是 lerp 的作用。它需要 3 个参数,a、b 和 t。为简单起见,我们假设这些只是浮点数,a = 0 和 b = 10。在这种情况下,Lerp() 将 return 基于 t 的 a 和 b(0 和 10)之间的值。如果 t 为 0 或小于 0,则 return a 为 0。如果 t 为 1 或更大,则 return 10。如果 t 为 0.5,则 return the a 和 b 之间的值为 5.

这意味着要使其准确工作,您需要在 lerp 开始时保持 a 的值,而不仅仅是为 a 的值提供位置或速度。

另外你不能使用Time.deltaTime,你必须使用一个从0开始的值,就像一个你不断添加Time.deltaTime的浮点数,所以它会随着时间的推移而增加。