森クマblog

クマゲーム

先頭シーンから再生→停止したら編集中だったシーンに戻ってくるUnityエディター拡張を作った話

ここは森のゲーム開発室・・・

忘れられた技術ブログ・・・

f:id:shakeflower93:20181111141205p:plain

 

Unityを使い始めて1年が経った・・・だいぶ慣れて来たような気もする・・・しかしクマには1つ不満があった・・・それは・・・

 

 

そう、Unityエディタはプレイするとそのとき開いてたシーンから実行される。

そして停止すると、そのとき開いていたシーンが編集状態にになる。

 

これはこれでいいのだクマ、いいのだけど・・・

 

開発中盤以降になってきて、ある程度ゲームができてくると・・・

「トップのシーンから起動したい(初期化とかの関係で)」

「エディタを終了したら、起動前に開いてた編集シーンに戻ってほしい」

という場面が割と出てくるクマ。しかしこれを実現しようとすると・・・

 

編集中のシーンを保存する→

トップのシーンを開く→

エディタを再生する→

どこかの画面でエディタを停止する→

編集中のシーンを再び開く

f:id:shakeflower93:20180809114628p:plain

めんどくさい!!

 

この疑問をTwitterに投げると、様々な知見をいただけたクマ。

(各シーンの起動処理に、タイトル画面に遷移するスクリプトやマクロを仕込んでおくなど。なるほどなるほど・・・!)

 

そしてさらに調べる間にクマは思い当たる・・・

もしかしてUnityエディター拡張でもいけるんじゃ・・・

(自作したことないけど・・・)

f:id:shakeflower93:20180417174042p:plain

やりたいこと。以下を実現できるコマンドを作るックマ。

・どのシーンにいようと、トップシーンから再生したい。

 →Scenes in Buildの先頭シーン(0)の自動取得。任意のシーンからの再生指定。

f:id:shakeflower93:20190205083336p:plain

・停止したら、再生前に編集中だったシーンに戻ってほしい

 →エディタの再生/停止とかのイベントを取得。

 

以下、参考にさせていただいたページですクマ。

 

yuukiacid.hatenablog.com

kan-kikuchi.hatenablog.com

 

 

むむむ・・・

 

むむむむ・・・

f:id:shakeflower93:20181226180037p:plain

できらぁ!!(できそう!!)

 

 

 

 

 

f:id:shakeflower93:20180809113452p:plain

できた。

 

 PlayTopAndBackScene.cs

using UnityEngine;
using UnityEditor;
using UnityEngine.Events;

[InitializeOnLoad]//エディター起動時にコンストラクタが呼ばれるようにするックマ
public class PlayTopAndBackScene : MonoBehaviour {

	/// <summary>
	/// コンストラクタ(InitializeOnLoad属性によりエディター起動時に呼び出されるックマ)
	/// </summary>
	static PlayTopAndBackScene() {

		//エディタの起動状態変化を拾えるplayModeStateChangedイベントにメソッド登録クマ
		// (Memo:PlayFromPrelaunchSceneメソッド内で実行してもイベント取得できなかったのでここでやるクマ)
		EditorApplication.playModeStateChanged += OnChangedPlayMode;

	}


	[MenuItem("Tools/PlayTopAndBackScene %t")]
	/// <summary>
	/// ツールメニューから起動する処理クマ。command+tでショートカットクマ。
	/// </summary>
	public static void PlayFromPrelaunchScene()
	{

		// プレイ中の場合は停止するックマ
		if (EditorApplication.isPlaying == true) {
			EditorApplication.isPlaying = false;
			return;
		}

		// 現在のシーンパスをコンフィグに保存クマ
		EditorUserSettings.SetConfigValue ("prevSceneName", EditorApplication.currentScene);

		// 今開いてるシーンを保存するか聞くックマ
		EditorApplication.SaveCurrentSceneIfUserWantsTo ();

		// 先頭のシーンパスを取得クマ
		string startScenePath = EditorBuildSettings.scenes[0].path;
		EditorApplication.OpenScene (startScenePath);
		EditorApplication.isPlaying = true;

	}

	//プレイモードが変更されたときに呼ばれるクマ
	private static void OnChangedPlayMode(PlayModeStateChange state) {

		if (state == PlayModeStateChange.EnteredEditMode) {
			// 停止したクマ

			string prevSceneName = EditorUserSettings.GetConfigValue ("prevSceneName");
			if (!string.IsNullOrEmpty(prevSceneName)) {
				// 起動前に保存していたシーンを開くックマ!!ヴェルシー!!
				EditorApplication.OpenScene (prevSceneName);
				
				// 現在のシーンパスを初期化(これをしとかないと思わぬ挙動がおこるックマ)
				EditorUserSettings.SetConfigValue ("prevSceneName", "");
			}
		}

	}

}

 

この、ものすごい長いいびつな名前のcsファイルをAssets/Editorフォルダに突っ込み、

[Tools]→[PlayTopAndBackScene]

f:id:shakeflower93:20190205085837p:plain

またはショートカットキーで

[command+t]

すると・・・

 

 

 とはいえ、Unityエディター拡張の経験自体が浅いので、いろんな場面で正しく動くかはわかりませんクマ。エディター拡張に詳しい人やクマやカラスや猫、待ってますクマ!! 

 

[追記]

やりたかったことの全てがここにあったクマ。これを使おう!!

(昨日調べてた時に読んだ気がするのに頭からすぅーっと消えてた)

kan-kikuchi.hatenablog.com

 

今回はエディタのお勉強をしたと思うックマ。