- Unity3D高級編程:主程手記
- 陸澤西
- 596字
- 2022-01-07 14:46:27
4.3.5 射線碰撞檢測模塊源碼
射線碰撞檢測模塊的主要工作是從攝像機(jī)的屏幕位置上進(jìn)行射線碰撞檢測并獲取碰撞結(jié)果,將結(jié)果返回給事件處理邏輯類,交由事件處理模塊處理。
射線碰撞檢測模塊主要包含三個(gè)類,分別作用于2D射線碰撞檢測、3D射線碰撞檢測和GraphicRaycaster圖形射線碰撞檢測。
2D射線碰撞檢測、3D射線碰撞檢測相對比較簡單,采用射線的形式進(jìn)行碰撞檢測,區(qū)別在于2D射線碰撞檢測結(jié)果里預(yù)留了2D的層級次序,以便在后面的碰撞結(jié)果排序時(shí),以這個(gè)層級次序?yàn)橐罁?jù)進(jìn)行排序,而3D射線碰撞檢測結(jié)果則是以距離大小為依據(jù)進(jìn)行排序的。
GraphicRaycaster類為UGUI元素點(diǎn)位檢測的類,它被放在Core渲染塊里。它主要針對ScreenSpaceOverlay模式下的輸入點(diǎn)位進(jìn)行碰撞檢測,因?yàn)檫@個(gè)模式下的檢測并不依賴于射線碰撞,而是通過遍歷所有可點(diǎn)擊的UGUI元素來進(jìn)行檢測比較,從而判斷該響應(yīng)哪個(gè)UI元素的。因此GraphicRaycaster類是比較特殊的。
GraphicRaycaster類的核心源碼如下:
///<summary> /// 在屏幕上進(jìn)行射線碰撞,并收集所有元素 ///</summary> [NonSerialized] static readonly List<Graphic>s_SortedGraphics = new List<Graphic>(); private static void Raycast(Canvas canvas, Camera eventCamera, Vector2 pointerPosition, List<Graphic>results) { // 事件系統(tǒng)所必需的 var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); for (int i = 0; i<foundGraphics.Count; ++i) { Graphic graphic = foundGraphics[i]; // -1表示畫布尚未對其進(jìn)行處理,這意味著它實(shí)際上并未繪制 if (graphic.depth == -1 || !graphic.raycastTarget) continue; if (!RectTransformUtility.RectangleContainsScreenPoint(graphic. rectTransform, pointerPosition, eventCamera)) continue; if (graphic.Raycast(pointerPosition, eventCamera)) { s_SortedGraphics.Add(graphic); } } s_SortedGraphics.Sort((g1, g2) =>g2.depth.CompareTo(g1.depth)); for (int i = 0; i<s_SortedGraphics.Count; ++i) results.Add(s_SortedGraphics[i]); s_SortedGraphics.Clear(); }
上述代碼中,GraphicRaycaster()對每個(gè)可以點(diǎn)擊的元素(raycastTarget是否為true,并且depth不為-1,為可點(diǎn)擊元素)進(jìn)行計(jì)算,判斷點(diǎn)位是否落在該元素上。再通過depth變量排序,判斷最先落在哪個(gè)元素上,從而確定哪個(gè)元素響應(yīng)輸入事件。
所有檢測碰撞結(jié)果的數(shù)據(jù)結(jié)構(gòu)均為RaycastResult類,它承載了所有碰撞檢測的結(jié)果,包括距離、世界點(diǎn)位、屏幕點(diǎn)位、2D層級次序和碰撞物體等,為后面的事件處理提供數(shù)據(jù)上的依據(jù)。
- Git Version Control Cookbook
- Kibana Essentials
- INSTANT OpenCV Starter
- 小程序?qū)崙?zhàn)視頻課:微信小程序開發(fā)全案精講
- Access 數(shù)據(jù)庫應(yīng)用教程
- C和C++安全編碼(原書第2版)
- 深入淺出Windows API程序設(shè)計(jì):編程基礎(chǔ)篇
- 面向?qū)ο蟪绦蛟O(shè)計(jì)(Java版)
- 區(qū)塊鏈技術(shù)與應(yīng)用
- 0 bug:C/C++商用工程之道
- NGUI for Unity
- Python+Office:輕松實(shí)現(xiàn)Python辦公自動化
- HTML5移動前端開發(fā)基礎(chǔ)與實(shí)戰(zhàn)(微課版)
- HTML5游戲開發(fā)實(shí)戰(zhàn)
- 深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐