fix: universe entrance issues caused by wrong logic

This commit is contained in:
2026-01-26 12:15:42 +03:00
parent 1a8f396766
commit ee58e60ef1

View File

@@ -9,9 +9,7 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent
private static System.Func<IBehaviour, int> GetPriority() => (b) => b.Priority; private static System.Func<IBehaviour, int> GetPriority() => (b) => b.Priority;
private readonly ActiveBehaviourCollectorOrdered<int, IEnterUniverse> enterUniverses = new(GetPriority(), SortByAscendingPriority()); private readonly ActiveBehaviourCollectorOrdered<int, IEnterUniverse> enterUniverses = new(GetPriority(), SortByAscendingPriority());
private readonly ActiveBehaviourCollectorOrdered<int, IExitUniverse> exitUniverses = new(GetPriority(), SortByAscendingPriority());
private readonly List<IEnterUniverse> toCallEnterUniverses = new(32);
private readonly List<IExitUniverse> toCallExitUniverses = new(32);
protected override void OnEnteredUniverse(IUniverse universe) 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. // 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."); 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); enterUniverses.Assign(universe);
exitUniverses.Assign(universe);
foreach (IUniverseObject universeObject in universe)
OnUniverseObjectRegistered(universe, new(universeObject));
universe.OnUniverseObjectRegistered.AddListener(OnUniverseObjectRegistered);
universe.OnUniverseObjectUnRegistered.AddListener(OnUniverseObjectUnRegistered);
} }
protected override void OnExitedUniverse(IUniverse universe) protected override void OnExitedUniverse(IUniverse universe)
{ {
enterUniverses.Unassign(); enterUniverses.Unassign();
exitUniverses.Unassign();
foreach (IUniverseObject universeObject in universe)
OnUniverseObjectUnRegistered(universe, new(universeObject));
universe.OnUniverseObjectRegistered.RemoveListener(OnUniverseObjectRegistered);
universe.OnUniverseObjectUnRegistered.RemoveListener(OnUniverseObjectUnRegistered);
} }
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<IEnterUniverse> sender, IBehaviourCollector<IEnterUniverse>.BehaviourCollectedArguments args) private void OnEnterUniverseCollected(IBehaviourCollector<IEnterUniverse> sender, IBehaviourCollector<IEnterUniverse>.BehaviourCollectedArguments args)
{ => args.BehaviourCollected.EnterUniverse(Universe);
toCallEnterUniverses.Add(args.BehaviourCollected);
} private void OnExitUniverseRemoved(IBehaviourCollector<IExitUniverse> sender, IBehaviourCollector<IExitUniverse>.BehaviourRemovedArguments args)
=> args.BehaviourRemoved.ExitUniverse(Universe);
public UniverseEntranceManager() public UniverseEntranceManager()
{ {
enterUniverses.OnCollected.AddListener(OnEnterUniverseCollected); enterUniverses.OnCollected.AddListener(OnEnterUniverseCollected);
exitUniverses.OnRemoved.AddListener(OnExitUniverseRemoved);
} }
} }