📅  最后修改于: 2020-10-29 04:19:19             🧑  作者: Mango
上一章中冲突的主要问题是代码。现在,我们将直接修改GameObject位置的值。如果玩家按下某个键,我们只是在位置上添加一个值。我们需要一种使玩家移动的方式,使其对边界和其他GameObject做出正确的反应。
为此,我们需要了解什么是刚性体。刚体是允许GameObject对实时物理做出反应的组件。这包括对力和重力,质量,阻力和动量的反应。
您只需单击添加组件并在搜索字段中键入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的引用,并且更新代码在该引用上起作用,而不是对象的变换。这意味着刚体现在已被赋予了移动的责任。
您可能希望正文引用抛出NullReferenceException,因为我们尚未为其分配任何内容。如果按原样编译并运行游戏,则编辑器左下方将出现以下错误
为了解决这个问题,让我们考虑由脚本创建的组件。请记住,就像我们对speed变量所做的那样,公共属性会在Unity中创建自己的字段。
将速度调整为较高的值(大约5),然后玩游戏。
您的碰撞现在将正常运行!