太郎Work

Unityとかで困ったこと等を残しておきます

UnityEditor再生開始時のイベント取得

UnityEditor再生時のイベント

実行、非実行時でモデルプレビュー出来るツールを作成しているのですが、再生時にモデルを一旦リセットして再生成するスクリプトを作成したい

ということでこんなスクリプトを書くと

f:id:tarowork:20160301174309p:plain

ここのボタンを押す度にOnPlayModeStateChangedメソッドが呼ばれるようになります

void OnEnable ()
{
    EditorApplication.playmodeStateChanged += OnPlayModeStateChanged;
}
void OnDisable ()
{
    EditorApplication.playmodeStateChanged -= OnPlayModeStateChanged;
}
void OnPlayModeStateChanged ()
{
    Debug.Log("Changed");
}

ここで問題なのが思っているよりも多くこのイベントが発行されるということです しかし、このメソッド内で

EditorApplication.isPlaying

EditorApplication.isPlayingOrWillChangePlaymode

の値を見るとより詳細なStateが確認できます

  1. 再生ボタン押下
  2. OnChanged : isPlaying=false, isPlayingOrWillChangePlaymode=true ※このタイミングで生成すると実行開始時にCleanupエラーが出る
  3. 開始するまで少し待つあれ 実行ログ出力開始
  4. OnChanged : isPlaying=true, isPlayingOrWillChangePlaymode=true ※実行開始、生成すると通常通り動作する
  5. 停止ボタン押下
  6. OnChanged : isPlaying=true, isPlayingOrWillChangePlaymode=false ※停止開始、生成するとあれ
  7. 完全停止待つ
  8. OnChanged : isPlaying=false, isPlayingOrWillChangePlaymode=false ※完全停止Editorの挙動開始

つまりisPlaying==isPlayingOrWillChangePlaymodeを見ることで実行、Editorに完全移行したかどうかが取れ、逆の場合は遷移する直前の処理が書けます

このままだとPauseボタンでも呼ばれてしまうので上記の条件が一致したらフラグを立てておくことでPauseを無視することができます でもOnDisableとOnEnableだけで上手く頑張れば出来るっぽい雰囲気 とりあえずこのプロパティと組み合わせれば厳密にStateを取れたという感じ

gist.github.com