(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

再生開始や一時停止など、エディタの状態変更を取得(Unity2017版)【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2017.3.1f1


はじめに

再生開始した時など、エディターの状態が変わった事を知りたい場合に

以前はEditorApplication.playmodeStateChanged というイベントが使えたのですが、



Unity2017以降で非推奨(obsolete)になってしまいました。

warning CS0618: `UnityEditor.EditorApplication.playmodeStateChanged' is obsolete: 
`Use EditorApplication.playModeStateChanged and/or EditorApplication.pauseStateChanged'


代わりに追加されたのがplayModeStateChangedとpauseStateChangedで、

今回はこれを使ってみようという記事です!


f:id:kan_kikuchi:20180304104227g:plain


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("停止状態になった!");
    }

  }

}

f:id:kan_kikuchi:20180304102517g:plain


非推奨になった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("一時停止解除!");
    }

  }

}

f:id:kan_kikuchi:20180304103510g:plain


これも非推奨になったplaymodeStateChangedとは違い、PauseStateという引数が追加され、

何が起こったのかが、かなり分かりやすくなりました!


ちなみにエディタが一時停止しているかどうかを知りたい場合は

EditorApplication.isPausedが使えます。