cvr-props/Assets/ABI.CCK/Scripts/Editor/CCK_GizmoFix.cs

60 lines
No EOL
2.3 KiB
C#
Executable file

using System.Reflection;
using UnityEditor;
using System;
namespace ABI.CCK.Scripts.Editor
{
public static class CCK_GizmoFix
{
// TODO: Unity 2022.1 will have a new API for this, so we can remove this reflection hack.
// https://docs.unity3d.com/2022.2/Documentation/ScriptReference/GizmoUtility.SetGizmoEnabled.html
#region SetGizmoIconEnabled Reflection Hack
private static MethodInfo _setIconEnabledMethod;
private static MethodInfo SetIconEnabledMethod
{
get
{
if (_setIconEnabledMethod != null)
return _setIconEnabledMethod;
_setIconEnabledMethod = Assembly.GetAssembly(typeof(UnityEditor.Editor))
?.GetType("UnityEditor.AnnotationUtility")
?.GetMethod("SetIconEnabled", BindingFlags.Static | BindingFlags.NonPublic);
return _setIconEnabledMethod;
}
}
private static void SetGizmoIconEnabled(Type type, bool on)
{
if (SetIconEnabledMethod == null) return;
const int MONO_BEHAVIOR_CLASS_ID = 114; // https://docs.unity3d.com/Manual/ClassIDReference.html
// "Annotation not found" - type has no custom gizmo icon set.
SetIconEnabledMethod.Invoke(null, new object[] { MONO_BEHAVIOR_CLASS_ID, type.Name, on ? 1 : 0 });
// if Unity.VisualScripting is installed, we have to use this method instead:
// AnnotationUtility.Annotation annotation = AnnotationUtility.GetAnnotation(type);
// if (annotation != null) annotation.iconEnabled = on;
}
#endregion
internal static void SetGizmoIcons(bool show)
{
bool proceed = EditorUtility.DisplayDialog(
"CCK :: Gizmo Fix",
$"Are you sure you want to {(show ? "enable" : "disable")} all Gizmo icons? This will {(show ? "show" : "hide")} all `CVR` component icons in the scene view.",
"Yes", "No");
if (!proceed)
return;
foreach (Type type in CCK_ComponentRegistry.GetMonoBehaviourComponentTypes())
SetGizmoIconEnabled(type, show);
}
}
}