我学习了一个简单的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
不同的游戏对象时,您不必重写它。(这种情况经常发生,令人惊讶。(