Unity UGUI事件穿透

这篇博客讨论了在Unity中如何处理UI交互穿透问题,即当一个按钮被其他面板遮挡时,仍然能够进行有效点击。通过使用Raycast检测和事件渗透,可以在保持面板事件监测的同时,使被遮挡的按钮可点击。提供的代码示例展示了如何实现这一功能,允许事件传递到下一层UI元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值