已经被摧毁的Gameobjects的渲染器会发生什么?

时间:2018-04-23 22:50:15

标签: c# unity3d runtime-error nullreferenceexception

我正在尝试引用我父母gamobject的孩子们的所有渲染器,一些游戏对象随机被销毁。但是,当我尝试做

Renderer[] rs = parent.GetComponentsInChildren<Renderer>();

我最终丢失了渲染器。

好的,我想我会使用如下所示的列表过滤掉丢失的渲染器。

Renderer[] rs;
List<Renderer> r = new List<Renderer>();
        GetComponentsInChildren(r);
        for(int i=0;i<r.Count;i++)
        {
            if (ReferenceEquals(r[i],null))
            {
                r.RemoveAt(i);
            }
        }
        rs = r.ToArray();

所以我甚至在使用渲染器之前尝试在Start方法中执行此操作,但它仍然会导致空引用异常,因为渲染器丢失了,我可以在检查器中清楚地看到丢失的渲染器。

我已经检查了我的代码并对其进行了跟踪,我100%确定在 中销毁不同中的子对象后,我将获得渲染器的参考资料>脚本。

我甚至按照StarManta @ https://forum.unity.com/threads/differentiate-between-null-and-missing-references-in-script.376491/

的建议尝试了以下代码
bool IsMissingReference(Object unknown)
    {
        try
        {
            unknown.GetInstanceID();
            return false;
        }
        catch (System.Exception e)
        {
            return true;
        }
    }

1 个答案:

答案 0 :(得分:2)

在对象上调用Destroy会将其放入队列中以供以后销毁。也许尝试使用DestroyImmediate()来保证它在您的其他脚本启动之前发生。