我正在尝试引用我父母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;
}
}
答案 0 :(得分:2)
在对象上调用Destroy会将其放入队列中以供以后销毁。也许尝试使用DestroyImmediate()来保证它在您的其他脚本启动之前发生。