(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

「Unityエディタを再生しているか」と「ビルド設定されているか」を気にせずにシーンをロード出来る拡張機能【Unity】【エディタ拡張】


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



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


はじめに

UnityはSceneManager.LoadSceneEditorSceneManager.OpenScene等、

シーンを開く処理がいくつもありますが

エディタを再生しているかや、ビルドに設定しているかによって使える物が変わります。


という事で今回は、

「Unityエディタを再生しているかとビルド設定されているか問わずにシーンをロードする拡張機能」

を作ってみました!


イメージとしては以下のような感じで、

いつでも好きなシーンに切り替えられるので、テストプレイが捗ります。

f:id:kan_kikuchi:20200908073915g:plain


ちなみに以前似たような物を作りましたが、

この時は「エディタを再生している時のビルドに設定されていないシーン」に対応していませんでした。



なお、記事中では以下のアセットを使っています。

Clean & Minimalist GUI Pack | 2D GUI | Unity Asset Store



EditorSceneLoader

さっそく拡張機能のプログラムです。



使い方は簡単、上記のEditorSceneLoaderをEditorディレクトリ内に作成すると、

f:id:kan_kikuchi:20200908072439j:plain


上部メニューにTools/EditorSceneLoaderが追加されるのでこれを実行するだけ。

f:id:kan_kikuchi:20200908072726j:plain


後は開きたいシーン名のボタンを押せば

再生しているか、ビルド設定されているかに問わずシーンを開く事が可能です。

(再生中はリロードする事も可能)

f:id:kan_kikuchi:20200908073915g:plain


なお、シーンに変更がある場合は確認のウィンドウが表示されます。

f:id:kan_kikuchi:20200908074218g:plain


また、多くのアセットを入れてるとサンプルシーンだらけになってしまうので、

SCENE_DIRECTORY_PATHで表示したいシーンが入ったディレクトを指定出来るようにしました。

(SCENE_DIRECTORY_PATHが空文字だと全シーンを表示)

//「ビルドに設定されていないシーン」で表示する対象があるシーンのディレクトリのパス
private readonly string SCENE_DIRECTORY_PATH = "Assets/Scenes";
f:id:kan_kikuchi:20200908074342j:plain


さらに「通常のゲーム時と同じロード処理にしたい」みたいな場合もあると思うので、

OpenSceneのコメントアウトを外せば

「ビルドに設定されているシーンをプレイ中にロードする時」の処理を変更する事も可能です。

//エディタを再生しているかどうかに合わせてシーンを開く
private void OpenScene(string scenePath, bool isSettingBuild) {
  //エディタを再生しているかいないかでロード処理を分ける
  if (Application.isPlaying) {
    //ビルドに設定されているシーンをプレイ中にロードする時(通常のゲーム時と同じロード処理にしたい等)
    //if (isSettingBuild) {
      //return;
    //}
    EditorSceneManager.LoadSceneInPlayMode(scenePath, new LoadSceneParameters(LoadSceneMode.Single));
    return;
  }
		
  //現在のシーンに変更があった場合、保存するか確認のウィンドウを出す(キャンセルされたら読み込みをしない)
  if(!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()){
    return;
  }
  //シーン読み込み
  EditorSceneManager.OpenScene (scenePath);
}


ちなみにシーンのパスの取得はOnEnableで行っているので、

シーンを追加または削除した時はウィンドウ上の表示が古くなっている場合があります。

(コンパイルが発生したり、Unityを再生したりすると更新される)