[UGUI]Overlay Canvas和其他模式的Canvas點擊沖突問題解決


在游戲中,當Overlay的Canvas和Camera 或World Space的Canvas點擊范圍有重合的時候,總會響應Overlay Canvas的點擊事件而忽略其他。

 

原因是在EventSystem.RaycastComparer中:

 if (lhs.module.eventCamera != null && rhs.module.eventCamera != null && lhs.module.eventCamera.depth != rhs.module.eventCamera.depth)
                {
                    // need to reverse the standard compareTo
                    if (lhs.module.eventCamera.depth < rhs.module.eventCamera.depth)
                        return 1;
                    if (lhs.module.eventCamera.depth == rhs.module.eventCamera.depth)
                        return 0;

                    return -1;
                }

                if (lhs.module.sortOrderPriority != rhs.module.sortOrderPriority)
                    return rhs.module.sortOrderPriority.CompareTo(lhs.module.sortOrderPriority);

如果比較中有一個Canvas不帶Camera,就會比較sortOrderPriority。

GraphicRayCaster里:

        public override int sortOrderPriority
        {
            get
            {
                // We need to return the sorting order here as distance will all be 0 for overlay.
                if (canvas.renderMode == RenderMode.ScreenSpaceOverlay)
                    return canvas.sortingOrder;

                return base.sortOrderPriority;
            }
        }

BaseRaycaster里:

        public virtual int sortOrderPriority
        {
            get { return int.MinValue; }
        }

就是說如果renderMode不是Overlay,就會排在Overlay的下面。

解決方法是自己寫一個Raycaster:

using UnityEngine;
using UnityEngine.UI;

public class UIRaycaster : GraphicRaycaster
{
    public override int sortOrderPriority
    {
        get
        {
            Canvas canvas = GetComponent<Canvas> ();
            return canvas.sortingOrder;
        }
    }
}

不管是不是Overlay,全都按照這個值來排序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM