Unity - Rigidbodies 和 Physics
上一章中碰撞的主要问题在于代码。我们现在将直接修改游戏对象的位置值。如果玩家按下某个键,我们只需向位置添加一个值。我们需要一种方法来让玩家以适当的方式移动,以便它对边界和其他游戏对象做出反应。
为此,我们需要了解Rigidbodies是什么。Rigidbodies是允许游戏对象对实时物理做出反应的组件。这包括对力和重力、质量、阻力和动量的反作用。
只需单击添加组件并在搜索字段中输入 Rigidbody2D,即可将 Rigidbody 附加到 GameObject。
单击 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,因为我们没有为其分配任何内容。如果您按原样编译并运行游戏,您将在编辑器左下角看到以下错误
为了解决这个问题,让我们考虑一下脚本创建的组件。请记住,公共属性在 Unity 中会创建自己的字段,就像我们对速度变量所做的那样。
将速度调整为更高的值(大约 5),然后玩游戏。
您的碰撞现在将正常工作!