欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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组件。

效果图如下:

UGUI——RaycastTarget Checker

上一篇: 没有IDE如何编译JAVA项目

下一篇: