経緯
Create -> UI Toolkit -> Editor Windowで生成されたコードでCreateGUI()が使われていた
いろいろな記事を見ているとCreateGUI()とOnGUI()の使い方が似ていたので調べてみた
ドキュメントを読んでも、使い方が全く一緒だった
- CreateGUI
https://docs.unity3d.com/ja/2021.3/ScriptReference/EditorWindow.CreateGUI.html - OnGUI
https://docs.unity3d.com/ja/2021.3/ScriptReference/EditorWindow.OnGUI.html
結論
それぞれ呼ばれるタイミングが違う
0. ウィンドウを開く
1. Reset()
2. Awake()
3. OnEnable()
4. CreateGUI()
5. OnGUI(), Update() ※繰り返し
OnGUI()とUpdate()の呼ばれる順番を完全に特定することが出来なかったが、Unityのライフサイクルやログを出してみた結果、Update() -> OnGUI()の順番で呼ばれているようだった
注意
CreateGUI()の呼ばれるタイミング
https://forum.unity.com/threads/custom-editorwindow-creategui-called-before-awake-onenable-when-opening-project.1085909/
上記フォーラムで、Unity起動時に最初からウィンドウを開いていた時と、手動でウィンドウを開いた時でAwake, OnEnable, CreateGUIの呼ばれる順番が違うという報告がある
CreateGUIよりもAwake, OnEnableの方が早く呼ばれるという前提でコードを書かないほうがいい
OnGUI()の呼ばれるタイミング
OnGUI()は毎フレーム呼ばれるわけじゃない
マウスをホバーしたときや、キーボードを操作したときなど、何かイベントがあった時のみ呼び出されていた
これはおそらくほとんどのOnGUI()呼び出しはGUIView.Repaint()内から行われているからだと推測している
(GUIView.RepaintはMethodImplになっており、先が読めなかった)
一般的にOnGUI()を毎フレーム呼び出したい需要は少ないはずなので、もし毎フレーム呼び出したかったらUpdate()のなかでRepaint()を呼ぶこと
ちなみに、OnGUI()の回数を減らしたかったらEditorWindow.wantsLessLayoutEventsをtrueにするといい
Time.framecountは使わないほうがいい
再生モードの時、Time.framecountは期待通りの挙動をする
毎フレームインクリメントされ、一時停止するとインクリメントがストップする
しかし、再生モードでないとき、Update()は毎フレーム呼ばれているのに、Time.framecountはインクリメントのタイミングが変わる
正確なタイミングは分からないが、入力(マウスやキーボードのイベント)があった時にインクリメントされているようだった