using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using ABI.CCK.Components; using UnityEngine; namespace ABI.CCK.Scripts.Editor { public static class CCK_ComponentRegistry { private static readonly HashSet _monoBehaviourComponentTypes = new HashSet(); private static readonly HashSet _stateMachineBehaviourComponentTypes = new HashSet(); static CCK_ComponentRegistry() { PopulateCCKComponentTypes(); } private static void PopulateCCKComponentTypes() { // Getting all types that are assignable to ICCK_Component Assembly targetAssembly = typeof(ICCK_Component).Assembly; var componentTypes = targetAssembly.GetTypes() .Where(t => typeof(ICCK_Component).IsAssignableFrom(t) && !t.IsAbstract && t.IsClass); foreach (Type type in componentTypes) { if (typeof(MonoBehaviour).IsAssignableFrom(type)) { _monoBehaviourComponentTypes.Add(type); } // StateMachineBehaviour is not a "component", but its used by the CCK else if (typeof(StateMachineBehaviour).IsAssignableFrom(type)) { _stateMachineBehaviourComponentTypes.Add(type); } } //Debug.Log($"Populated MonoBehaviour Component Types: {_monoBehaviourComponentTypes.Count}"); //Debug.Log($"Populated StateMachineBehaviour Component Types: {_stateMachineBehaviourComponentTypes.Count}"); } public static IEnumerable GetMonoBehaviourComponentTypes() { return _monoBehaviourComponentTypes; } public static IEnumerable GetStateMachineBehaviourComponentTypes() { return _stateMachineBehaviourComponentTypes; } } }