とは言ったものの、void Update() { OnGUI(); }
のように直接呼び出すことはできません。
Repaintメソッドを使う
一番簡単なOnGUIの呼び出し方としては、EditorWindow.Repaintメソッドを呼び出す事だと思います。
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
public class FrameCountWindow : EditorWindow
{
[MenuItem("Window/FrameCountWindow")]
public static void OpenWindow()
{
GetWindow<FrameCountWindow>();
}
void OnGUI ()
{
EditorGUILayout.LabelField ("Frame: " + Time.frameCount);
}
// 毎フレーム更新
void Update()
{
Repaint();
}
}
#endif
メニューバーからFrameCountWindowを開けます。
Playすると、下の画像の'Frame: xxx'が凄い勢いで回っていきます。
ただ、Repaintした瞬間に再描画が行われるわけではないでしょうね。
OnGUIの呼び出し自体は普通のフローで行われているでしょう。きっと。
イベントを発行する
Repaintメソッドを使わない方法としては、自分でEditorWindowに対して再描画関係のイベントを発行する、というものがあります。
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
public class FrameCountWindow : EditorWindow
{
[MenuItem("Window/FrameCountWindow")]
public static void OpenWindow()
{
GetWindow<FrameCountWindow>();
}
void OnGUI ()
{
EditorGUILayout.LabelField ("Frame: " + Time.frameCount);
Debug.Log(Event.current.commandName);
}
// 毎フレーム更新
void Update()
{
var editorEvent = EditorGUIUtility.CommandEvent("Count" + Time.frameCount);
editorEvent.type = EventType.Used;
SendEvent(editorEvent);
}
}
#endif
上記の例では、EditorGUIUtility.CommandEventメソッドでイベントを作成し、そのイベントを自身にSendEventして投げ込んでいます。
EditorGUIUtility.CommandEventメソッドの引数の文字列については、何でも大丈夫です。
この文字列は、OnGUIメソッド内ではEvent.current.commandName
で取り出すことができます。
editorEvent.type = EventType.Used;
で設定しているEventTypeについては、ものによってはOnGUIが呼ばれない事がある点に注意して下さい。
またこの方法も、あくまでイベントを発行しているだけであり、SendEventした瞬間にOnGUIが呼ばれているわけではありません。きっと。
おわり
今回は、EditorWindow内で自身を再描画するという処理だったので、あんまりありがたみの無いサンプルになってしまいましたね。
ただ、EditorWindow.RepaintとEditorWindow.SendEventは共にpublicなメソッドなので、どこからでも呼び出すことができます。
「エディタでPlay中にリアルタイムでEditorWindowを更新したい!」なんて状況で使えるかもしれません。