Unity获取场景中所有根物体
每个物体都属于一个Scene,而通过Scene.GetRootGameObjects()接口就可以获得该Scene的所有根物体,我们只需要遍历所有Scene即可
List<GameObject> roots = new List<GameObject>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
var scene = SceneManager.GetSceneAt(i);
if (!scene.isLoaded) continue;
roots.AddRange(scene.GetRootGameObjects());
}
而被DontDestroyOnLoad处理过的物体就不再属于原来的场景了,它们被分配到一个隐藏的叫做DontDestroyOnLoad的新场景里。这个场景无法通过SceneMananger找到,但是我们可以曲线救国,准备一个已经被DontDestroyOnLoad的物体,然后通过接口GameObject.scene即可获取该场景了
foreach (var go in dontDestoryGo.scene.GetRootGameObjects())
{
// 注意该场景里经常会有各种隐藏物体,把它们屏蔽掉
if ((go.hideFlags & HideFlags.HideInHierarchy) == 0)
{
roots.Add(go);
}
}
上面两部分结合起来,就能拿到与Hierarchy一致的所有根物体了