在游戲中,當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,全都按照這個值來排序。