简述
上一章中冲突的主要问题在于代码。我们现在将直接修改游戏对象位置的值. 如果玩家按下一个键,我们只是在位置上添加一个值。我们需要一种方法让玩家移动,使其对边界和其他游戏对象做出正确反应。
为此,我们需要了解什么rigidbodies是。刚体是允许游戏对象做出反应的组件real-time physics. 这包括对力和重力、质量、阻力和动量的反应。
您可以通过简单地单击将刚体附加到您的游戏对象Add Component并在搜索字段中输入 Rigidbody2D。
单击 Rigidbody2D 会将组件附加到您的游戏对象。现在它已附加,您会注意到许多新字段已打开。
使用默认设置,游戏对象将垂直下落down由于重力。为避免这种情况,请设置Gravity Scale为 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);
}
}
我们可以看到我们创建了一个reference到声明中的 Rigidbody2D,我们的更新代码在该引用而不是对象的转换上工作。这意味着刚体现在被赋予了移动的责任。
您可能会期望body引用 throw NullReferenceException,因为我们没有为它分配任何东西。如果您按原样编译并运行游戏,您将在编辑器左下方收到以下错误
为了解决这个问题,让我们考虑脚本创建的组件。请记住,公共属性在 Unity 中创建自己的字段,就像我们对速度变量所做的那样。
将速度调整到更高的值,大约 5,然后玩游戏。
您的碰撞现在可以正常工作了!