(:3[kanのメモ帳]

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

エディタ非実行時にプログラムからシーンの開閉を行う【Unity】【エディタ拡張】


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

この記事でのバージョン
Unity 2017.1.0f3


はじめに

今回はタイトル通り、エディタ非実行時にプログラムからシーンの開閉を行う方法のご紹介です!


f:id:kan_kikuchi:20170918182523g:plain


エディタ拡張で特定のシーンを開きたい、閉じたいなんて時に役立つ話です。


EditorSceneManager

エディタ上でシーンの操作を行いたい時は

UnityEngine.SceneManagement.SceneManagerではなく、

UnityEditor.SceneManagement.EditorSceneManagerを使います。



なお、EditorSceneManagerはエディタ上専用なので、

Build SettingsのScenes In Buildに含まれていないシーンも操作出来ます。


f:id:kan_kikuchi:20170918173113j:plain


シーンを開く

シーンを開きたい時はOpenSceneを使います。

なお、シーンの指定方法はAssetsからのパス(拡張子付き)です。

//Scenesディレクトリに入っているScene1というシーンを開く
EditorSceneManager.OpenScene("Assets/Scenes/Scene1.unity");

f:id:kan_kikuchi:20170918175128j:plain
f:id:kan_kikuchi:20170918175157g:plain


上記の例の通り、OpenSceneを使うとそれまで開いていたシーンは閉じてしまいます。

この時、シーンに変更があると破棄されてしまうので、

SaveCurrentModifiedScenesIfUserWantsToを使って変更をどうするか確認を取ったほうが安全です。

//変更があった場合にどうするか聞く(変更が有り、かつ、Cancelを押された時だけfalseになる)
if(EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()){

  //Scenesディレクトリに入っているScene1というシーンを開く
  EditorSceneManager.OpenScene("Assets/Scenes/Scene1.unity");

}

f:id:kan_kikuchi:20170918175456j:plain


また、OpenSceneの第二引数(mode)を

Additiveにすると、現在開いてるシーンに追加する形でシーンを開き、

//Scene2を追加する
EditorSceneManager.OpenScene("Assets/Scenes/Scene2.unity", OpenSceneMode.Additive);

f:id:kan_kikuchi:20170918182416g:plain


AdditiveWithoutLoadingにすると、非ロード(not loaded)状態で追加します。

//Scene2を非ロードで追加する
EditorSceneManager.OpenScene("Assets/Scenes/Scene2.unity", OpenSceneMode.AdditiveWithoutLoading);

f:id:kan_kikuchi:20170918182503g:plain


シーンを閉じる

シーンを閉じたい時はCloseSceneを使います。

なお、シーンの指定方法はOpenSceneとは違い、Sceneクラスです。

//アクティブなシーンを取得
Scene activeScene = EditorSceneManager.GetActiveScene();

//取得したシーンを閉じる
EditorSceneManager.CloseScene(activeScene, true);

f:id:kan_kikuchi:20170918180440g:plain


上記の例の通り、複数シーンある場合は上から閉じていきますが、

一つしかシーンがアクティブでない場合は閉じることが出来ず、警告が出ます。


また、CloseSceneの第二引数(removeScene)をfalseにすると、非ロード(not loaded)状態になります。


f:id:kan_kikuchi:20170918180817j:plain


おわりに

実は今回紹介したEditorSceneManager、

シーンを新規作成したり、修正済みの印をつけたり、結構色々な事が出来たりします。


なので、エディタ拡張でシーンの操作をしたいと思った時は

とりあえずEditorSceneManagerのリファレンスとにらめっこするのが良さそうです。