ButtonコンポーネントにはデフォルトでClickイベント検出機能がありますが、Imageとかはどうやって検出するのか。
インスペクタから
EventTriggerコンポーネントを追加します。
Add New Event Type からイベントを選択すると新規追加できるので、イベントを受け取りたいGameObjectをドラッグアンドドロップ。
呼び出したいメソッドをリストから選択します。
スクリプトの関数だけでなく、各種コンポーネントも直接アクセスできますね。
コードで
インペクタでちまちまやってられん! て場合はコードでいじることもできます。
EventTrigger にコールバックを設定する方法と、IPointerDownHandler などのインターフェースを実装する方法があります。
EventTriggerにコールバックを登録
英語ですが下のサイトでサンプルコードがあったので引用。
EventTrigger.Entryクラスのインスタンスを生成し、検出したいイベントの種類をeventIDプロパティに設定します。(EventTriggerType型)
検出時に呼び出したいメソッドは、callbackプロパティのAddメソッドで追加します。
インスタンスをEventTriggerのtriggerプロパティにAddしてやれば完成です。
using UnityEngine.EventSystems; を加えるのを忘れずに。
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections; public class ClickDetector : MonoBehaviour { [SerializeField] Image ClickImage; void Start () { EventTrigger trigger = ClickImage.GetComponent<EventTrigger> (); EventTrigger.Entry entry = new EventTrigger.Entry (); // なんのイベントを検出するか entry.eventID = EventTriggerType.PointerClick; // コールバック登録 entry.callback.AddListener(Clicked); // EventTriggerに追加 trigger.triggers.Add(entry); } void Clicked(BaseEventData eventData) { Debug.Log ("Clicked"); } }
IPointerDownHandler インターフェースを実装する
IPointerDownHandler の他にも IPointerUpHandler、IDragHandler とかいろいろあります。
EventSystems.IPointerDownHandler - Unity スクリプトリファレンス
IPointerDownHandler を実装する場合は IPointerUpHandler も同時に実装する必要がある ので注意。
using UnityEngine; using UnityEngine.EventSystems; public class ClickDetector : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { public void OnPointerDown(PointerEventData eventData) { // ボタンが押された } public void OnPointerUp(PointerEventData eventData) { // ボタンが離された } }
EventTriggerと併用するのがいいと思います。
というのもEventTriggerは後ろの要素に イベントが伝播しない ため、
例えばスクロールできるリストビュー内のセルにEventTriggerをつけると、セルを押してそのままドラッグという操作ができないです。
そういう場合はセルに対してEventTriggerではなく上記のインターフェースを実装すればスクロールできます。