WisdomSoft - for your serial experiences.

GUIイベント

ユーザーと対話する GUI に関連したイベントが発生すると OnGUI() メソッドが呼び出されます。OnGUI() メソッドを実装することで、スクリプトで GUI を制御できます。

GUI イベントの通知

ゲームが能動的に描画しているフレームとは別に、ユーザーとの対話のために実行される工程を Unity では GUI イベントと呼んでいます。GUI (Graphical User Interface)とは、一般には Windows や Mac OS X などで見られる、グラフィカルなソフトウェアの操作環境を意味します。Unity においてはボタンやスライダー、ユーザーと対話するための部品を指して GUI と呼びます。

Unity はボタンやスライダー、テキスト入力など、ゲームの描画とは分離してユーザーと対話するための GUI を提供します。例えば、ゲームの設定画面は簡単なボタン選択やスライダーが中心で実現できるものがほとんどなので GUI を用いることで簡単に実装できます。

ボタンやスライダーなどの GUI の描画や、ボタンを押すなど GUI への入力を感知すると Unity エンジンはスクリプトの OnGUI() メソッドを呼び出します。これは Start() メソッドや Update() メソッドと同様に、定められたイベントが発生するとエンジンによって呼び出されるハンドラです。

OnGUI() メソッド
void OnGUI()

Update() メソッドはゲーム画面となるフレームを更新するたびに定期的に呼び出されましたが、OnGUI() メソッドは GUI イベントが発生したときに呼び出されるという約束なので Update() メソッドに比べると不定期に呼び出されますが、通常はフレームごとに数回呼び出されます。

OnGUI() メソッドが、どのような GUI イベントによって呼び出されているのかは UnityEngine.Event クラスから得られます。 

UnityEngine.Event クラス
public sealed class Event

通常、スクリプト内で Event クラスのインスタンスを生成する必要はありません。OnGUI() メソッドが呼び出されている間、このクラスの静的な current プロパティに現在のイベント情報を格納する Event オブジェクトが格納されています。

Event クラス current プロパティ
public static Event current { get; set; }

発生しているイベントの種類は type プロパティから取得できます。

Event クラス type プロパティ
public EventType type { get; set; }

このプロパティは UnityEngine.EventType 列挙型のいずれかの値です。

Event クラス type プロパティ
public enum EventType

EventType 列挙型は OnGUI() メソッドの呼び出しの要因となっている GUI イベントの種類を表します。この列挙型のメンバは以下の表のようなものがあります。

表1 EventType 列挙型のメンバ
メンバ 意味
MouseDown マウスボタンが押された
MouseUp マウスボタンが離された
MouseMove マウスが移動した(エディタのみ)
MouseDrag マウスがドラッグされた
KeyDown キーボードのキーが押された
KeyUp キーボードのキーが離された
ScrollWheel スクロール用のホイールが回された
Repaint 再描画イベント
Layout レイアウトの更新イベント
DragUpdated ドラッグ&ドロップ操作の更新(エディタのみ)
DragPerform ドラッグ&ドロップ操作の実行(エディタのみ
DragExited ドラッグ&ドロップ操作の終了(エディタのみ
Ignore イベントを無視する
Used 既に処理されたイベント
ValidateCommand 特殊コマンド(コピー&ペーストなど)を検証する
ExecuteCommand 特殊コマンド(コピー&ペーストなど)を実行する
ContextClick 右クリックされた

ボタンなどの GUI も、他のゲームオブジェクトと同様にフレームごとに描画されます。そのため、少なくともフレーム毎に Layout イベントと Repaint イベントが発生します。 

コード1
using UnityEngine;

public class Test : MonoBehaviour
{
	void Update()
	{
		print("Update");
	}
	
	void OnGUI()
	{
		print("OnGUI Type=" + Event.current.type);
	}
}
実行結果
コード1 実行結果

コード1は Update() メソッドと OnGUI() メソッドを宣言し、それぞれ print() メソッドを用いて文字列を出力しています。実行結果のように Unity のコンソールを見れば Update() メソッドと GUI の画面更新イベントが交互に発生することが確認できます。