首页 >Unity3D频道 >【UGUI研究院】 > UGUI研究院之有效解决RaycastTarget勾选过多的烦恼(二十三)
2017
02-12

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

看过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,以前的做法需要一个个的去找(这个太麻烦了)

Snip20170212_3

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

Snip20170212_4

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

Snip20170212_6

 

测试环境 unity5.3.5

Canvas的参数


Snip20170212_7

UICamera相机的参数

Snip20170212_8

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

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

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

  1. 陈伟说:

    MOMO :我有两个疑问 1.是不是每一个新建的UI都会自动勾选RaycastTarget选项
    2.这个ratcastTarget勾选了是不是会在射线检测上产生BUG?比如说检测到目标下面的UI

    • 雨松MOMO说:

      unity会对所有勾选ratcastTarget的组件 发射线, 然后在排个序找到最前面的。 所以ratcastTarget 都选的越少越好。

留下一个回复

你的email不会被公开。 必填项已用 * 标注。