小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

unity區(qū)分點(diǎn)擊在3D物體還是2D UI上

 kiki的號 2017-04-07

當(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,如下代碼


復(fù)制代碼

 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         }

復(fù)制代碼

 但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)自定義的判斷,如:


復(fù)制代碼

 1 public class CustomRay : MonoBehaviour, ICanvasRaycastFilter
 2 {
 3     public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
 4     {
 5         //....
 6         ...
 7         return true;
 8         //....
 9         ...
10         return false;
11     }
12 }

復(fù)制代碼

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多