選択したObjectのRaycastTargetを変更するEditor拡張を書きました
これはなに?
一部のUIのRaycastTargetをごっそり一括で変更したいときがありませんか?あります。あるんです。
同じComponentだと。複数選択→トグルでいいのですが、違うComponentのものも変えたくなったので書きました。
あと、Prefabビューなら最初からオフにするものを書いていたりします。
使い方
スクリプトを好きなところに配置、変更したいオブジェクトを複数選択→右クリックからメニューで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