(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


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


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

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


はじめに


------------追記

Unity2017以降では仕様が変わったので、以下の記事をご覧ください。


------------追記おわり


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

EditorApplication.PlaymodeStateChangeというデリゲートが使えます。


http://docs.unity3d.com/ja/current/ScriptReference/EditorApplication-playmodeStateChanged.html


以下のようにPlaymodeStateChangeにメソッドを登録することで、

エディターの状態が変わった時に実行されるようになります

EditorApplication.playmodeStateChanged += OnPlayModeStateChanged;

//Playmodeの状態が変わった時に実行される
private static void OnPlayModeStateChanged (){

}


しかし、どのような状態に変わったかを直接知る事は出来ません。


ちなみに、playmodeStateChangedが呼ばれるのは以下の時です。

  • 再生ボタンを押した時
  • 再生が実際に始まった時
  • 一時停止した時(再生していなくても)
  • 一時停止解除した時(再生していなくても)
  • 再生終了ボタンを押した時
  • 再生が実際に終わった時
  • Stepボタンを押した時(再生している時だけ)


ようはエディタ中央上部のボタンを押した時に呼ばれる感じですね。


f:id:kan_kikuchi:20160526133839p:plain


ちなみにボタンを押した時と同じ処理をスクリプトから行った場合も呼ばれます。





状態判定

どの状態になったかの判定は、EditorApplicationのいくつかの変数を見る事で行えます。

詳しい判定方法は下記のPlaymodeStateObserver.csを参照の事。


EditorApplication.isPlaying

エディタが再生しているかどうか。

ただし、ボタンを押した瞬間に変わるわけではない。


EditorApplication.isPlayingOrWillChangePlaymode

エディタが再生しているか or しようとしてるかどうか。

EditorApplication.isPlayingのボタンを押した瞬間に変わるバージョンです。


EditorApplication.isPaused

ポーズ中かどうか。

ボタンを押した瞬間に状態が変わります。


PlaymodeStateObserver

上記の変数を利用してエディタの状態を監視するクラス 、PlaymodeStateObserver

を作ったので、こちらもご紹介!



これを使えば、特定の状態になった時だけイベント取得みたいな事が簡単に出来ます!

例えばエディタの終了ボタンを押した時と実際に終了した時のイベントを取ると以下のような感じ。

PlaymodeStateObserver.OnPressedEndButton += ()=>{
  Debug.Log("終了ボタン押した!");
}; 
PlaymodeStateObserver.OnEnded += ()=>{
  Debug.Log("終了した!");
};

f:id:kan_kikuchi:20160530134519g:plain


なお、PlaymodeStateObserverにはInitializeOnLoad属性を付加しているため、

エディター起動時にコンストラクタが呼ばれ、playmodeStateChangedにメソッドが登録されるので、

特に何もせずとも使う事が出来ます。


おわりに

各状態に変わった事を取得したいだけなの、すごいめんどうな事をしてた感……。

もしかしたら他に楽な方法があるのかもしれません(:3っ)∋〜