fix: universe entrance issues caused by wrong logic
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user