この記事でのバージョン
Unity 2019.4.9f1
はじめに
UnityはSceneManager.LoadSceneやEditorSceneManager.OpenScene等、
シーンを開く処理がいくつもありますが
エディタを再生しているかや、ビルドに設定しているかによって使える物が変わります。
という事で今回は、
「Unityエディタを再生しているかとビルド設定されているか問わずにシーンをロードする拡張機能」
を作ってみました!
イメージとしては以下のような感じで、
いつでも好きなシーンに切り替えられるので、テストプレイが捗ります。
ちなみに以前似たような物を作りましたが、
この時は「エディタを再生している時のビルドに設定されていないシーン」に対応していませんでした。
なお、記事中では以下のアセットを使っています。
Clean & Minimalist GUI Pack | 2D GUI | Unity Asset Store |
EditorSceneLoader
さっそく拡張機能のプログラムです。
使い方は簡単、上記のEditorSceneLoaderをEditorディレクトリ内に作成すると、
上部メニューにTools/EditorSceneLoaderが追加されるのでこれを実行するだけ。
後は開きたいシーン名のボタンを押せば、
再生しているか、ビルド設定されているかに問わずシーンを開く事が可能です。
(再生中はリロードする事も可能)
なお、シーンに変更がある場合は確認のウィンドウが表示されます。
また、多くのアセットを入れてるとサンプルシーンだらけになってしまうので、
SCENE_DIRECTORY_PATHで表示したいシーンが入ったディレクトを指定出来るようにしました。
(SCENE_DIRECTORY_PATHが空文字だと全シーンを表示)
//「ビルドに設定されていないシーン」で表示する対象があるシーンのディレクトリのパス private readonly string SCENE_DIRECTORY_PATH = "Assets/Scenes";
さらに「通常のゲーム時と同じロード処理にしたい」みたいな場合もあると思うので、
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を再生したりすると更新される)