2
1

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 1 year has passed since last update.

【Unity】EditorWindowのCreateGUI()とOnGUI()は何が違うか

Last updated at Posted at 2023-08-03

経緯

Create -> UI Toolkit -> Editor Windowで生成されたコードでCreateGUI()が使われていた
image.png
image.png

いろいろな記事を見ているとCreateGUI()とOnGUI()の使い方が似ていたので調べてみた

ドキュメントを読んでも、使い方が全く一緒だった

結論

それぞれ呼ばれるタイミングが違う

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はインクリメントのタイミングが変わる
正確なタイミングは分からないが、入力(マウスやキーボードのイベント)があった時にインクリメントされているようだった

2
1
1

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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?