【问题标题】:Rigidbody not stopping instantly when setting its velocity to 0将速度设置为 0 时刚体不会立即停止
【发布时间】:2019-11-18 12:50:25
【问题描述】:

我正在尝试使用力在 3D 环境中使我的玩家的运动变得敏捷。我尝试了几件事,但从我的玩家在游戏中的反应来看,我认为我遗漏了一些信息。

public Rigidbody rb;

public float acceleration = 500f;
public UnityEngine.ForceMode forceMode = ForceMode.Impulse;

void Update() {
    rb.AddRelativeForce(new Vector3(Input.GetAxis("Horizontal") * acceleration * Time.deltaTime, 0, Input.GetAxis("Vertical") * acceleration * Time.deltaTime), forceMode);
    rb.velocity = Vector3.zero;
}

首先,为什么这段代码仍然允许我移动我的播放器?每帧将速度重置为 0 应该可以防止它移动,不是吗?我猜即使速度一直设置为 0,力仍然会施加在后续帧上?

我应该如何使用力来获得真正快速的运动,当我停止按 UP 时,施加在 Z 轴上的力“停止”?

【问题讨论】:

  • 你不应该使用更新来做任何基于物理的事情。改用 FixedUpdate
  • 为什么要rb.AddRelativeForce 并在它设置rb.velocity = Vector3.zero 之后?
  • @derHugo 这更像是一个测试,看看我是否理解事情是如何运作的,因为在对它施加力后我无法停止我的对象。所以我就像“我要在施加力后重置速度,看看它会做什么”。我希望我的对象不会移动。但它是......

标签: unity3d


【解决方案1】:

需要注意的重要一点是统一脚本和功能的Order of Execution。物理学的工作方式实际上有点微妙,可能会导致您的问题。

快速解决问题的方法可能是在将速度设置为 0 后让刚体进入睡眠状态:

rb.Sleep();

这确保内部物理更新的执行不会进一步影响这个刚体。通常,您不需要手动处理刚体的 Sleep() 和 WakeUp(),因为它们会根据碰撞或速度阈值自动调用,但在这种情况下,它将防止排队的 AddForce 在其速度归零后影响 RB .

【讨论】:

  • 谢谢。你是对的,它与订单有关。我发现了另一个线程,他们提到 AddForce 被延迟了。但无论如何,我的问题的根源真的是“愚蠢”。释放按钮后 GetAxis 不会立即返回 0...这就是我的角色滑动的原因...使用 GetAxisRaw 解决了所有问题。
  • 啊,这是 GetAxis 平滑输入和内部物理延迟的组合?棘手,但干得好@Robin!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多