ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - UI:EventSystem について -

初めに

 ユーザーからの入力を受け取り、 UI に対してイベントを送信する EventSystem と呼ばれる UI についてまとめます。

EventSystem とは

 EventSystem ユーザーからの入力を受け取り、 UI に対してイベントを送信するためのものです。どの UI が選択されているのか、クリックされたときどのようなイベントを発生させるのかなどを管理しています。

docs.unity3d.com

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 はクリックとドラッグを区別するための閾値のことです。数値が小さいとマウスが少しずれたらドラッグと判定し、数値が大きいとマウスが少々動いてもクリックと判定してくれます。

docs.unity3d.com

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 を強制的にアクティブにする

docs.unity3d.com

UI がクリックされた判定を取得する

 EventSystem を用いると、UI に対し、クリックされた、ドラッグを終了したなどイベントを検出することが可能になります。
 イベントの検出の仕方は次の通りです。

(イベントの検出の仕方)

 今回は、Image がクリックされたことを検出してみます。

 まず、スクリプトを用意します。そのスクリプトからインターフェースを継承し、関数を用意します。

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 については、公式による説明をみれば使い方が分かります。

docs.unity3d.com

 他のインターフェイスとそれに対応する関数のリストも公式がまとめてくれているので、そちらをご覧ください。

docs.unity3d.com

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 が便利であることは間違いありません。使えるようになると様々なことに応用ができるでしょう。