うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Graphic の RaycastTarget が true のオブジェクトを SceneViewに描画する

あらまし

UI を作成時に 不要な箇所の Text や Image の raycastTarget が true になってしまっていることがあり
raycastTarget が true のオブジェクトが多いとそれだけパフォーマンスに問題が出るので、できるだけ無くしたい

実装後にあとから一つ一つ確認するのは手間なので 下記記事のように
raycastTarget が true なオブジェクトを描画する拡張を作成した

hacchi-man.hatenablog.com

実装

f:id:hacchi_man:20200128001123p:plain:w400

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class EditorRayCastDrawer 
{
    private const string MENU_PATH = "Tools/Show Raycast Overdraw";

    [MenuItem(MENU_PATH)]
    static void MenuAction()
    {
        EditorPrefs.SetBool(MENU_PATH, !EditorPrefs.GetBool(MENU_PATH, false));
    } 

    [MenuItem(MENU_PATH, true)]
    static bool MenuValidate()
    {
        Menu.SetChecked(MENU_PATH, EditorPrefs.GetBool(MENU_PATH, false));
        return true;
    } 
        
    private static readonly Color Color = new Color(1f, 0f, 0f, 0.1f);
    private static readonly Color wireColor = new Color(0f, 0f, 0f, 0.5f);
        
    [DrawGizmo (GizmoType.NonSelected | GizmoType.Selected)]
    private static void DrawGizmo(Graphic graphic, GizmoType type)
    {
        if (!EditorPrefs.GetBool(MENU_PATH, false))
            return;
            
        if (!graphic.raycastTarget)
            return;

        var rectTransform = graphic.transform as RectTransform;
        var size = rectTransform.rect.size;
        size.x *= rectTransform.lossyScale.x;
        size.y *= rectTransform.lossyScale.y;
        var rect = new Rect
        {
            center = (Vector2) rectTransform.position - new Vector2(rectTransform.pivot.x * size.x, rectTransform.pivot.y * size.y),
            size = size,
        };

        Gizmos.color = Color;
        Gizmos.DrawCube(rect.center, rect.size);
        Gizmos.color = wireColor;
        Gizmos.DrawWireCube(rect.center, rect.size);
    }
}