うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Unity の各 Scene にある Root GameObject を取得する方法

各シーンの 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 一覧の取得が容易にできます

f:id:hacchi_man:20200120230401p:plain:w500

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));
    }
}