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一致的所有根物体了