unity的UI Event事件(Event Trigger和EventSystem对比)

本文介绍了Unity中UIEvent的基础概念及其与EventSystem和EventTrigger的区别。讲述了如何使用UIEvent进行事件管理,并对比了EventSystem和EventTrigger的不同之处。

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

首先看Unity中UI Event事件介绍




上图中出现的组件在场景里都是unity里的事件相关的组件。

例如:场景里EventSystem里默认就有Standalone input module这个组件(当然也可以随便加其他组件)

Graphic Raycaster默认在Canvas里面。等等。

如下图:



在上两篇博客中讲了Event Trigger和EventSystem这两个事件触发方法。然而他们中所有的方法都是来源于UI Event,UI Event才是真正的老大!


下面讲解他们的异同之处:

相同:

首先无论是谁来触发事件方法,场景里都必须存在EventSystems这个gameobject,否则不能触发。


不同:

EventSystem作为事件管理系统拥有这UI Event里的所有方法(如下图)。

而Event Trigger里没有下图中的input输入类。

EventSystem可以看做是只用代码就可以触发事件(见上篇http://blog.csdn.net/alayeshi/article/details/53082667),

Event Trigger则必须要将物体绑定到组建上(见上上篇http://blog.csdn.net/alayeshi/article/details/53082194)

与button的两种触发方法类似(http://blog.csdn.net/alayeshi/article/details/44217905)。



Unity中,EventTrigger组件是用于监听事件触发器,可以响应各种UI事件,比如点击(Pointer Click)等。如果你想要实现点击UI以外的区域来隐藏UI,你可以通过监听Pointer Click事件,并在该事件发生时判断点击位置是否在UI元素上。如果不在,则执行隐藏UI的操作。 具体步骤如下: 1. 在你的Canvas下创建一个空的GameObject,命名为EventReceiver。 2. 给EventReceiver添加EventTrigger组件。 3. 在EventTrigger组件中添加一个新的事件类型Pointer Click,然后为这个事件添加一个新的监听器。 4. 在监听器的回调函数中,使用UnityEvent系统来获取点击位置,并通过Camera的WorldToScreenPoint方法将这个位置转换到屏幕坐标系中。 5. 使用Graphics`类的`IsOverGUI方法判断点击位置是否在任何UI元素之上。 6. 如果点击位置没有在UI元素上,则执行隐藏UI的操作。 下面是一个示例脚本,展示如何实现上述逻辑: ```csharp using UnityEngine; using UnityEngine.EventSystems; public class HideUIOnClickOutside : MonoBehaviour, IPointerClickHandler { public GameObject uiToHide; // 需要隐藏的UI public void OnPointerClick(PointerEventData eventData) { // 获取当前EventSystem的实例 EventSystem currentEventSystem = EventSystem.current; // 获取点击位置的屏幕坐标 Vector2 screenPosition = new Vector2(eventData.position.x, eventData.position.y); // 将屏幕坐标转换为世界坐标 PointerEventData newEventData = new PointerEventData(currentEventSystem); newEventData.position = screenPosition; // 获取所有UI元素的列表 List<RaycastResult> raycastResults = new List<RaycastResult>(); EventSystem.current.RaycastAll(newEventData, raycastResults); // 判断点击位置是否在UI元素上 bool isOverUI = false; foreach (RaycastResult result in raycastResults) { if (result.gameObject != gameObject) // 确保不是在本GameObject上 { isOverUI = true; break; } } // 如果没有在UI元素上,则隐藏UI if (!isOverUI) { uiToHide.SetActive(false); } } } ``` 记得将这个脚本附加到EventReceiver GameObject上,并将你想要隐藏的UI元素赋值给`uiToHide`字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值