UGUI——RaycastTarget Checker
程序员文章站
2024-03-15 14:18:59
...
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组件。
效果图如下:
上一篇: 没有IDE如何编译JAVA项目