當(dāng)場景中的3D物體需要響應(yīng)點(diǎn)擊,但同時(shí)有UI顯示時(shí),存在判斷點(diǎn)擊是在3D物體上還是UI上的問題,辦法如下: 1. 射線檢測所有2D 3D物體,有2D物體被檢測到時(shí)表明當(dāng)前有UI。但無論P(yáng)hysics2D.Raycast()還是Physics.Raycast()都只能檢測到含有Collider組件的物體,普通UI如Image Button等一般用射線是不起作用的。EventSystem.current.RaycastAll()可以將當(dāng)前屏幕上的所有可檢測的物體全部檢測到,該方法需要自己構(gòu)造一個(gè)PointerEventData參數(shù)傳入檢測的點(diǎn)坐標(biāo): 1 PointerEventData pointerData = new PointerEventData (EventSystem.current); 2 pointerData.position = Input.mousePosition; 3 List<RaycastResult> results = new List<RaycastResult> (); 4 EventSystem.current.RaycastAll (pointerData, results); 2. 在3D物體的Camera上掛上PhysicsRaycaster組件即可讓3D物體上的腳本響應(yīng)IPointerClickHandler等事件了(原理同Canvas上都掛有GraphicRaycaster組件一下)。 當(dāng)3D物體之上有UI時(shí)則會自動被UI事件所攔截,因?yàn)橐话鉛I的顯示級別(Camera或overlay)是高于場景中的3D物體的。 這樣就當(dāng)點(diǎn)擊在UI上時(shí)只響應(yīng)UI事件了,如果同時(shí)也要響應(yīng)3D物體上的事件則只能再次用射線檢測點(diǎn)擊處是否有3D物體(3D物體一般都有Collider)。 3. 詳見www.xuanyusong.com/archives/3327,如下代碼 1 void Update ()
2 {
3 if (Input.GetMouseButtonDown (0) || (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began))
4 {
5 #if UNITY_IOS || UNITY_ANDROID
6 if (EventSystem.current.IsPointerOverGameObject (Input.GetTouch (0).fingerId))
7 #else
8 if (EventSystem.current.IsPointerOverGameObject ())
9 #endif
10 Debug.Log ("當(dāng)前觸摸在UI上");
11
12 else
13 Debug.Log ("當(dāng)前沒有觸摸在UI上");
14 }
15 } 但EventSystem.current.IsPointerOverGameObject ()只能檢測到有event存在的組件如Button等,普通Image等UI是不能被檢測的,故該方法僅用于簡單幾個(gè)按鈕等可交互的UI與3D物體間的判斷,當(dāng)一個(gè)大的UI窗口打開時(shí)點(diǎn)擊在非按鈕上如背景圖時(shí)則失效。 另: 讓3D物體響應(yīng)點(diǎn)擊有個(gè)MonoBehaviour自帶的消息函數(shù)MonoBehaviour.OnMouseDown()可簡單實(shí)現(xiàn),但腳本中最好不要有OnMouseXXX的消息處理函數(shù),此類函數(shù)會影響游戲性能。(當(dāng)存在此類函數(shù)時(shí)build打包結(jié)束時(shí)有黃色警告提示性能影響) Graphics Raycaster的Raycast是個(gè)虛函數(shù),可以寫個(gè)Graphics Raycaster的派生類,在默認(rèn)的Raycast操作執(zhí)行完以后,用自定義的layer進(jìn)行篩選,把不需要響應(yīng)的gameobject去掉。這樣就可以實(shí)現(xiàn)只響應(yīng)某個(gè)layer的需求了。新手引導(dǎo)中只要把需要響應(yīng)的gameobject設(shè)置為特定layer就行了。 實(shí)現(xiàn)ICanvasRaycastFilter接口并掛在UI組件上,當(dāng)有任何UI事件觸發(fā)時(shí)可以實(shí)現(xiàn)自定義的判斷,如: |
|