14

UGUI研究院之有效解决RaycastTarget勾选过多的烦恼(二十三)

 3 years ago
source link: https://www.xuanyusong.com/archives/4291
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

UGUI研究院之有效解决RaycastTarget勾选过多的烦恼(二十三)

雨松MOMO 【UGUI研究院】 围观351334 条评论 编辑日期:2017-02-12 字体:

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

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

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

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

#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class DebugUILine : MonoBehaviour {
static Vector3[] fourCorners = new Vector3[4];
void OnDrawGizmos()
foreach (MaskableGraphic g in GameObject.FindObjectsOfType<MaskableGraphic>())
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

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

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

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

测试环境 unity5.3.5

Canvas的参数

UGUI研究院之有效解决RaycastTarget勾选过多的烦恼(二十三) - 雨松MOMO程序研究院 - 4

UICamera相机的参数

UGUI研究院之有效解决RaycastTarget勾选过多的烦恼(二十三) - 雨松MOMO程序研究院 - 5

这个脚本无论是运行模式,还是编辑模式都可以看到蓝色的辅助线,的理论上90%的文字或者 非按钮的图片 都是不需要RaycastTarget的。如果大家有什么建议或者想法,欢迎再下面给我留言。

作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK