【问题标题】:Unity C# - Lerp problem with rigidbody.movepositionUnity C#-rigidbody.moveposition 的 Lerp 问题
【发布时间】:2021-08-07 15:53:33
【问题描述】:

由于我使用的是 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

【问题讨论】:

  • 在 if 语句中使用 debug。我认为您需要将 Horizo​​ntalMov == 0 && VerticalMov == 0 替换为 Horizo​​ntalMov == 1 && VerticalMov ==1。我们需要看完整的代码
  • 我无法显示所有内容,因为它太长了,我也使用了你的修复程序,现在它根本没有 lerp

标签: c# visual-studio unity3d 3d rigid-bodies


【解决方案1】:

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

如果你想继续使用 Lerp,

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

其中 t 应该是一个从 0 到 1 的值,并且可以乘以速度。您可以保留一个类变量float startTime 并在跳转开始时执行float 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 的浮点数,所以它会随着时间增加。

【讨论】:

  • 另外,第二个 if 语句实际上什么都不做。您正在为该职位分配职位。这就像 int x = 1; x = x;这里的第二行没用。
  • 我发现smoothdamp 效果很好,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
相关资源
最近更新 更多