代码之家  ›  专栏  ›  技术社区  ›  Sean Carey

删除对象后丢失referenceexception

  •  0
  • Sean Carey  · 技术社区  · 8 年前

    我有以下剧本

     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”类型的对象已被销毁,但您仍在尝试访问它。脚本应该检查它是否为空,或者不应该销毁对象。

    错误是指我的代码中的while循环。我想它还在运行那个循环,因为停止它的条件还没有满足

      while(transform.position != target)
    

    我试着添加第二个条件来停止循环,比如

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

    但这似乎行不通。任何帮助都将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  2
  •   lase    8 年前

    除了像注释中建议的另一个用户那样的重构,您可以尝试相同的逻辑,但是相反:

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

    这个 || operator 将按顺序对其进行评估,因此在您的情况下 transform.position 仍在空检查之前评估。

    另外,你可以考虑使用 StopCoroutine 打电话之前 Destroy 在你的物品上。

    最后,我个人也遇到过这样的问题(可能与 this 行为)

    c对象唯一拥有的是指向本机对象的指针,因此destroy(mygameobject)会销毁本机对象,但c端的托管对象仍然存在,并且在不再被引用并被垃圾收集器收集时被销毁。

    所以你可以考虑引入 isHit 成员变量,并在成功碰撞时将其设置为true,然后 消灭 是的。