官术网_书友最值得收藏!

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ù)。

主站蜘蛛池模板: 昌图县| 卢龙县| 合川市| 临江市| 错那县| 台北县| 定州市| 阿鲁科尔沁旗| 安宁市| 防城港市| 陇南市| 湟源县| 芒康县| 惠水县| 桂平市| 建始县| 盐城市| 司法| 沾益县| 无极县| 奎屯市| 固镇县| 望江县| 贵港市| 栾城县| 荣成市| 吉木萨尔县| 克什克腾旗| 武定县| 浦城县| 金塔县| 乐安县| 三台县| 平顺县| 兴仁县| 宾阳县| 沙雅县| 阿鲁科尔沁旗| 恩施市| 舒城县| 鸡东县|