(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

複数のSceneを順に読み込み、各Sceneの全GameObjectを取得する【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2017.1.1f1


はじめに

今回は複数のSceneを順に読み込み、各Sceneの全GameObjectを取得する方法のご紹介です!

文章だと分かり難いですが、例えば以下のようにScene1,2,3があった時に、


f:id:kan_kikuchi:20170929191811j:plain


Scene1を読み込み、Scene1の全GameObjectを取得し、Logで名前を表示、

Scene2を読み込み、Scene2の全GameObjectを取得し、Logで名前を表示、

Scene3を読み込み、Scene3の全GameObjectを取得し、Logで名前を表示、

といった具合に、各シーンに順に処理を行っていく感じです。


f:id:kan_kikuchi:20170929192658g:plain


これは使えば、全シーンに配置してある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();
}

f:id:kan_kikuchi:20170929192658g:plain


プログラムの流れをざっくり言うと、

System.IO.Directory.GetFilesでディレクトリの全ファイルを取得し、

AssetDatabase.LoadAssetAtPathでシーンのアセットだけを取り出し、



UnityEditor.SceneManagement.EditorSceneManagerでシーンを読み込み、




Resources.FindObjectsOfTypeAllとAssetDatabase.GetAssetOrScenePathで、

シーン上に存在する全GameObjectを取得するという感じです。


おわりに

使い所は限られていますが、いざという時に使える便利スクリプトでした。


余談ですが、今回紹介したやり方は、EditorSceneManagerのリファレンスを読んでいる時に

以下のTweetをふと思い出し、EditorSceneManager使えばいけるやんと思い立ったのが発端です。