看过UGUI源码的朋友一定都知道,UI事件会在EventSystem在Update的Process触发。UGUI会遍历屏幕中所有RaycastTarget是true的UI,接着就会发射线,并且排序找到玩家最先触发的那个UI,在抛出事件给逻辑层去响应。
团队多人在开发游戏界面,很多时候都是复制黏贴,比如上一个图片是需要响应RaycastTarget,然后ctrl+d以后复制出来的也就带了这个属性,很可能新复制出来的图片是不需要响应的,开发人员又没有取消勾选掉,这就出问题了。
所以RaycastTarget如果被勾选的过多的话, 效率必然会低。
把下面代码挂在游戏中的任意GameObject上,原理其实很简单就是绘制辅助线,当UI中RaycastTarget发生变化,SceneView中的蓝色辅助线也会刷新,还是挺方便的。
1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.UI; 4 public class DebugUILine : MonoBehaviour { 5 static Vector3[] fourCorners = new Vector3[4]; 6 void OnDrawGizmos() 7 { 8 foreach (MaskableGraphic g in GameObject.FindObjectsOfType<MaskableGraphic>()) 9 { 10 if (g.raycastTarget) 11 { 12 RectTransform rectTransform = g.transform as RectTransform; 13 rectTransform.GetWorldCorners(fourCorners); 14 Gizmos.color = Color.blue; 15 for (int i = 0; i < 4; i++) 16 Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]); 17 18 } 19 } 20 } 21 }