Kakoのいろいろやったこと記

主にUnity関連でやったことをかいていきます

選択したObjectのRaycastTargetを変更するEditor拡張を書きました

これはなに?

一部のUIのRaycastTargetをごっそり一括で変更したいときがありませんか?あります。あるんです。
同じComponentだと。複数選択→トグルでいいのですが、違うComponentのものも変えたくなったので書きました。
あと、Prefabビューなら最初からオフにするものを書いていたりします。
kakovail.info


f:id:Kakovail:20210118121021g:plain

使い方

スクリプトを好きなところに配置、変更したいオブジェクトを複数選択→右クリックからメニューでToggleできます。
2019.4.18で書いていますが、TryGetComponentを使わなかったので2018.1以降なら確実に動くと思います。

コード

// Copyright (c) 2021 Hiroyuki Kako
// This software is released under the MIT License, see LICENSE.

#if UNITY_EDITOR
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class SelectedRaycastChanger : EditorWindow
{
    private static int _currentCount;
    private static List<GameObject> _cachedObjects = new List<GameObject>();

    [MenuItem("GameObject/KEditorExtensions/SelectedRaycastChanger/Toggle : true", false, 20)]
    public static void ToggleRaycastTargetTrue()
    {
        var tmp = Selection.gameObjects;
        ToggleRaycastTarget(tmp, true);

        _currentCount++;
        if (_currentCount == tmp.Length) _cachedObjects.Clear();
    }

    [MenuItem("GameObject/KEditorExtensions/SelectedRaycastChanger/Toggle : false", false, 20)]
    public static void ToggleRaycastTargetFalse()
    {
        var tmp = Selection.gameObjects;
        ToggleRaycastTarget(tmp, false);

        _currentCount++;
        if (_currentCount == tmp.Length) _cachedObjects.Clear();
    }

    private static void ToggleRaycastTarget(GameObject[] selected, bool isActive)
    {
        foreach (var obj in selected)
        {
            if (_cachedObjects.Contains(obj)) continue;
            _cachedObjects.Clear();
            _cachedObjects = new List<GameObject>(selected);
            _currentCount = 0;
            break;
        }

        foreach (var cachedObject in _cachedObjects)
        {
            var target = cachedObject.GetComponent<Graphic>();
            if (target == null) continue; // you can use TryGetComponent
            target.raycastTarget = isActive;
            Debug.Log($"{cachedObject.name} 's raycast target is toggle {isActive.ToString()}", cachedObject);
        }
    }
}
#endif