Unity3D研究院之将UI的点击事件渗透下去(转)

转自 http://www.xuanyusong.com/archives/4241

处理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传进去就行了。

C#

1

2

3

4

5

6

7

8

9

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

48

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后面的消息也能响应到了。

时间: 2024-10-21 22:34:55

Unity3D研究院之将UI的点击事件渗透下去(转)的相关文章

#你好Unity3D#Hierarchy视图监听gameObject点击事件

今天无意间又找到了个好方法 1 2 3 4 5 6 7 8 9 10 [InitializeOnLoadMethod] static void Start () { Selection.selectionChanged = delegate { Debug.Log(Selection.activeObject.name); }; } 前几天有朋友问过我怎么监听sceneview 和 hierarchy视图选择某个gameObject的事件,今天干好有时间我就研究研究. 下面的这两个代理事件大家都

Unity3D研究院之与Android相互传递消息

原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了.恰好Unity for Andoid 和 IOS一样都是可以相互与Unity发送与接收消息,这篇文章MOMO就和大家好好聊聊Android向Unity发送消息的方法.在读本片博文之前,建议大家读一下我上一篇文章Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八),有关数据打包

Unity3D研究院之Assetbundle的实战(六十三)

1.创建Assetbundle          无论是模型资源还是UI资源,最好是先把他们放在Prefab中,然后在做成Assetbundle.我们以模型来举例,Assetbundle中可以放一个模型.也可以放多个模型,它是非常灵活了那么最需要考虑的就是模型空间占用的问题. 比如我们有两个完全一样的模型,但是他们身上绑定的脚本不一样,此时需要把这两个模型放在两个不同Prefab中.如下图所示,我们分别对这两个Prefab打包,我们可以清晰的看到两个相同的Prefab打包在一起只占1M空间,而将

Unity3D研究院之打开Activity与调用JAVA代码传递参数

原地址:http://www.xuanyusong.com/archives/667    Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本

(转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原.在Unity官网上下载随便下载一个demo Project,如下图所示这是我刚刚在官网上下载的一个范例程序.           接着将层次视图中的所有游戏对象都封装成Prefab保存在资

Unity3D研究院之Jenkins的使用(七十八)

长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内不需要unity的开发环境,只要它有浏览器,它就能打包Jenkins无疑是最佳选择. Unity3D研究院之IOS全自动编辑framework.plist.oc代码(六十七) Unity3D研究院之IOS全自动打包生成ipa(六十八) Unity3D研究院之Android全自动打包生成apk(六十九

Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收

今天和盆友们讨论IOS的高级界面与unity3d游戏引擎的交互,这个在开发中是非常重要的,unity3d 毕竟是一个面向多平台的一个游戏引擎,它不可能全部为IOS 考虑的面面俱到,引擎中也不存在针对IOS的高级界面的控件的使用. 本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情. 上一章介绍了触摸IOS屏幕 移动摄像机的位置,下面有盆友问我说他不想移动摄像机的位置,就想移动物体的位置,我在这里

Unity3D研究院之详解游戏开发音频的播放

游戏音频的播放在任何游戏中都占据非常重要的地位,音频的播放还可以分为两种,一种为游戏音乐,另一种为游戏音效.前者适用于较长的音乐,如游戏背景音乐.第二种试用与比较短的游戏音乐,如开枪,打怪 时“砰砰”一瞬间播放的游戏音效.今天MOMO将用下面的例子带盆友们去剖析Unity3D游戏音乐与音效的播放. Unity3D游戏引擎一共支持4个音乐格式的文件 .AIFF  适用于较短的音乐文件可用作游戏打斗音效 .WAV  适用于较短的音乐文件可用作游戏打斗音效 .MP3  适用于较长的音乐文件可用作游戏背

unity3d实现一个人物跟随鼠标点击地面那点就移动那点,实现点击特效加人物动画方向的切换。

//人物方向和判断点击事件加点击特效 using UnityEngine;using System.Collections; public class playerDir : MonoBehaviour { public GameObject effect_click_prefab;   private bool isMoving=false;//鼠标是否被按下   public Vector3 targetPosition=Vector3.zero;//目标位置 private PlayerM