首页 > 解决方案 > Unity C#-rigidbody.moveposition 的 Lerp 问题

问题描述

因为我使用 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 位置。

视频链接: https ://streamable.com/jhpxe4

标签: c#visual-studiounity3d3drigid-bodies

解决方案


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

如果你想继续使用 Lerp,

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

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

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

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

此外,您不能使用 Time.deltaTime,您必须使用从 0 开始的值,例如不断添加 Time.deltaTime 的浮点数,因此它会随时间增加。


推荐阅读