この記事ではUnityのコンポーネントEvent Systemについて解説しています。
<Event Systemとは>
ユーザーからの入力(タップやキーボードやコントローラー)を受け取って、各種UIに対してレイキャスト、イベント送信を処理するコンポーネントです。
そのため、このコンポーネントがシーン上で有効になっていないとUGUIが反応しません。
また、シーン上に同時に有効になれるEvent Systemは1つだけで、複数Event Systemが存在している場合片方が無効になります。どれが有効になるかはランダムなので複数Event Systemを置かないようにしましょう。
UnityのメニューからEvent Systemを作成した時に一緒に作成されるStandaloneInputModuleについては↓の記事で解説しています。また、EventSystemが有効でもGraphic Raycasterが切れていたらUGUIは反応しないのでそちらの記事も載せておきます。
<Event Systemのインスペクター>
First Selected
開始時に選択状態にするゲームオブジェクトを設定します。
ここに設定されたゲームオブジェクトはこのシーン起動時に最初から選択状態になります。
Send Navigation Events
trueにすると、キーボードやゲームコントローラーを操作した時に発生するナビゲーションイベントを送信します。
Drag Threshold
ドラッグを開始したとみなす移動距離をピクセル単位で設定します。
<EventSystemのスクリプトの使い方>
名前空間 | UnityEngine.EventSystems |
型 | class |
継承 | EventSystems.UIBehaviour |
デフォルトの状態から使用するには
using UnityEngine.EventSystems;
と記述するか
UnityEngine.EventSystems.EventSystem
とする必要があります。
current
現在のイベントシステムを返します。
型 EventSystem型
○ 使い方
イベントシステムを取得する事ができるので、UIの挙動を止めたり動かしたりといった制御する際に便利です。
//現在のイベントシステムを取得します。 EventSystem ev = EventSystem.current;
alreadySelecting
ゲームオブジェクトが選択状態になっている場合にtrueを返します。
読み取り専用です。
型 bool型
○ 使い方
何かを選択している状態ならという条件のif文を書く時などに使います。
//何か選択状態になっているかを取得します。 EventSystem ev = EventSystem.current; if(ev.alreadySelecting) { Debug.Log("何かを選択しています"); }
currentInputModule
現在アクティブなインプットモジュールを返します。
EventSystemを作成した時に付いてくるStandalone Input Moduleを返す事が多いと思います。
読み取り専用です。
型 BaseInputModule型
○ 使い方
現在アクティブなインプットモジュールを取得したい場合に使用します。インプットモジュールを操作して入力を制御したい場合などに使用します。
//現在のインプットモジュールを取得します。 EventSystem ev = EventSystem.current; BaseInputModule bm = ev.currentInputModule;
currentSelectedGameObject
現在選択されているゲームオブジェクトを返します。
読み取り専用です。
型 GameObject型
○ 使い方
現在選択されているゲームオブジェクトを取得したい場合に使用します。選択されたオブジェクトで演出を行いたい場合や、選択したオブジェクトのタグを見て条件判定をするなど色々な使い方ができます。
//現在選択されているゲームオブジェクトを取得します。 private void Update() { EventSystem ev = EventSystem.current; GameObject g = g.currentSelectedGameObject; }
firstSelectedGameObject
開始時に選択状態にするゲームオブジェクトを設定します。
型 GameObject型
○ 使い方
例えば、カーソルでボタンを選択するゲームで、一番上のボタンを最初から選択状態にしたいとか、初期状態で選択状態にしたいものが存在する場合に使用します。
//最初に選択状態にしたいオブジェクトを設定します。 private void Awake() { EventSystem ev = EventSystem.current; ev.firstSelectedGameObject = gameObject; }
pixelDragThreshold
ドラッグを開始したとみなす移動距離をピクセル単位で設定します。
型 int型
○ 使い方
インスペクターで設定できるため、正直スクリプトからこの値を動的に変えることはほぼないと思います。エディタ拡張で専用のイベントシステムをワンボタンで作成できるようにする場合などでしょうか。
//ドラッグのしきい値を調整します。 EventSystem ev = EventSystem.current; ev.pixelDragThreshold = 1;
sendNavigationEvents
trueの場合、発生するナビゲーションイベント(移動、送信、キャンセル)を送信します。
型 bool型
○ 使い方
自分でtrueにしても起こっているイベントが無いと意味が無いので、基本的に読み取りで使う事がほとんどかと思います。イベントが送信されたら何かを行いたい時に使用します。
//イベントが送信を取得します。 EventSystem ev = EventSystem.current; if(ev.sendNavigationEvents) { Debug.Log("何かイベントが送信されました"); }
IsPointerOverGameObject
UIをタップもしくはクリックしたかです。
なし
ポインターID : int型
UIをタップもしくはクリックしたか : bool型
○ 使い方
UIをタップもしくはクリックしたかを取得したい場合に使用します。また、ポインターIDを引数に持てるため、マルチタップされてしまった場合でも最初に押したものがUIにヒットしているかどうかを取得できます。
//1番目のタップがUIにヒットしていたかどうかを判別します。 EventSystem ev = EventSystem.current; if(ev.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) { Debug.Log("同時タップされても一番目のタップを拾えます"); }
RaycastAll
レイキャストを打ってヒットしたもの全てを返します。
1. レイキャストを放つポインターのデータ : EventSystems.PointerEventData型
2. レイキャストが当たったものの結果 : List<RaycastResult>型
引数が参照型の為、引数に結果が返ってきます。
なし
○ 使い方
貫通して複数のUIを取得したい場合や、マルチタップした場合などで使用します。
//using UnityEngine.EventSystems; と記述 //現在のマウスの位置からレイキャストを撃ってヒットしたものを取得します。 EventSystem ev = EventSystem.current; PointerEventData ped = new PointerEventData(ev); ped.position = Input.mousePosition; List<RaycastResult> rr = new List<RaycastResult>(); ev.RaycastAll(ped,rr);//結果はrrの中に入っています。
SetSelectedGameObject
対象のゲームオブジェクトを現在選択中にします。
対象にしたいゲームオブジェクト : GameObject型
対象にしたいゲームオブジェクト : GameObject型
イベントデータ : BaseEventData型
なし
○ 使い方
ゲームオブジェクトを選択中にしたい場合などに使用します。
//ボタンが押された時この関数を呼ぶように設定した場合 public void BtnClick(BaseEventData data) { //ボタンを押されたら自分自身が選択中のオブジェクトになるようにします。 EventSystem ev = EventSystem.current; ev.SetSelectedGameObject(gameObject,data); }
UpdateModules
BaseInputModulesの内部リストを再計算します。
なし
なし
○ 使い方
入力の状態をもう一度再計算して正しくします。UIの状態を変更して、直ちに状態を取得したい場合などに使用します。
//インプットモジュールの状態をアップデートします。 EventSystem ev = EventSystem.current; ev.UpdateModules();
OnDisable
このオブジェクトを破棄します。もしくは任意なクリーンアップのコードを実行したときに呼び出されます。
なし
なし
○ 使い方
自分から呼ぶ出すことはほぼ無いかと思います。継承先のスクリプトでオブジェクトがクリーンアップされた際の処理を書く事が主な使い道だと思います。
//EventSystemを継承している場合 protected override void OnDisable() { base.OnDisable(); Debug.Log("オブジェクトが破棄されました"); }