11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EditorWindowのOnGUIを好き勝手呼び出す

Posted at

とは言ったものの、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'が凄い勢いで回っていきます。
スクリーンショット 2015-01-04 11.05.36.png

ただ、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を更新したい!」なんて状況で使えるかもしれません。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?