Unity - Rigidbodies 和 Physics

上一章中碰撞的主要问题在于代码。我们现在将直接修改游戏对象的位置值。如果玩家按下某个键,我们只需向位置添加一个值。我们需要一种方法来让玩家以适当的方式移动,以便它对边界和其他游戏对象做出反应。

为此,我们需要了解Rigidbodies是什么。Rigidbodies是允许游戏对象对实时物理做出反应的组件。这包括对力和重力、质量、阻力和动量的反作用。

只需单击添加组件并在搜索字段中输入 Rigidbody2D,即可将 Rigidbody 附加到 GameObject。

Rigidbody2D

单击 Rigidbody2D 会将组件附加到 GameObject。现在已附加,您会注意到已打开许多新字段。

动态体类型

使用默认设置,GameObject 将因重力而垂直向下落下。为了避免这种情况,请将重力比例设置为 0。

现在,玩游戏不会显示任何明显的区别,因为 GameObject 还与其物理组件没有任何关系。

为了解决我们的问题,让我们再次打开我们的代码,并重写它。

public class Movement : MonoBehaviour {
   public float speed;
   public Rigidbody2D body;
   // Update is called once per frame
   void Update() {
      float h = Input.GetAxisRaw("Horizontal");
      float v = Input.GetAxisRaw("Vertical");
      body.velocity = new Vector2(h * speed, v * speed);
   }
}

我们可以看到,我们在声明中创建了对 Rigidbody2D 的 引用,并且我们的更新代码针对该引用而不是对象的变换进行操作。这意味着 Rigidbody 现在被赋予了移动的责任。

您可能希望 body 引用抛出 NullReferenceException,因为我们没有为其分配任何内容。如果您按原样编译并运行游戏,您将在编辑器左下角看到以下错误

Body Reference

为了解决这个问题,让我们考虑一下脚本创建的组件。请记住,公共属性在 Unity 中会创建自己的字段,就像我们对速度变量所做的那样。

Collisions

将速度调整为更高的值(大约 5),然后玩游戏。

您的碰撞现在将正常工作!