Instantiate start 获取组件 null
null 引用异常
如果双击 null 引用异常错误,则会打开 Projectile 脚本并定位到 Rigidbody2d.AddForce (direction * force) 行,这表示尽管我们在 Start 中获得了刚体,但 Rigidbody2d 变量还是为空(包含 null)。
这是因为在你创建对象时 Unity 不会运行 Start,而是在下一帧才开始运行。因此,在飞弹上调用 Launch 时,只实例化 (Instantiate),不调用 Start,因此 Rigidbody2d 仍然为空。
要解决此问题,请将 Projectile 脚本中的 void Start() 函数重命名为 void Awake()。
与 Start 刚好相反,在创建对象时(调用 Instantiate 时)就会立即调用 Awake,因此在调用 Launch 之前已正确初始化 Rigidbody2d。
void Launch() { GameObject projectileObject = Instantiate(projectilePrefab, _rubyRb.position + Vector2.up * 0.5f, Quaternion.identity); Projectile projectile = projectileObject.GetComponent<Projectile>(); projectile.Launch(lookDirection, 300); _animator.SetTrigger("Launch"); }
public class Projectile : MonoBehaviour { private Rigidbody2D _rigidbody2D; private void Start() { _rigidbody2D = GetComponent<Rigidbody2D>(); } void OnCollisionEnter2D(Collision2D other) { //我们还增加了调试日志来了解飞弹触碰到的对象 Debug.Log("Projectile Collision with " + other.gameObject); Destroy(gameObject); } public void Launch(Vector2 direction, float force) { _rigidbody2D.AddForce(direction * force); } }
浙公网安备 33010602011771号