一、问题描述:
功能模块需要将层次面板中的某一个自定义脚本组件的所有实例保存到一个字典里,脚本里有唯一标识这些组件实例的id,这些脚本中有些在程序开始时是隐藏的,即inactive的,GameObject.FindObjectsOfTypeAll<T>()并不能获取到隐藏实例,但是Resources.FindObjectsOfTypeAll<T>()是可以的,但是Resources.FindObjectsOfTypeAll<T>()连同预设体也一并找到了,这并不是我想要的。看到网上有好些人在纠结这个问题,就共享出来吧
二、解决方法。
在添加到字典里时,设定添加的条件:此实例的gameObject所属场景的名字不为空。下面贴出我的部分代码:
FuncReactor[] frs = Resources.FindObjectsOfTypeAll<FuncReactor>();
for (int i = 0; i < frs.Length; ++i)
{
if (frs[i].gameObject.scene.name != null)
{
if (allFrs.ContainsKey(frs[i].identifyNo.ToString()))
{
Debug.LogError("scenename:" + frs[i].gameObject.scene.name + ",same key" + frs[i].identifyNo.ToString());
}
else
{
allFrs.Add(frs[i].identifyNo.ToString(), frs[i]);
}
}
else
{
Debug.Log("这是一个预设体!");
}
}
三、注意
假如gameObject是个预设体,它的scene是不为空的,所以根据它的scene是不是为空来判断是不是预设体是达不到目的的。