UGUI之新手引导事件上下分离

UGUI之新手引导事件上下分离


处理UI还有3D模型的点击推荐使用UGUI的这套事件系统,因为使用起来比较简洁,不需要自己用代码来发送射线,并且可以很好的处理同时点击UI和3D模型上。

1.给3D摄像机挂一个Physics Raycaster组件。Event Mask过滤掉UI.

2.用unity自带的Event Trigger 或者   http://www.manew.com/thread-94130-1-1.html 就可以对UI 或者 3D模型进行点击事件的监听了

3.OK 当UI与模型相互叠加的时候,优先响应UI,并且响应最前面的UI.

4.如下图所示,前面是UI后面是3D模型,被挡住的模型或者UI是不会被响应的。

101.png (109.22 KB, 下载次数: 1)

下载附件  保存到相册

2017-6-9 09:45 上传




假如想把点击的事件透下去,让所有的UI或者模型都能正确的响应事件,怎么办呢?

代码: 把这段脚本挂在最前面的UI上。 然后当接收到点击事件后,调用PassEvent把当前的事件透下去。由于UGUI的事件有很多种,比如点击 、抬起、拖动、落下、第二个参数就是ExecuteEvents.Handler 把对应的Handler传进去就行了。

[C#] 纯文本查看 复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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后面的消息也能响应到了。

102.png (156.91 KB, 下载次数: 2)

下载附件  保存到相册

2017-6-9 09:47 上传

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值