删除对象后缺少MissingReferenceExcepetion

时间:2018-06-22 20:26:23

标签: unity3d

我有以下脚本

 using System.Collections;
 using UnityEngine;

public class Bullet : MonoBehaviour
{

[SerializeField]
private float _speed;

private IEnumerator ShootAt(Vector3 target)
{
    while (transform.position != target)
    {
        yield return null;
        transform.localPosition = Vector3.MoveTowards(transform.localPosition, target, _speed * Time.deltaTime);
    }
}

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Animal")
    {
        Destroy(gameObject);
    }
}

}

子弹击中动物并被销毁后,出现以下错误:MissingReferenceException:'Bullet'类型的对象已被销毁,但您仍在尝试访问它。您的脚本应检查其是否为null或不破坏该对象。

错误是指我的代码中的while循环。我猜它仍在运行该循环,因为尚未满足停止它的条件

  while(transform.position != target)

我尝试添加第二个条件来停止该循环,例如

  while(transform.position != target || gameObject != null)

但这似乎不起作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

除了像注释中建议的其他用户那样进行重构之外,您可以尝试使用与您相同的逻辑,但是要相反:

while(gameObject != null || transform.position != target)

|| operator将按照写入顺序进行评估,因此在您的情况下,transform.position仍在空检查之前得到评估。

此外,您可以考虑在对对象调用StopCoroutine之前使用Destroy

最后,因为我个人也遇到了这种情况(可能与this行为有关)

  

C#对象唯一拥有的是指向本机对象的指针,因此Destroy(myGameObject)销毁了本机对象,但C#端的托管对象仍然存在,并且在不再引用并被收集时销毁了该对象。通过垃圾收集器。

因此,您可以考虑引入一个isHit成员变量,并在成功碰撞后将其设置为true,然后再进行Destroy的操作。