当前位置:网站首页>将UI的点击事件渗透下去
将UI的点击事件渗透下去
2022-08-11 05:31:00 【星际行走】
处理UI还有3D模型的点击推荐使用UGUI的这套事件系统,因为使用起来比较简洁,不需要自己用代码来发送射线,并且可以很好的处理同时点击UI和3D模型上。
1.给3D摄像机挂一个Physics Raycaster组件。Event Mask过滤掉UI.
2.用unity自带的Event Trigger 或者 http://www.xuanyusong.com/archives/3325 就可以对UI 或者 3D模型进行点击事件的监听了
3.OK 当UI与模型相互叠加的时候,优先响应UI,并且响应最前面的UI.
4.如下图所示,前面是UI后面是3D模型,被挡住的模型或者UI是不会被响应的。
假如想把点击的事件透下去,让所有的UI或者模型都能正确的响应事件,怎么办呢?
代码: 把这段脚本挂在最前面的UI上。 然后当接收到点击事件后,调用PassEvent把当前的事件透下去。由于UGUI的事件有很多种,比如点击 、抬起、拖动、落下、第二个参数就是ExecuteEvents.Handler 把对应的Handler传进去就行了。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections.Generic;
public class Test : MonoBehaviour,IPointerClickHandler ,IPointerDownHandler,IPointerUpHandler
{
//监听按下
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 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)
{
ExecuteEvents.Execute(results[i].gameObject, data,function);
//RaycastAll后ugui会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。
}
}
}
}
这样UI下面那些对应接收点击事件的地方都可以响应到了。。如下图所示,我点击在前面的UI后面的消息也能响应到了。
- 本文固定链接: Unity3D研究院之将UI的点击事件渗透下去(九十) | 雨松MOMO程序研究院
- 转载请注明: 雨松MOMO 2016年09月05日 于 雨松MOMO程序研究院 发表
边栏推荐
- 5月leetcode-C#刷题日志(持续更新中)
- C# 基础之字典——Dictionary(一)
- 轻松理解进程与线程
- C# 基础之字典——Dictionary(二)
- js 学习进阶(事件高级 pink老师教学笔记)
- 【LeetCod】三数之和-15
- 【转】Unity 内置渲染管线、SRP、URP、HDRP区别
- gerrit configure SSH Key and account, email information
- 【LeetCode-36】有效的数独
- [Meetup Preview] OpenMLDB+OneFlow: Link feature engineering to model training to accelerate machine learning model development
猜你喜欢
随机推荐
第六届蓝帽杯 EscapeShellcode
Day 71
品优购项目实战笔记
Lua 快速入门(三)——表(Table)
three.js基础学习
Day 85
Day 78
Manufacturer Push Platform-Huawei Access
Day 75
Here is a memorial
C语言-6月8日-给定一个字符数组‘i am a student’ 统计字符a的个数并进行输出
经纬度求距离
星盟-pwn-babyheap
将一个excel文件中多个sheet页“拆分“成多个“独立“excel文件
js 学习进阶(Dom部分 pink老师教学笔记)
Unity C# 面试题、知识点总结
本地服务配置内网穿透实现微信公众号整合
Day 84
ARM assembly instruction ADR and LDR
【LeetCode-34】在排序数组中查找元素的第一个和最后一个位置