UGUI的点击事件是基于射线的。如果不需要响应事件,千万不要在Image和Text组件上勾选RaycastTarget。UI事件会在EventSystem的Update()方法中调用Process时触发。UGUI会遍历屏幕中所有Raycasttarget是true的UI,接着就会发射线,并且排序找到玩家最先触发的UI,再抛出事件给逻辑层去响应,这样无形中就会带来很多开销。我可以通过辅助方法,标记那些勾选了RaycastTarget的ui,这样就可以去发现那些不必要勾选了。
using UnityEngine; using UnityEngine.UI; public class ShowRayCatchUI : MonoBehaviour { #if UNITY_EDITOR static Vector3[] fourCorners = new Vector3[4]; private void OnDrawGizmos() { foreach (MaskableGraphic g in GameObject.FindObjectsOfType<MaskableGraphic>()) { if (g.raycastTarget) { RectTransform rectTransform = g.rectTransform; rectTransform.GetWorldCorners(fourCorners); Gizmos.color = Color.blue; for (int i = 0; i < 4; i++) Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]); } } } #endif }