ぱふの自由帳

週2更新目指す技術ブログ。メインはUnity。最近、競プロ始めましたー!良ければフォローお願いします(`・ω・´)

【Unity】EventTriggerを使ったらScrollViewが機能しなかった話

はじめに

Unityのデフォルト機能であるScrollViewを使っているときに下のような問題にぶち当たりました。

  • ButtonだとScrollViewは動く
  • EventTriggerをアタッチしたオブジェクトだとScrollViewが動かなくなる

参考GIF↓↓↓(Button以外はEventTriggerがアタッチされています) f:id:PafuOfDuck:20180818214959g:plain

Buttonはイベントの発行タイミングをイジれないので使いたくない...。
なので、EventTriggerを使いたいのに...こんなのヒドい!

となりまして、解決したのでメモを残しておきます〜。

代替案

Unityの内部を理解していないので詳しくは分かりませんが、あるオブジェクトAにEventTriggerを使ってしまうとAの上ではScrollViewのスクロールが無効化(当たり判定が貫通しなくなる?)されるようです。

そこで、EventTriggerと同じ機能を自前で実装することで解決します。
(おそらく、厳密には同じではないです。同じだとScrollViewが機能しませんから笑)

実装

今回は例として、EventTriggerのPointer Clickと同じ機能をつけたいと思います。

以下のスクリプトを実装して、EventTriggerの代わりにアタッチしましょう。

using UnityEngine;
using UnityEngine.EventSystems;

public class ContentClickListener : MonoBehaviour, IPointerClickHandler {
    
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("クリックされたよ。");
    }
}


すると、以下のGIFのようにScrollViewのスクロールを妨げずにEventTriggerと同じ機能が使用可能になります!パチパチ!!

f:id:PafuOfDuck:20180818221138g:plain


今回はPointer Clickを実装したかったのでIPointerClickHandlerを実装してOnPointerClickメソッドを実装しましたが、他のイベントも【基本的に】同じように実装できます。

GIFを見ると、ドラッグするとクリックが無効化されていますね。これはUnityの仕様で、ドラッグが始まるとクリックがキャンセルされるようです。(気になる方はググってみてください)

おわり

EventTrigger (EventSystem側?) でも当たり判定を貫通させるパラメータありそうだけど見つからなかったので、この方法で押しました〜。
知っている方がいましたら教えてください!

Twitterのフォロー歓迎です...(`・ω・´) ヨロシク!