うにてぃブログ

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

【Unity】Hierarchy 上で選択したオブジェクトのもつ RaycastTarget をすべて false にする

uGUI では UI最適化 にあるように、Raycast が不要な オブジェクトに対して Raycast Target をつけることは最適とされていません

しかし Unity はオブジェクトを生成時にデフォルトで true にしてしまうためわざわざチェックを外すのが面倒になる

そのため、オブエジェクトを選択して実行すれば、すべての Raycast Target を false にしてくれるツールを作成

ボタンがある場合は true のままにしたいとかもあると思うので、そういったこともできるようなのを追加しました

using UnityEditor;
using UnityEngine.UI;

public static class GraphicTool
{
    [MenuItem("Tools/SetRaycastDisable")]
    private static void SetRaycastDisable()
    {
        foreach (var obj in Selection.gameObjects)
        {
            var graphics = obj.GetComponentsInChildren<Graphic>();
            foreach (var graphic in graphics)
            {
                graphic.raycastTarget = false;
            }
        }
    }
  
    // ボタンがあれば Raycast を false にしない   
    [MenuItem("Tools/SetRaycastDisableNoButton")]
    private static void SetRaycastDisableNoButton()
    {
        foreach (var obj in Selection.gameObjects)
        {
            var graphics = obj.GetComponentsInChildren<Graphic>();
            foreach (var graphic in graphics)
            {
                if (graphic.GetComponent<Button>() != null)
                    continue;
                
                graphic.raycastTarget = false;
            }
        }
    }
}

ScrollView 等でも利用することがあると思うので、ちゃんとやりたい場合は独自にコードを記述する必要があります