UGUI Raycast Target 优化

  1. UGUI的点击事件基于射线。
  2. 如果不需要响应事件,则不要在Image与Text组件上勾选RaycastTarget。
    1. 有些RaycastTarget不能随便取消勾选,比如ButtonUI自带的Image组件和Button组件,其实Button点击事件是靠Image接收点击的,关闭了Image的Raycast Target后按钮就不能按了。
  3. UI事件会在EventSystem的Update()方法中调用Process时触发。
  4. UGUI会遍历屏幕中所有RaycastTarget==true的UI,接着发射线,并且排序找到玩家最先触发的UI,再抛出事件给逻辑层去响应,这样无形中就会带来性能开销。
  5. 每个组件的Raycast Target只会影响自己,不会影响子物体,但会影响父物体。也就是说,UI的射线检测或依次检测对象下的所有元素(子物体),有任何一个射线检测功能(Raycast Target为true),则整个Button都会响应。(检测范围大小取决于能检测子物体的范围)。
  6. 通过重写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
    }
    
  7. 其中New Text 2关闭了raycastTarget。
  8. 如果要临时取消辅助线,在Scene-Gizmos里找到脚本名,并取消即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值