- UGUI的点击事件基于射线。
- 如果不需要响应事件,则不要在Image与Text组件上勾选RaycastTarget。
- 有些RaycastTarget不能随便取消勾选,比如ButtonUI自带的Image组件和Button组件,其实Button点击事件是靠Image接收点击的,关闭了Image的Raycast Target后按钮就不能按了。
- UI事件会在EventSystem的Update()方法中调用Process时触发。
- UGUI会遍历屏幕中所有RaycastTarget==true的UI,接着发射线,并且排序找到玩家最先触发的UI,再抛出事件给逻辑层去响应,这样无形中就会带来性能开销。
- 每个组件的Raycast Target只会影响自己,不会影响子物体,但会影响父物体。也就是说,UI的射线检测或依次检测对象下的所有元素(子物体),有任何一个射线检测功能(Raycast Target为true),则整个Button都会响应。(检测范围大小取决于能检测子物体的范围)。
- 通过重写OnDrawGizmos()方法,同时把场景中的所有UI组件找出来,如果勾选了RaycastTarget,计算出元素的4个顶点,最终用Gizmos.DrawLine()绘制。
using UnityEngine; using UnityEngine.UI; public class NewMonoBehaviourScript : MonoBehaviour { #if UNITY_EDITOR private static Vector3[] fourCorners = new Vector3[4]; private void OnDrawGizmos() { foreach (MaskableGraphic g in GameObject.FindObjectsByType<MaskableGraphic>(FindObjectsSortMode.None)) { if (g.raycastTarget) { RectTransform rectTransform = g.transform as RectTransform; rectTransform.GetWorldCorners(fourCorners); Gizmos.color = Color.blue; for (int i = 0; i < 4; i++) { Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]); } } } } #endif }
- 其中New Text 2关闭了raycastTarget。
- 如果要临时取消辅助线,在Scene-Gizmos里找到脚本名,并取消即可。
UGUI Raycast Target 优化
于 2024-09-05 22:32:32 首次发布