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);
    }
}

 

posted on 2021-12-08 17:57  ZhYQ_note  阅读(146)  评论(0)    收藏  举报

导航