Added attribute cache

This commit is contained in:
2026-01-24 12:00:50 +00:00
parent 4284fd60a2
commit 5e44caca53

View File

@@ -7,17 +7,24 @@ using UnityEngine;
namespace PashaBibko.Pacore.Editor.Drawers namespace PashaBibko.Pacore.Editor.Drawers
{ {
[CustomEditor(typeof(MonoBehaviour), editorForChildClasses: true)] public static class InspectorCallableAttributeCache
public class MonoBehaviourDrawer : UnityEditor.Editor
{ {
private const BindingFlags BINDING_FLAGS = private const BindingFlags BINDING_FLAGS =
BindingFlags.Public | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.NonPublic |
BindingFlags.Instance; BindingFlags.Instance;
private InspectorCallableAttribute[] GetTypeButtons() private static Dictionary<Type, InspectorCallableAttribute[]> Cache { get; } = new();
public static InspectorCallableAttribute[] GetAllAttributes(Type type)
{ {
Type type = target.GetType(); /* Checks the cache for the type */
if (Cache.TryGetValue(type, out InspectorCallableAttribute[] attributes))
{
return attributes;
}
/* Finds all the functions with the attribute */
MethodInfo[] methods = type.GetMethods(BINDING_FLAGS); MethodInfo[] methods = type.GetMethods(BINDING_FLAGS);
List<InspectorCallableAttribute> buttons = new(); List<InspectorCallableAttribute> buttons = new();
@@ -30,14 +37,27 @@ namespace PashaBibko.Pacore.Editor.Drawers
} }
} }
return buttons.ToArray(); /* Adds it to the cache before returning */
InspectorCallableAttribute[] array = buttons.ToArray();
Cache.Add(type, array);
return array;
} }
}
[CustomEditor(typeof(MonoBehaviour), editorForChildClasses: true)]
public class MonoBehaviourDrawer : UnityEditor.Editor
{
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
DrawDefaultInspector(); DrawDefaultInspector();
InspectorCallableAttribute[] buttons = GetTypeButtons(); Type type = target.GetType();
DrawFunctionButtons(type);
}
public static void DrawFunctionButtons(Type type)
{
InspectorCallableAttribute[] buttons = InspectorCallableAttributeCache.GetAllAttributes(type);
if (buttons.Length == 0) if (buttons.Length == 0)
{ {
return; return;