この記事でのバージョン
Unity 2017.3.1f1
はじめに
再生開始した時など、エディターの状態が変わった事を知りたい場合に
以前はEditorApplication.playmodeStateChanged というイベントが使えたのですが、
Unity2017以降で非推奨(obsolete)になってしまいました。
warning CS0618: `UnityEditor.EditorApplication.playmodeStateChanged' is obsolete:
`Use EditorApplication.playModeStateChanged and/or EditorApplication.pauseStateChanged'
代わりに追加されたのがplayModeStateChangedとpauseStateChangedで、
今回はこれを使ってみようという記事です!
playModeStateChanged
まず1つ目が再生と停止の変更を知るためのイベント、playModeStateChangedです。
なお、非推奨になったplaymodeStateChangedと似てる(modeのmが大文字に)ので注意が必要です。
実際に使ってみると以下のような感じ。
using UnityEngine; using UnityEditor;//EditorApplicationを使うの必要 [InitializeOnLoad]//エディター起動時にコンストラクタが呼ばれるように public static class PlayModeStateChangedExample { /// <summary> /// コンストラクタ(InitializeOnLoad属性によりエディター起動時に呼び出される) /// </summary> static PlayModeStateChangedExample() { //playModeStateChangedイベントにメソッド登録 EditorApplication.playModeStateChanged += OnChangedPlayMode; } //プレイモードが変更された private static void OnChangedPlayMode(PlayModeStateChange state) { if (state == PlayModeStateChange.ExitingEditMode) { Debug.Log("停止状態の終了開始!(実行ボタンを押した)"); } else if (state == PlayModeStateChange.EnteredPlayMode) { Debug.Log("実行状態になった!"); } else if (state == PlayModeStateChange.ExitingPlayMode) { Debug.Log("実行状態の終了開始!(停止ボタンを押した)"); } else if (state == PlayModeStateChange.EnteredEditMode) { Debug.Log("停止状態になった!"); } } }
非推奨になったplaymodeStateChangedとは違い、PlayModeStateChangeという引数が追加され、
何が起こったのかが、かなり分かりやすくなりました!
ちなみにエディタが再生しているかどうかを知りたい場合は
EditorApplication.isPlayingが使えます。(ボタンを押した瞬間に変わるわけではない)
またエディタが再生しているか or しようとしてるかどうかを知りたい場合は
EditorApplication.isPlayingOrWillChangePlaymodeが使えます。(ボタンを押した瞬間に変わる)
pauseStateChanged
次に2つ目が一時停止の開始と終了を知るためのイベント、pauseStateChangedです。
なお、エディタが実行中であってもなくても同じように動作します。
実際に使ってみると以下のような感じ。
using UnityEngine; using UnityEditor;//EditorApplicationを使うの必要 [InitializeOnLoad]//エディター起動時にコンストラクタが呼ばれるように public static class PlayModeStateChangedExample { /// <summary> /// コンストラクタ(InitializeOnLoad属性によりエディター起動時に呼び出される) /// </summary> static PlayModeStateChangedExample() { //pauseStateChangedイベントにメソッド登録 EditorApplication.pauseStateChanged += LogPauseState; } //停止になった OR 停止が解除された private static void LogPauseState(PauseState state) { if (state == PauseState.Paused) { Debug.Log("一時停止!"); } else if (state == PauseState.Unpaused) { Debug.Log("一時停止解除!"); } } }
これも非推奨になったplaymodeStateChangedとは違い、PauseStateという引数が追加され、
何が起こったのかが、かなり分かりやすくなりました!
ちなみにエディタが一時停止しているかどうかを知りたい場合は
EditorApplication.isPausedが使えます。