Unity 检测UGUI组件的RaycasrTarget是否勾选

来源:互联网 发布:上海知行生物科技传销 编辑:程序博客网 时间:2024/05/25 18:09

转载自蛮牛文章  http://www.manew.com/thread-100366-1-1.html


看过UGUI源码的朋友一定都知道,UI事件会在EventSystem在Update的Process触发。UGUI会遍历屏幕中所有RaycastTarget是true的UI,接着就会发射线,并且排序找到玩家最先触发的那个UI,在抛出事件给逻辑层去响应。

团队多人在开发游戏界面,很多时候都是复制黏贴,比如上一个图片是需要响应RaycastTarget,然后ctrl+d以后复制出来的也就带了这个属性,很可能新复制出来的图片是不需要响应的,开发人员又没有取消勾选掉,这就出问题了。

所以RaycastTarget如果被勾选的过多的话, 效率必然会低。。这个问题其实困扰了我很久,我终于想了一个还算好的方法解决它。

把下面代码挂在游戏中的任意GameObject上,原理其实很简单就是绘制辅助线,当UI中RaycastTarget发生变化,SceneView中的蓝色辅助线也会刷新,还是挺方便的。(感谢钱钱告诉我的 GetWorldCorners 方法)

[C#] 纯文本查看 复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
#if UNITY_EDITOR
usingUnityEngine;
usingSystem.Collections;
usingUnityEngine.UI;
publicclass DebugUILine : MonoBehaviour {
    staticVector3[] fourCorners = newVector3[4];
    voidOnDrawGizmos()
    {
        foreach(MaskableGraphic g inGameObject.FindObjectsOfType<MaskableGraphic>())
        {
            if(g.raycastTarget)
            {
                RectTransform rectTransform = g.transform asRectTransform;
                rectTransform.GetWorldCorners(fourCorners);
                Gizmos.color = Color.blue;
                for(inti = 0; i < 4; i++)
                    Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]);
  
            }
        }
    }
}
#endif


如下图所示,这是之前游戏中的一个简单的界面。 在SceneView视图中,我并不知道那些勾选了RaycastTarget,以前的做法需要一个个的去找(这个太麻烦了)

 

如下图所示,加上上面的脚本后,可以在scene试图中直接看到,蓝色框表示的就是勾选过RaycastTarget的UI。

 

有了辅助框后,如下图所示,我就可以很方便的把不需要响应的RaycastTarget去掉即可。

 

测试环境 Unity 5.3.7

Canvas的参数

 

UICamera相机的参数

 

这个脚本无论是运行模式,还是编辑模式都可以看到蓝色的辅助线。

0 0
原创粉丝点击