我无法为团结而创作我的运动脚本



我学习了一个简单的2d字符控制器的教程,下面是代码:

using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float speed;
private Rigidbody2D body;
private void awake()
{
body = GetComponent<Rigidbody2D>();
}
private void Update()
{
body.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, body.velocity.y);
}

}

我每帧都会得到这个错误(更新功能(

NullReferenceException:对象引用未设置为对象的实例PlayerMovement.Update(((位于Assets/scripts/PlayerMovement。cs:15(

错误出现在第15行;身体速度;有人知道问题出在哪里吗

很可能body为null,因为它引用的组件尚未定义。您必须将Rigidbody2D组件附加到脚本所在的游戏对象上。


由于此脚本需要Rigidbody2D才能工作,因此您可以在添加脚本时添加一行,该行将自动在游戏对象上创建它。它位于类定义的顶部,如下所示:

[RequireComponent(typeof(Rigidbody2D))] // <- This is what I'm talking about.
public class PlayerMovement : MonoBehaviour
{
// To save space, I didn't paste the rest of your code.
// ...
}

查看RequireComponent[]上的官方文档。

当您将使用RequireComponent的脚本添加到GameObject时,所需组件将自动添加到GameObject。请注意,RequireComponent只在组件添加到GameObject的那一刻检查缺少的依赖项。GameObject缺少新依赖项的组件的现有实例将不会自动添加这些依赖项。


或者,您可以删除获取组件的Awake()方法中的代码,然后在检查器中拖放组件。

这是推荐的做法,因为它使脚本更加灵活:当Rigidbody2D组件需要连接到与PlayerMovement不同的游戏对象时,您不必重写它。(这种情况经常发生,令人惊讶。(

最新更新