diff --git a/Engine.Core/Systems/UniverseEntranceManager.cs b/Engine.Core/Systems/UniverseEntranceManager.cs index 85f579e..e2919e1 100644 --- a/Engine.Core/Systems/UniverseEntranceManager.cs +++ b/Engine.Core/Systems/UniverseEntranceManager.cs @@ -9,9 +9,7 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent private static System.Func GetPriority() => (b) => b.Priority; private readonly ActiveBehaviourCollectorOrdered enterUniverses = new(GetPriority(), SortByAscendingPriority()); - - private readonly List toCallEnterUniverses = new(32); - private readonly List toCallExitUniverses = new(32); + private readonly ActiveBehaviourCollectorOrdered exitUniverses = new(GetPriority(), SortByAscendingPriority()); protected override void OnEnteredUniverse(IUniverse universe) { @@ -20,54 +18,23 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent // event it tries to call OnUniverseObjectRegistered again on the same object, causing a duplicate entry error. Debug.Assert.AssertTrue(BehaviourController.Count == 1, $"{nameof(UniverseEntranceManager)} must be in it's own {nameof(IUniverseObject)} with no other {nameof(IBehaviour)}s attached at the moment. Failing to do so might cause instantiation or serialization issues."); enterUniverses.Assign(universe); - - foreach (IUniverseObject universeObject in universe) - OnUniverseObjectRegistered(universe, new(universeObject)); - - universe.OnUniverseObjectRegistered.AddListener(OnUniverseObjectRegistered); - universe.OnUniverseObjectUnRegistered.AddListener(OnUniverseObjectUnRegistered); + exitUniverses.Assign(universe); } protected override void OnExitedUniverse(IUniverse universe) { enterUniverses.Unassign(); - - foreach (IUniverseObject universeObject in universe) - OnUniverseObjectUnRegistered(universe, new(universeObject)); - - universe.OnUniverseObjectRegistered.RemoveListener(OnUniverseObjectRegistered); - universe.OnUniverseObjectUnRegistered.RemoveListener(OnUniverseObjectUnRegistered); + exitUniverses.Unassign(); } - - private void OnUniverseObjectUnRegistered(IUniverse sender, IUniverse.UniverseObjectUnRegisteredArguments args) - { - args.UniverseObjectUnregistered.BehaviourController.GetBehavioursInChildren(toCallExitUniverses); - - for (int i = toCallExitUniverses.Count - 1; i >= 0; i--) - { - IExitUniverse exitUniverse = toCallExitUniverses[i]; - toCallExitUniverses.RemoveAt(i); - exitUniverse.ExitUniverse(Universe); - } - } - - private void OnUniverseObjectRegistered(IUniverse sender, IUniverse.UniverseObjectRegisteredArguments args) - { - for (int i = toCallEnterUniverses.Count - 1; i >= 0; i--) - { - IEnterUniverse enterUniverse = toCallEnterUniverses[i]; - toCallEnterUniverses.RemoveAt(i); - enterUniverse.EnterUniverse(Universe); - } - } - private void OnEnterUniverseCollected(IBehaviourCollector sender, IBehaviourCollector.BehaviourCollectedArguments args) - { - toCallEnterUniverses.Add(args.BehaviourCollected); - } + => args.BehaviourCollected.EnterUniverse(Universe); + + private void OnExitUniverseRemoved(IBehaviourCollector sender, IBehaviourCollector.BehaviourRemovedArguments args) + => args.BehaviourRemoved.ExitUniverse(Universe); public UniverseEntranceManager() { enterUniverses.OnCollected.AddListener(OnEnterUniverseCollected); + exitUniverses.OnRemoved.AddListener(OnExitUniverseRemoved); } }