1. 程式人生 > >Unity3D研究院之將UI的點擊事件滲透下去(轉)

Unity3D研究院之將UI的點擊事件滲透下去(轉)

一個 響應 http void ons cti ive down point

轉自 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後面的消息也能響應到了。

Unity3D研究院之將UI的點擊事件滲透下去(轉)