当前位置: 代码迷 >> 综合 >> UGUI——RaycastTarget Checker
  详细解决方案

UGUI——RaycastTarget Checker

热度:42   发布时间:2024-01-19 12:17:31.0

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

效果图如下:

这里写图片描述