Unity - UI:EventSystem について -
初めに
ユーザーからの入力を受け取り、 UI に対してイベントを送信する EventSystem と呼ばれる UI についてまとめます。
Index
EventSystem とは
EventSystem ユーザーからの入力を受け取り、 UI に対してイベントを送信するためのものです。どの UI が選択されているのか、クリックされたときどのようなイベントを発生させるのかなどを管理しています。
EventSystem についているコンポーネント
EventSystem には、次の2つのコンポーネントがついています。
- EventSystem
- Standalone Input Module
EventSystem コンポーネント
イベントに関するすべての要素を制御します。どの入力モジュールが現在アクティブなのか、どのゲームオブジェクトが現在 “選択されている” かということと、他の高レベルの Event System (イベントシステム) のホストを調整します。
“Update” の度にイベントシステムは呼び出しを受け取り、入力モジュールを検索し、どの 入力モジュールを今回の更新で使用するかを決定します。そして処理をモジュールに委譲します。
First Selected | 最初に選択されたゲームオブジェクト |
---|---|
Send Navigation Event | イベントシステムはナビゲーションのイベント (移動、送信、キャンセル) を有効にするか |
Drag Threshold | ピクセル単位でドラッグするためのソフトエリア |
First Selected、Send Navigation Event は上の説明の通りです。Drag Threshold はクリックとドラッグを区別するための閾値のことです。数値が小さいとマウスが少しずれたらドラッグと判定し、数値が大きいとマウスが少々動いてもクリックと判定してくれます。
Standalone Input Module
入力を受けとってイベントを送信するものです。EventSystem とセットで使用され、InputManager で設定された入力を見て各種イベントを送ります。
Horizontal Axis | 横方向の入力。Input Manager で設定されているボタンの名前を入力する |
---|---|
Vertical Axis | 縦方向の入力。Input Manager で設定されているボタンの名前を入力する |
Submit Button | 送信(決定)の入力。Input Manager で設定されているボタンの名前を入力する |
Cancel Button | キャンセルの入力。Input Manager で設定されているボタンの名前を入力する |
Input Actions Per Second | 1秒間に可能なキーボード、コントローラーの入力数 |
Repeat Delay | 1 秒毎の入力操作が繰り返されるまでの遅延時間 (秒単位) |
Force Module Active | これを有効にすると、この Standalone Input Module を強制的にアクティブにする |
UI がクリックされた判定を取得する
EventSystem を用いると、UI に対し、クリックされた、ドラッグを終了したなどイベントを検出することが可能になります。
イベントの検出の仕方は次の通りです。
まず、スクリプトを用意します。そのスクリプトからインターフェースを継承し、関数を用意します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; //EventSystemを使うため追記 //インターフェイスであるIPointerClickHandlerを継承 public class EventSystemScript : MonoBehaviour, IPointerClickHandler { //クリックされたとき, 呼び出される関数を用意 public void OnPointerClick(PointerEventData data) { Debug.Log("クリックされたで"); } }
このスクリプトを Image につければ ok です。Image をクリックすると Debug.Log が表示されます。
インターフェイス IPointerClickHandler と関数 OnPointerClick については、公式による説明をみれば使い方が分かります。
他のインターフェイスとそれに対応する関数のリストも公式がまとめてくれているので、そちらをご覧ください。
Button で使うとどうなるのか
Button に次のスクリプトをつけて、クリックしてみます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class EventSystemScript : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData data) { Debug.Log("EventSystemからクリックを検知した"); } public void onClick() { Debug.Log("onClickが作動した"); } }
すると、次のように EventSystem による検知と Button の onClick による関数の呼び出しの両方が作動しています。
最後に
EventSystem が便利であることは間違いありません。使えるようになると様々なことに応用ができるでしょう。