19

Unity3D研究院之UI完整透下事件(一百二十二)

 3 years ago
source link: https://www.xuanyusong.com/archives/4773
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Unity3D研究院之UI完整透下事件(一百二十二)

以前写过一篇类似的文章用于解决新手引导的问题,  Unity3D研究院之将UI的点击事件渗透下去(九十)  最近策划又提出一个需求,Tips窗口打开以后点击空白区域关掉,但是如果空白区域下有按钮滑动输入一类的要关掉Tips的同时要响应相面的事件,所以透下的事件就要比较完整了。开始我觉得这个需求很不合理,但是他们给我找了个这样实现的游戏,我瞬间只能服了。







代码在项目中已经测试了一段时间了,同时也欢迎大家测试。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class UITouchPass : MonoBehaviour, IPointerClickHandler,
    IMoveHandler,IPointerDownHandler, IPointerUpHandler,IPointerEnterHandler,ISelectHandler, IDeselectHandler
    , ISubmitHandler, IInitializePotentialDragHandler, IBeginDragHandler, IEndDragHandler, IDragHandler, IScrollHandler
    public virtual void OnPointerClick(PointerEventData eventData)
        PassEvent(eventData, ExecuteEvents.pointerClickHandler);
    public virtual void OnPointerDown(PointerEventData eventData)
        PassEvent(eventData, ExecuteEvents.pointerDownHandler);
        if (Input.GetButtonDown("Submit"))
           ExecuteEvents.Execute(eventData.pointerCurrentRaycast.gameObject, eventData, ExecuteEvents.submitHandler);
    public virtual void OnPointerUp(PointerEventData eventData)
        PassEvent(eventData, ExecuteEvents.pointerUpHandler);
    public virtual void OnPointerEnter(PointerEventData eventData)
        PassEvent(eventData, ExecuteEvents.pointerEnterHandler);
    public virtual void OnSelect(BaseEventData eventData)
        PassEvent(eventData, ExecuteEvents.selectHandler);
    public virtual void OnDeselect(BaseEventData eventData)
        PassEvent(eventData, ExecuteEvents.deselectHandler);
    public virtual void OnSubmit(BaseEventData eventData)
        PassEvent(eventData, ExecuteEvents.submitHandler);
    public virtual void OnMove(AxisEventData eventData)
        PassEvent(eventData, ExecuteEvents.moveHandler);
    GameObject CacheGameObject;
    public virtual void OnInitializePotentialDrag(PointerEventData eventData)
        CacheGameObject = PassEvent(eventData, ExecuteEvents.initializePotentialDrag);
    public virtual void OnBeginDrag(PointerEventData eventData)
         PassEvent(eventData, ExecuteEvents.beginDragHandler);
    public virtual void OnDrag(PointerEventData eventData)
        ExecuteEvents.Execute(CacheGameObject, eventData, ExecuteEvents.dragHandler);
    public virtual void OnEndDrag(PointerEventData eventData)
        ExecuteEvents.Execute(CacheGameObject, eventData, ExecuteEvents.endDragHandler);
        CacheGameObject = null;
    public virtual void OnScroll(PointerEventData eventData)
        ExecuteEvents.Execute(CacheGameObject, eventData, ExecuteEvents.scrollHandler);
    List<RaycastResult> result = new List<RaycastResult>();
    GameObject PassEvent<T>(BaseEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler
        PointerEventData eventData = data as PointerEventData;
        var pointerGo = eventData.pointerCurrentRaycast.gameObject?? eventData.pointerDrag;
        EventSystem.current.RaycastAll(eventData, result);
        foreach (var item in result)
            var go = item.gameObject;
            if (go != null && go != pointerGo)
                var excuteGo = ExecuteEvents.GetEventHandler<T>(go);
                if (excuteGo)
                    if (excuteGo.TryGetComponent<UITouchPass>(out var __))
                        return null;
                    ExecuteEvents.Execute(excuteGo, data, function);
                    return excuteGo;
                    if(go.TryGetComponent<UnityEngine.UI.Graphic>(out var com))
                        if (com.raycastTarget) return null;
        return null;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK