いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : uGUIのImageなどのタップイベントを検出

ButtonコンポーネントにはデフォルトでClickイベント検出機能がありますが、Imageとかはどうやって検出するのか。

インスペクタから

EventTriggerコンポーネントを追加します。

f:id:sugar_affordance:20160908100910p:plain

Add New Event Type からイベントを選択すると新規追加できるので、イベントを受け取りたいGameObjectをドラッグアンドドロップ
呼び出したいメソッドをリストから選択します。

f:id:sugar_affordance:20160908100453p:plain

スクリプトの関数だけでなく、各種コンポーネントも直接アクセスできますね。

コードで

インペクタでちまちまやってられん! て場合はコードでいじることもできます。

EventTrigger にコールバックを設定する方法と、IPointerDownHandler などのインターフェースを実装する方法があります。

EventTriggerにコールバックを登録

英語ですが下のサイトでサンプルコードがあったので引用。

answers.unity3d.com

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");
    }
}

docs.unity3d.com

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ではなく上記のインターフェースを実装すればスクロールできます。


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。