Unity UGUI事件穿透

在Unity开发中,一个按钮被前面的面板挡住,但是你依然能够进行交互,这个最简单的就是把前面的面板raycast Target属性不勾选不就行了,但是如果说前面的面板也需要做事件监测的的情况下该怎样做呢,比如下图,按钮被Image挡住了,但是你依然想点击下面的Button,这个时候应该怎么办呢?在这里插入图片描述
其实Unity交互其实都是基于射线检测的,当我们检测到当前面板的时候,我们只需要将当前的事件渗透下去就行了,下面给出参考代码。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using static UnityEngine.EventSystems.ExecuteEvents;

public class Test : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
	public void OnPointerDown(PointerEventData eventData)
	{
		RaycastThrough(eventData,pointerDownHandler);
	}
	public void OnPointerUp(PointerEventData eventData)
	{
		RaycastThrough(eventData,pointerUpHandler);
	}
	public void RaycastThrough<T>(BaseEventData baseEventData, EventFunction<T> eventFunction) where T : IEventSystemHandler
	{
		PointerEventData pointerEventData = (PointerEventData)baseEventData;
		
		List<RaycastResult> raycastResults = new List<RaycastResult>();
		//当前处理的gameobject
		GameObject currentObj = pointerEventData.pointerCurrentRaycast.gameObject ?? pointerEventData.pointerDrag;
		//获取当前射线检测到的所有结果
		EventSystem.current.RaycastAll(pointerEventData, raycastResults);
		foreach (var item in raycastResults)
		{
			GameObject nextObj = item.gameObject;
			if (nextObj != null && nextObj != currentObj)
			{
				GameObject excuteObj = GetEventHandler<T>(nextObj);
				if (excuteObj != currentObj)
				{
					//执行下一层事件,如果你还需要继续执行下面层UI事件可以不return,我这里只检测下一层的,所以我循环一次就直接return
					Execute(excuteObj, pointerEventData, eventFunction);
					return;
					
				}
			}
		}
	
	}
}

有什么问题可以进群探讨

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值