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
}