Unity中UI的点击穿透

2019-10-22  本文已影响0人  沉麟

using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;

public class EventPreice : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler,IBeginDragHandler
{

    //监听按下
    public void OnPointerDown(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.pointerDownHandler);
    }

    //监听抬起
    public void OnPointerUp(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.pointerUpHandler);
    }

    //监听点击
    public void OnPointerClick(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.submitHandler);
        PassEvent(eventData, ExecuteEvents.pointerClickHandler);
    }

    //监听开始拖拽
    public void OnBeginDrag(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.beginDragHandler);
    }

    //把事件透下去
    public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function)
        where T : IEventSystemHandler
    {
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(data, results);
        GameObject current = data.pointerCurrentRaycast.gameObject;
        for (int i = 0; i < results.Count; i++)
        {
            if (current != results[i].gameObject)
            {
                Debug.Log("obj:" + results[i].gameObject + "function:" + function.ToString());
                ExecuteEvents.Execute(results[i].gameObject, data, function);
                break;
                //RaycastAll后ugui会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。
            }
        }
    }

    
}

脚本挂到需要响应点击的UI上,可以穿透此UI向下检测


public void OnPointerDown(PointerEventData eventData)
    {
        startPos = Input.mousePosition;
        if (timer!=null)
        {
            StopCoroutine(timer);
            timer = null;
        }
        timer = StartCoroutine(Timer());
        pointerEventData = eventData;
        DynamicData.Instance.isDragPlant = false;
        //需要穿透时调用
        eventPreice.PassEvent(pointerEventData, ExecuteEvents.beginDragHandler);
        //Debug.LogError("OnPointerDown");
    }  
上一篇 下一篇

猜你喜欢

热点阅读