0评论

UGUI优化之RaycastTarget Checker

文章来自https://blog.csdn.net/SerenaHaven/article/details/80972601?utm_source=blogxgwz7 2019-02-26 87浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

UGUI默认会打开一些组件的RaycastTarget属性。事实上,绝大部分的UI组件,是不需要响应Raycast的。出于性能优化考虑,这些不需要响应Raycast的UI组件,应该去掉其Raycast Target选项的勾选。

这里分享一个检查UI组件Raycast Target属性的工具,在脚本放在Project下任意的Editor目录下即可。

代码如下:
using UnityEditor;
using UnityEngine.UI;
using UnityEngine;
public class RaycastTargetChecker : EditorWindow
{
	private MaskableGraphic[] graphics;
	private bool hideUnchecked = false;
	private bool showBorders = true;
	private Color borderColor = Color.blue;
	private Vector2 scrollPosition = Vector2.zero;
	private static RaycastTargetChecker instance = null;
	[MenuItem ("Tools/RaycastTarget Checker")]
	private static void Open ()
	{
		instance = instance ?? EditorWindow.GetWindow<RaycastTargetChecker> ("RaycastTargets");
		instance.Show ();
	}
	void OnEnable ()
	{
		instance = this;
	}
	void OnDisable ()
	{
		instance = null;
	}
	void OnGUI ()
	{
		using (EditorGUILayout.HorizontalScope horizontalScope = new EditorGUILayout.HorizontalScope ()) {
			showBorders = EditorGUILayout.Toggle ("Show Gizmos", showBorders, GUILayout.Width (200.0f));
			borderColor = EditorGUILayout.ColorField (borderColor);
		}
		hideUnchecked = EditorGUILayout.Toggle ("Hide Unchecked", hideUnchecked);
		GUILayout.Space (12.0f);
		Rect rect = GUILayoutUtility.GetLastRect ();
		GUI.color = new Color (0.0f, 0.0f, 0.0f, 0.25f);
		GUI.DrawTexture (new Rect (0.0f, rect.yMin + 6.0f, Screen.width, 4.0f), EditorGUIUtility.whiteTexture);
		GUI.DrawTexture (new Rect (0.0f, rect.yMin + 6.0f, Screen.width, 1.0f), EditorGUIUtility.whiteTexture);
		GUI.DrawTexture (new Rect (0.0f, rect.yMin + 9.0f, Screen.width, 1.0f), EditorGUIUtility.whiteTexture);
		GUI.color = Color.white;
		graphics = GameObject.FindObjectsOfType<MaskableGraphic> ();
		using (GUILayout.ScrollViewScope scrollViewScope = new GUILayout.ScrollViewScope (scrollPosition)) {
			scrollPosition = scrollViewScope.scrollPosition;
			for (int i = 0; i < graphics.Length; i++) {
				MaskableGraphic graphic = graphics [i];
				if (hideUnchecked == false || graphic.raycastTarget == true) {
					DrawElement (graphic);
				} 
			}
		}
		foreach (var item in graphics) {
			EditorUtility.SetDirty (item);
		}
		Repaint ();
	}
	private void DrawElement (MaskableGraphic graphic)
	{
		using (EditorGUILayout.HorizontalScope horizontalScope = new EditorGUILayout.HorizontalScope ()) {
			Undo.RecordObject (graphic, "Modify RaycastTarget");
			graphic.raycastTarget = EditorGUILayout.Toggle (graphic.raycastTarget, GUILayout.Width (20));
			EditorGUI.BeginDisabledGroup (true);
			EditorGUILayout.ObjectField (graphic, typeof(MaskableGraphic), true);
			EditorGUI.EndDisabledGroup ();
		}
	}
	[DrawGizmo (GizmoType.Selected | GizmoType.NonSelected)]
	private static void DrawGizmos (MaskableGraphic source, GizmoType gizmoType)
	{
		if (instance != null && instance.showBorders == true && source.raycastTarget == true) {
			Vector3[] corners = new Vector3[4];
			source.rectTransform.GetWorldCorners (corners);
			Gizmos.color = instance.borderColor;
			for (int i = 0; i < 4; i++) {
				Gizmos.DrawLine (corners [i], corners [(i + 1) % 4]);
			}
			if (Selection.activeGameObject == source.gameObject) {
				Gizmos.DrawLine (corners [0], corners [2]);
				Gizmos.DrawLine (corners [1], corners [3]);
			}
		}
		SceneView.RepaintAll ();
	}
}

使用方法很简单,打开Tools->RaycastTarget Checker,弹出主窗口,窗口下会显示场景下所有包含Raycast Target属性的组件。可以根据需要显示或隐藏Scene视图下的边框,以及设置边框颜色;也可以根据需要隐藏已经被取消勾选的UI组件。

效果图如下:

如果想了解更多一点的RaycastTarget优化技巧,可以参考此链接:http://gad.qq.com/article/detail/287947