上一章中碰撞的主要问题在于代码. 我们现在将直接修改GameObject的位置值.如果玩家正在按键,我们只是在该位置添加一个值.我们需要一种方法让玩家以这样的方式移动,使其对边界和其他游戏对象做出正确的反应.
为此,我们需要了解刚体是.刚体是允许GameObject对实时物理做出反应的组件.这包括对力和重力,质量,阻力和动量的反应.
只需单击添加组件并输入Rigidbody2D即可将刚体附加到游戏对象在搜索字段中.
点击Rigidbody2D将附加组件到你的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创建引用,我们的更新代码适用于该引用而不是Object的转换.这意味着Rigidbody现在已经被赋予了移动的责任.
您可能希望 body 引用抛出NullReferenceException,因为我们没有为它分配任何内容.如果您按原样编译和运行游戏,您将在编辑器的左下角出现以下错误
要解决这个问题,让我们考虑一下脚本创建的组件.请记住,公共属性在Unity中创建自己的字段,就像我们使用速度变量一样.
将速度调整到更高的值,大约5,然后玩游戏.
您的碰撞现在可以正常运行了!