各シーンの Root にある GameObject を取得したくて下記のコードを書いたが
GameObject の数が増えると Resources.FindObjectsOfTypeAll
の処理が重くなると思ったので
別の方法を探していたら UnityEngine.SceneManagement.SceneManager
たるものを見つけました
var rootObjects = new List<GameObject>(); var findObjects = Resources.FindObjectsOfTypeAll<GameObject>(); foreach (var findObject in findObjects) { if (findObject.transform.parent == null) { rootObjects.Add(findObject); } } var group = rootObjects.GroupBy(o => o.scene); foreach (var pair in group) { if (!pair.Key.isLoaded) continue; foreach (var value in pair) { Debug.Log(string.Format("[{0}] {1}", pair.Key.name, value.name)); } }
UnityEngine.SceneManagement.SceneManager
Unity 5.3 より導入されたクラスで シーンの管理に利用できるようでした
これを使えばロードしているシーン一覧が取得でき Root にある GameObject 一覧の取得が容易にできます
for (var i = 0; i < UnityEngine.SceneManagement.SceneManager.sceneCount; i++) { var scene = UnityEngine.SceneManagement.SceneManager.GetSceneAt(i); foreach (var rootGameObject in scene.GetRootGameObjects()) { Debug.Log(string.Format("[{0}] {1}", scene.name, rootGameObject.name)); } }