c# - 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 位置。
解决方案
如果你想要平滑,你应该使用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 的浮点数,因此它会随时间增加。
推荐阅读
- java - 使用 Gson 将 JSON 转换为具有多个单词作为键的 POJO 类
- html - Gmail 不考虑图片宽度
- python - 从 json 转换为 xml 而不在 python 中排序数据?
- r - 将整洁的选择参数传递给内部函数,同时保持“缺失”
- r - 来自向量的动态矩阵
- sql - SCCM 的 SQL 查询
- javascript - 将鼠标悬停在 WordPress 的帖子上时,我想更改底部链接
- blazor - 通过使用应用程序覆盖 blazor 组件库中的隔离 css
- java - android studio中此日志消息的原因是什么
- django - 按 ForeignKey 的字段过滤不同的查询集