(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


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


エディタを再生していない時にExecuteAlways(ExecuteInEditMode)でUpdateを実行し続ける方法【Unity】【エディタ拡張】


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



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


はじめに

UnityではExecuteAlways(ExecuteInEditMode)を使う事で

エディタが再生していない時でもAwakeやUpdate等のメソッドが実行出来ます。


ただし、Update等の更新処理はSceneに変化があった時(クリックしたとか)に実行されません。

[ExecuteInEditMode]//Awake等がUnityエディタを再生していなくても実行されるように
public class Sample : MonoBehaviour {

  //=================================================================================
  //初期化
  //=================================================================================

  private void Awake() {
    Debug.Log($"Awake");
  }

  private void Start() {
    Debug.Log($"Start");
  }

  //=================================================================================
  //更新
  //=================================================================================

  private void Update() {
    Debug.Log($"Update");
  }

}


今回はそんな更新処理を何もせずとも実行させ続ける方法の紹介です!


Updateを実行し続ける方法

さっそく方法の紹介ですが、今回はOnRenderObjectという

Sceneがレンダリングした後に呼び出されメソッドを使います。



このOnRenderObjectでEditorApplication.QueuePlayerLoopUpdateという

更新処理を強制的に行うメソッドを実行する事でUpdateを実行し続ける感じです。



なお、Sceneの更新もしたい場合は同時にSceneView.RepaintAllを実行します。


具体的には以下のような感じに。

using UnityEditor;//EditorApplicationやSceneViewを使うのに必要
[ExecuteInEditMode]//Awake等がUnityエディタを再生していなくても実行されるように
public class Sample : MonoBehaviour {

  //=================================================================================
  //初期化
  //=================================================================================

  private void Awake() {
    Debug.Log($"Awake");
  }

  private void Start() {
    Debug.Log($"Start");
  }

  //=================================================================================
  //更新
  //=================================================================================

  //Sceneがレンダリングした後に呼び出される
  private void OnRenderObject() {
    //Update等の更新処理を実行させる
    EditorApplication.QueuePlayerLoopUpdate();

    //Sceneの描画更新
    SceneView.RepaintAll();
  }
  
  private void Update() {
    Debug.Log($"Update");
  }

}



参考