この記事でのバージョン
Unity 2017.1.0f3
はじめに
今回はタイトル通り、エディタ非実行時にプログラムからシーンの開閉を行う方法のご紹介です!
![]() |
エディタ拡張で特定のシーンを開きたい、閉じたいなんて時に役立つ話です。
EditorSceneManager
エディタ上でシーンの操作を行いたい時は
UnityEngine.SceneManagement.SceneManagerではなく、
UnityEditor.SceneManagement.EditorSceneManagerを使います。
なお、EditorSceneManagerはエディタ上専用なので、
Build SettingsのScenes In Buildに含まれていないシーンも操作出来ます。
![]() |
シーンを開く
シーンを開きたい時はOpenSceneを使います。
なお、シーンの指定方法はAssetsからのパス(拡張子付き)です。
//Scenesディレクトリに入っているScene1というシーンを開く EditorSceneManager.OpenScene("Assets/Scenes/Scene1.unity");
![]() |
![]() |
上記の例の通り、OpenSceneを使うとそれまで開いていたシーンは閉じてしまいます。
この時、シーンに変更があると破棄されてしまうので、
SaveCurrentModifiedScenesIfUserWantsToを使って変更をどうするか確認を取ったほうが安全です。
//変更があった場合にどうするか聞く(変更が有り、かつ、Cancelを押された時だけfalseになる) if(EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()){ //Scenesディレクトリに入っているScene1というシーンを開く EditorSceneManager.OpenScene("Assets/Scenes/Scene1.unity"); }
![]() |
また、OpenSceneの第二引数(mode)を
Additiveにすると、現在開いてるシーンに追加する形でシーンを開き、
//Scene2を追加する EditorSceneManager.OpenScene("Assets/Scenes/Scene2.unity", OpenSceneMode.Additive);
![]() |
AdditiveWithoutLoadingにすると、非ロード(not loaded)状態で追加します。
//Scene2を非ロードで追加する EditorSceneManager.OpenScene("Assets/Scenes/Scene2.unity", OpenSceneMode.AdditiveWithoutLoading);
![]() |
シーンを閉じる
シーンを閉じたい時はCloseSceneを使います。
なお、シーンの指定方法はOpenSceneとは違い、Sceneクラスです。
//アクティブなシーンを取得 Scene activeScene = EditorSceneManager.GetActiveScene(); //取得したシーンを閉じる EditorSceneManager.CloseScene(activeScene, true);
![]() |
上記の例の通り、複数シーンある場合は上から閉じていきますが、
一つしかシーンがアクティブでない場合は閉じることが出来ず、警告が出ます。
また、CloseSceneの第二引数(removeScene)をfalseにすると、非ロード(not loaded)状態になります。
![]() |
おわりに
実は今回紹介したEditorSceneManager、
シーンを新規作成したり、修正済みの印をつけたり、結構色々な事が出来たりします。
なので、エディタ拡張でシーンの操作をしたいと思った時は
とりあえずEditorSceneManagerのリファレンスとにらめっこするのが良さそうです。