diff --git a/Assets/Plugins/EventBus/EventBus.cs b/Assets/Plugins/EventBus/EventBus.cs index 7223165..508214d 100644 --- a/Assets/Plugins/EventBus/EventBus.cs +++ b/Assets/Plugins/EventBus/EventBus.cs @@ -6,11 +6,23 @@ namespace EventBus using UnityEngine; using EventBus.Internal; using System.Collections; + using UnityEngine.Pool; #if UNITY_EDITOR using UnityEditor; #endif + /// + /// Marks an assembly containing EventBus types. + /// Used to identify relevant assemblies for the EventBus system cleanup steps. + /// + [AttributeUsage(AttributeTargets.Assembly)] + public class EventBusAssemblyAttribute : Attribute + { + + } + + public static class EventBusUtility { public static IReadOnlyList EventTypes { get; private set; } @@ -39,47 +51,30 @@ private static void HandleEditorStateChange(PlayModeStateChange state) public static void Init() { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - Type[] assemblyCSharp = null; - Type[] assemblyCSharpFirstpass = null; + List assemblyTypesToScan = ListPool.Get(); for (int i = 0; i < assemblies.Length; i++) { - if (assemblies[i].GetName().Name == "Assembly-CSharp") - assemblyCSharp = assemblies[i].GetTypes(); - else - if (assemblies[i].GetName().Name == "Assembly-CSharp-firstpass") - assemblyCSharpFirstpass = assemblies[i].GetTypes(); - - if (assemblyCSharp != null && assemblyCSharpFirstpass != null) - break; + if (assemblies[i].GetName().Name == "Assembly-CSharp" + || assemblies[i].GetName().Name == "Assembly-CSharp-firstpass" + || assemblies[i].GetCustomAttribute() is not null) + assemblyTypesToScan.Add(assemblies[i].GetTypes()); } List eventTypes = new List(); - - if (assemblyCSharp != null) + foreach (var assemblyTypes in assemblyTypesToScan) { - for (int i = 0; i < assemblyCSharp.Length; i++) + for (int i = 0; i < assemblyTypes.Length; i++) { - var type = assemblyCSharp[i].GetType(); + var type = assemblyTypes[i]; if ((typeof(IEvent)) != type && (typeof(IEvent)).IsAssignableFrom(type)) { eventTypes.Add(type); } } - } - if (assemblyCSharpFirstpass != null) - { - for (int i = 0; i < assemblyCSharpFirstpass.Length; i++) - { - var type = assemblyCSharpFirstpass[i].GetType(); - if ((typeof(IEvent)) != type && (typeof(IEvent)).IsAssignableFrom(type)) - { - eventTypes.Add(type); - } - } } - + ListPool.Release(assemblyTypesToScan); EventTypes = eventTypes; List staticEventBusesTypes = new List(); @@ -98,7 +93,7 @@ public static void ClearAllBuses() { for (int i = 0; i < StaticEventBusesTypes.Count; i++) { - var type = EventTypes[i]; + var type = StaticEventBusesTypes[i]; var clearMethod = type.GetMethod("Clear", BindingFlags.Static | BindingFlags.NonPublic); clearMethod.Invoke(null, null); } diff --git a/README.md b/README.md index fe683ac..f081cce 100644 --- a/README.md +++ b/README.md @@ -89,4 +89,12 @@ public class EventBusTest : MonoBehaviour } ``` +4. Using Assembly Definitions + +once in your custom assembly mark the assembly, such that it can be cleaned up properly in the Editor even without Domain reload + +``` +[assembly: EventBus.EventBusAssembly()] +``` +