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  阅读(176)  评论(0)    收藏  举报

导航