この記事でのバージョン
Unity 2017.1.1f1
はじめに
今回は複数のSceneを順に読み込み、各Sceneの全GameObjectを取得する方法のご紹介です!
文章だと分かり難いですが、例えば以下のようにScene1,2,3があった時に、
Scene1を読み込み、Scene1の全GameObjectを取得し、Logで名前を表示、
Scene2を読み込み、Scene2の全GameObjectを取得し、Logで名前を表示、
Scene3を読み込み、Scene3の全GameObjectを取得し、Logで名前を表示、
といった具合に、各シーンに順に処理を行っていく感じです。
これは使えば、全シーンに配置してあるGameObjectをチェックや、処理を簡単に行えます。
GameObjectGetterOfAllScenes
では早速、複数のSceneを順に読み込み、各Sceneの全GameObjectを取得するエディタ拡張、
GameObjectGetterOfAllScenesのプログラムです。
使い方はGameObjectGetterOfAllScenes.csをEditorディレクトリに置き、
以下のようにシーンが入ったディレクトリのパスと、各オブジェクトに実行するアクションを指定して、
GameObjectGetterOfAllScenes.Getを実行するだけです。
public static void ShowGameObjectName(){ //Scenesディレクトリにある全シーンの全GameObjectを取得し、ShowGameObjectNameを実行する GameObjectGetterOfAllScenes.Get("Assets/Scenes", ShowGameObjectName); } //全GameObjectの名前をログで表示 //sceneNameがシーンの名前、gameObjectListがそのシーンにあるGameObject(非アクティブのものも含む) //callbackが次のシーン読み込み、または処理を終了するためのコールバック private static void ShowGameObjectName(string sceneName, List<GameObject> gameObjectList, Action callback){ //全GameObject名を表示 foreach (GameObject gameObject in gameObjectList){ Debug.Log(gameObject.name + " : (" + sceneName + ")"); } //処理が終わったらコールバック実行(次のシーン読み込みへ) callback(); }
プログラムの流れをざっくり言うと、
System.IO.Directory.GetFilesでディレクトリの全ファイルを取得し、
AssetDatabase.LoadAssetAtPathでシーンのアセットだけを取り出し、
UnityEditor.SceneManagement.EditorSceneManagerでシーンを読み込み、
Resources.FindObjectsOfTypeAllとAssetDatabase.GetAssetOrScenePathで、
シーン上に存在する全GameObjectを取得するという感じです。
おわりに
使い所は限られていますが、いざという時に使える便利スクリプトでした。
余談ですが、今回紹介したやり方は、EditorSceneManagerのリファレンスを読んでいる時に
以下のTweetをふと思い出し、EditorSceneManager使えばいけるやんと思い立ったのが発端です。
表示されるSceneを自動で切り替えつつシーン内GameObjectをリストアップしてを繰り返せばいけそうだけど、簡単にできそうな方法ありそうなのよね
— ラッキーゲームス (@RucKyGAMES) July 17, 2017