うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】EventSystems の イベントを親に通知する

EventSystems の イベントは子供の要素で呼び出されるため、親には伝わらない

例えば ScrollView の中に ScrollView を入れた場合は子供の ScrollView しか動かすことができない

f:id:hacchi_man:20210115182330g:plain

親にイベントを伝える

同じ GameObject だったらイベントを受け取れることを利用して
イベントを通知するコンポーネントを作成

using UnityEngine;
using UnityEngine.EventSystems;
 
public class NoticeEventSystemsDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    [SerializeField]
    private GameObject[] _noticeObjects;

    void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
    {
        foreach (var noticeObject in _noticeObjects)
            ExecuteEvents.Execute<IBeginDragHandler>(noticeObject, eventData,
                (handler, data) => handler.OnBeginDrag(eventData));
    }
 
    void IDragHandler.OnDrag(PointerEventData eventData)
    {
        foreach (var noticeObject in _noticeObjects)
            ExecuteEvents.Execute<IDragHandler>(noticeObject, eventData,
                (handler, data) => handler.OnDrag(eventData));
    }
 
    void IEndDragHandler.OnEndDrag(PointerEventData eventData)
    {
        foreach (var noticeObject in _noticeObjects)
            ExecuteEvents.Execute<IEndDragHandler>(noticeObject, eventData,
                (handler, data) => handler.OnEndDrag(eventData));
    }
}

これを ScrollRect と同じ GameObject に追加することで、親もスクロールできるようになった

なぜか縦のスクロールが伝わってないが、原因は不明

f:id:hacchi_man:20210115182803g:plain