この記事でのバージョン
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ボタンを押した時(再生している時だけ)
ようはエディタ中央上部のボタンを押した時に呼ばれる感じですね。
ちなみにボタンを押した時と同じ処理をスクリプトから行った場合も呼ばれます。
状態判定
どの状態になったかの判定は、EditorApplicationのいくつかの変数を見る事で行えます。
詳しい判定方法は下記のPlaymodeStateObserver.csを参照の事。
EditorApplication.isPlaying
エディタが再生しているかどうか。
ただし、ボタンを押した瞬間に変わるわけではない。
EditorApplication.isPlayingOrWillChangePlaymode
エディタが再生しているか or しようとしてるかどうか。
EditorApplication.isPlayingのボタンを押した瞬間に変わるバージョンです。
EditorApplication.isPaused
ポーズ中かどうか。
ボタンを押した瞬間に状態が変わります。
PlaymodeStateObserver
上記の変数を利用してエディタの状態を監視するクラス 、PlaymodeStateObserver
を作ったので、こちらもご紹介!
これを使えば、特定の状態になった時だけイベント取得みたいな事が簡単に出来ます!
例えばエディタの終了ボタンを押した時と実際に終了した時のイベントを取ると以下のような感じ。
PlaymodeStateObserver.OnPressedEndButton += ()=>{ Debug.Log("終了ボタン押した!"); }; PlaymodeStateObserver.OnEnded += ()=>{ Debug.Log("終了した!"); };
なお、PlaymodeStateObserverにはInitializeOnLoad属性を付加しているため、
エディター起動時にコンストラクタが呼ばれ、playmodeStateChangedにメソッドが登録されるので、
特に何もせずとも使う事が出来ます。
おわりに
各状態に変わった事を取得したいだけなの、すごいめんどうな事をしてた感……。
もしかしたら他に楽な方法があるのかもしれません(:3っ)∋〜