GUIイベント
GUI イベントの通知
ゲームが能動的に描画しているフレームとは別に、ユーザーとの対話のために実行される工程を Unity では GUI イベントと呼んでいます。GUI (Graphical User Interface)とは、一般には Windows や Mac OS X などで見られる、グラフィカルなソフトウェアの操作環境を意味します。Unity においてはボタンやスライダー、ユーザーと対話するための部品を指して GUI と呼びます。
Unity はボタンやスライダー、テキスト入力など、ゲームの描画とは分離してユーザーと対話するための GUI を提供します。例えば、ゲームの設定画面は簡単なボタン選択やスライダーが中心で実現できるものがほとんどなので GUI を用いることで簡単に実装できます。
ボタンやスライダーなどの GUI の描画や、ボタンを押すなど GUI への入力を感知すると Unity エンジンはスクリプトの OnGUI() メソッドを呼び出します。これは Start() メソッドや Update() メソッドと同様に、定められたイベントが発生するとエンジンによって呼び出されるハンドラです。
void OnGUI()
Update() メソッドはゲーム画面となるフレームを更新するたびに定期的に呼び出されましたが、OnGUI() メソッドは GUI イベントが発生したときに呼び出されるという約束なので Update() メソッドに比べると不定期に呼び出されますが、通常はフレームごとに数回呼び出されます。
OnGUI() メソッドが、どのような GUI イベントによって呼び出されているのかは UnityEngine.Event クラスから得られます。
public sealed class Event
通常、スクリプト内で Event クラスのインスタンスを生成する必要はありません。OnGUI() メソッドが呼び出されている間、このクラスの静的な current プロパティに現在のイベント情報を格納する Event オブジェクトが格納されています。
public static Event current { get; set; }
発生しているイベントの種類は type プロパティから取得できます。
public EventType type { get; set; }
このプロパティは UnityEngine.EventType 列挙型のいずれかの値です。
public enum EventType
EventType 列挙型は OnGUI() メソッドの呼び出しの要因となっている GUI イベントの種類を表します。この列挙型のメンバは以下の表のようなものがあります。
メンバ | 意味 |
---|---|
MouseDown | マウスボタンが押された |
MouseUp | マウスボタンが離された |
MouseMove | マウスが移動した(エディタのみ) |
MouseDrag | マウスがドラッグされた |
KeyDown | キーボードのキーが押された |
KeyUp | キーボードのキーが離された |
ScrollWheel | スクロール用のホイールが回された |
Repaint | 再描画イベント |
Layout | レイアウトの更新イベント |
DragUpdated | ドラッグ&ドロップ操作の更新(エディタのみ) |
DragPerform | ドラッグ&ドロップ操作の実行(エディタのみ |
DragExited | ドラッグ&ドロップ操作の終了(エディタのみ |
Ignore | イベントを無視する |
Used | 既に処理されたイベント |
ValidateCommand | 特殊コマンド(コピー&ペーストなど)を検証する |
ExecuteCommand | 特殊コマンド(コピー&ペーストなど)を実行する |
ContextClick | 右クリックされた |
ボタンなどの GUI も、他のゲームオブジェクトと同様にフレームごとに描画されます。そのため、少なくともフレーム毎に Layout イベントと Repaint イベントが発生します。
using UnityEngine; public class Test : MonoBehaviour { void Update() { print("Update"); } void OnGUI() { print("OnGUI Type=" + Event.current.type); } }
コード1は Update() メソッドと OnGUI() メソッドを宣言し、それぞれ print() メソッドを用いて文字列を出力しています。実行結果のように Unity のコンソールを見れば Update() メソッドと GUI の画面更新イベントが交互に発生することが確認できます。