Unityで開発をしていると、「このシーンを何度も再生したい」という場面、ありませんか?
私の場合は、以下のようなケースで特定シーンの動作確認をよく行います。
- 有料アセットのサンプルシーンを試したいとき
- テスト用・サンプル用のコードをまとめたシーンを確認したいとき
- 特定のシーンからゲームのサイクルをテストしたいとき
こういった場面で、メニューから一発で特定のシーンを再生できたら便利だなと思い、簡単なEditor拡張のコードを書いてみました。
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
[InitializeOnLoad]
public static class ScenePlayLauncher
{
const string playScenePath = "Assets/TestScene.unity"; // 再生したいシーンファイルパス(Assets/XX/YY/Scene.unity)
const string sessionKey = "ScenePlayLauncher_PreviousScene";
static ScenePlayLauncher()
{
// 再生終了時のイベント登録
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
}
[MenuItem("Tools/QuickStart/Start TestScene")]
public static void PlayMainScene()
{
if (EditorApplication.isPlaying)
{
Debug.LogWarning("すでにPlayモード中です。");
return;
}
// 現在のシーンを保存しておく
string currentScene = SceneManager.GetActiveScene().path;
SessionState.SetString(sessionKey, currentScene);
if (!System.IO.File.Exists(playScenePath))
{
Debug.LogError($"指定されたシーンが見つかりません: {playScenePath}");
return;
}
// 開いて再生準備
EditorApplication.update += StartPlayAfterSceneLoad;
EditorSceneManager.OpenScene(playScenePath);
}
static void StartPlayAfterSceneLoad()
{
if (EditorSceneManager.GetActiveScene().path == playScenePath)
{
EditorApplication.update -= StartPlayAfterSceneLoad;
EditorApplication.isPlaying = true;
}
}
static void OnPlayModeStateChanged(PlayModeStateChange state)
{
// 再生終了時(Editモードに戻る時)
if (state == PlayModeStateChange.EnteredEditMode)
{
string prevScene = SessionState.GetString(sessionKey, null);
SessionState.SetString(sessionKey, string.Empty); // 一度戻したら記録を消しておく
if (!string.IsNullOrEmpty(prevScene) && prevScene != playScenePath)
{
if (System.IO.File.Exists(prevScene))
{
EditorSceneManager.OpenScene(prevScene);
Debug.Log($"元のシーンに戻しました: {prevScene}");
}
else
{
Debug.LogWarning($"元のシーンが見つかりませんでした: {prevScene}");
}
}
}
}
}
このコードでは、今どのシーンを開いていても、メニューの [Tools] → [QuickStart] → [Start TestScene] をクリックするだけで TestScene
を開いて再生できます。
さらに、再生終了後には元々開いていたシーンへ自動で戻ってくれる機能付きです。
私自身は複数のテストシーンを使うことが多いので、PlayMainScene
のようなメソッドをシーンごとに分けて、それぞれメニューに追加するようにしています。
この「シーンを固定して再生開始する」コードといえば、kanさんの記事が有名かな?と思います。
実際、このコードもkanさんの記事を参考にしながら、「自分の用途にはこうした方が使いやすいな」と感じて、少しずつ改良していったものです。
今回は EditorWindow
は使っていないので、ある意味とてもシンプルな実装になっています。
「登録したシーンの数だけメニュー項目が増える」といった仕組みにするのも面白そうですが、もともと自分用ツールと思ってサクッと作ったものなのでご勘弁を…
もし興味がある方がいればぜひ改良して使ってみてくださいー!
コメント