[Unity] メニューから特定のシーンを起動する方法

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 は使っていないので、ある意味とてもシンプルな実装になっています。
「登録したシーンの数だけメニュー項目が増える」といった仕組みにするのも面白そうですが、もともと自分用ツールと思ってサクッと作ったものなのでご勘弁を…

もし興味がある方がいればぜひ改良して使ってみてくださいー!

コメント

タイトルとURLをコピーしました