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
    评论
Unity UGUI(用户界面)提供了各种控件来创建用户界面。以下是一些常见控件及其事件: 1. ButtonButton 控件用于创建一个可点击的按钮。它有以下几个常见的事件: - On Click:当按钮被点击时触发的事件。 - On Pointer Down:当鼠标或手指按下按钮时触发的事件。 - On Pointer Up:当鼠标或手指抬起按钮时触发的事件。 - On Pointer Enter:当鼠标或手指进入按钮区域时触发的事件。 - On Pointer Exit:当鼠标或手指离开按钮区域时触发的事件。 2. Toggle:Toggle 控件用于创建一个可切换状态的开关。它有以下几个常见的事件: - On Value Changed:当 Toggle 的值(选中或未选中)发生改变时触发的事件。 3. Slider:Slider 控件用于创建一个可以拖动的滑块。它有以下几个常见的事件: - On Value Changed:当 Slider 的值发生改变时触发的事件。 4. Scrollbar:Scrollbar 控件用于创建一个可以拖动的滚动条。它有以下几个常见的事件: - On Value Changed:当 Scrollbar 的值发生改变时触发的事件。 5. Dropdown:Dropdown 控件用于创建一个下拉框。它有以下几个常见的事件: - On Value Changed:当 Dropdown 的值(选中的选项)发生改变时触发的事件。 6. InputField:InputField 控件用于创建一个可以输入文本的框。它有以下几个常见的事件: - On Value Changed:当 InputField 的值发生改变时触发的事件。 - On End Edit:当用户完成输入并按下回车键或点击其他地方时触发的事件。 除了以上列出的常见事件之外,每个控件还可能有其他的事件。可以通过在 Inspector 窗口中选择相应的控件并查看其属性面板来了解更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值