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