6 Commits

Author SHA1 Message Date
ce3cc895f4 fix: tween reset caused issues 2025-05-30 23:44:59 +03:00
76ad60fad3 perf: tween pooling 2025-05-30 20:55:09 +03:00
1b123a3cc0 chore: get init to only get for events 2025-05-30 20:13:32 +03:00
0d61735ae5 fix: button input methods having wrong signatures 2025-05-30 19:57:37 +03:00
b5140a94de Amend Me 2025-05-30 18:37:35 +03:00
846aa75dd5 perf: regular events to custom events 2025-05-30 13:06:11 +03:00
22 changed files with 192 additions and 322 deletions

View File

@@ -10,11 +10,11 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
public Event<IHasUniverse> OnUniverseAssigned { get; } = new(); public Event<IHasUniverse> OnUniverseAssigned { get; } = new();
public Event<IAssignable>? OnUnassigned { get; } = new(); public Event<IAssignable>? OnUnassigned { get; } = new();
private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler delegateOnBehaviourAdded = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler cachedOnBehaviourAdded = null!;
private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler delegateOnBehaviourRemoved = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler cachedOnBehaviourRemoved = null!;
private readonly Event<IActive, IActive.ActiveChangedArguments>.EventHandler delegateOnBehaviourStateChanged = null!; private readonly Event<IActive, IActive.ActiveChangedArguments>.EventHandler cachedOnBehaviourStateChanged = null!;
private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler delegateOnUniverseObjectRegistered = null!; private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler cachedOnUniverseObjectRegistered = null!;
private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler delegateOnUniverseObjectUnregistered = null!; private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler cachedOnUniverseObjectUnregistered = null!;
private readonly List<T> monitoringBehaviours = new(32); private readonly List<T> monitoringBehaviours = new(32);
protected readonly List<T> activeBehaviours = new(32); protected readonly List<T> activeBehaviours = new(32);
@@ -22,47 +22,46 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
public IUniverse Universe { get; private set; } = null!; public IUniverse Universe { get; private set; } = null!;
private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments args) private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments arguments)
{ {
IUniverseObject universeObject = args.UniverseObjectRegistered; IUniverseObject universeObject = arguments.UniverseObjectRegistered;
universeObject.BehaviourController.OnBehaviourAdded.AddListener(delegateOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded);
universeObject.BehaviourController.OnBehaviourRemoved.AddListener(delegateOnBehaviourRemoved); universeObject.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved);
for (int i = 0; i < universeObject.BehaviourController.Count; i++) for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i]));
} }
private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments args) private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments arguments)
{ {
IUniverseObject universeObject = args.UniverseObjectUnregistered; IUniverseObject universeObject = arguments.UniverseObjectUnregistered;
universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded);
universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved); universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved);
for (int i = 0; i < universeObject.BehaviourController.Count; i++) for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i]));
} }
protected virtual void OnBehaviourAdd(IBehaviour behaviour) { } protected virtual void OnBehaviourAdd(IBehaviour behaviour) { }
private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments args) private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments arguments)
{ {
if (args.BehaviourAdded is not T tBehaviour) if (arguments.BehaviourAdded is not T tBehaviour)
return; return;
monitoringBehaviours.Add(tBehaviour); monitoringBehaviours.Add(tBehaviour);
monitoringActiveToBehaviour.Add(tBehaviour, tBehaviour); monitoringActiveToBehaviour.Add(tBehaviour, tBehaviour);
tBehaviour.OnActiveChanged.AddListener(delegateOnBehaviourStateChanged); tBehaviour.OnActiveChanged.AddListener(cachedOnBehaviourStateChanged);
OnBehaviourStateChanged(tBehaviour, new(!tBehaviour.IsActive)); OnBehaviourStateChanged(tBehaviour, new(!tBehaviour.IsActive));
} }
protected virtual void AddBehaviour(T behaviour) => activeBehaviours.Add(behaviour); private void OnBehaviourStateChanged(IActive sender, IActive.ActiveChangedArguments arguments)
private void OnBehaviourStateChanged(IActive sender, IActive.ActiveChangedArguments args)
{ {
T behaviour = monitoringActiveToBehaviour[sender]; T behaviour = monitoringActiveToBehaviour[sender];
if (sender.IsActive) if (sender.IsActive)
{ {
AddBehaviour(behaviour); activeBehaviours.Add(behaviour);
OnBehaviourAdd(behaviour); OnBehaviourAdd(behaviour);
OnCollected?.Invoke(this, new(behaviour)); OnCollected?.Invoke(this, new(behaviour));
} }
@@ -74,15 +73,15 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
} }
protected virtual void OnBehaviourRemove(IBehaviour behaviour) { } protected virtual void OnBehaviourRemove(IBehaviour behaviour) { }
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments args) private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments arguments)
{ {
if (args.BehaviourRemoved is not T tBehaviour) if (arguments.BehaviourRemoved is not T tBehaviour)
return; return;
if (!monitoringBehaviours.Remove(tBehaviour) || !monitoringActiveToBehaviour.Remove(tBehaviour)) if (!monitoringBehaviours.Remove(tBehaviour) || !monitoringActiveToBehaviour.Remove(tBehaviour))
return; return;
tBehaviour.OnActiveChanged.RemoveListener(delegateOnBehaviourStateChanged); tBehaviour.OnActiveChanged.RemoveListener(cachedOnBehaviourStateChanged);
if (activeBehaviours.Remove(tBehaviour)) if (activeBehaviours.Remove(tBehaviour))
{ {
OnBehaviourRemove(tBehaviour); OnBehaviourRemove(tBehaviour);
@@ -98,8 +97,8 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
foreach (IUniverseObject universeObject in universe.UniverseObjects) foreach (IUniverseObject universeObject in universe.UniverseObjects)
OnUniverseObjectRegistered(universe, new(universeObject)); OnUniverseObjectRegistered(universe, new(universeObject));
universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered); universe.OnUniverseObjectRegistered.AddListener(cachedOnUniverseObjectRegistered);
universe.OnUniverseObjectUnRegistered.AddListener(delegateOnUniverseObjectUnregistered); universe.OnUniverseObjectUnRegistered.AddListener(cachedOnUniverseObjectUnregistered);
Universe = universe; Universe = universe;
OnUniverseAssigned?.Invoke(this); OnUniverseAssigned?.Invoke(this);
@@ -115,8 +114,8 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
foreach (IUniverseObject universeObject in Universe.UniverseObjects) foreach (IUniverseObject universeObject in Universe.UniverseObjects)
OnUniverseObjectUnregistered(Universe, new(universeObject)); OnUniverseObjectUnregistered(Universe, new(universeObject));
Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered); Universe.OnUniverseObjectRegistered.RemoveListener(cachedOnUniverseObjectRegistered);
Universe.OnUniverseObjectUnRegistered.RemoveListener(delegateOnUniverseObjectUnregistered); Universe.OnUniverseObjectUnRegistered.RemoveListener(cachedOnUniverseObjectUnregistered);
Universe = null!; Universe = null!;
OnUnassigned?.Invoke(this); OnUnassigned?.Invoke(this);
@@ -128,21 +127,10 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
public ActiveBehaviourCollector() public ActiveBehaviourCollector()
{ {
delegateOnBehaviourAdded = OnBehaviourAdded; cachedOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved; cachedOnBehaviourRemoved = OnBehaviourRemoved;
delegateOnBehaviourStateChanged = OnBehaviourStateChanged; cachedOnBehaviourStateChanged = OnBehaviourStateChanged;
delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered; cachedOnUniverseObjectRegistered = OnUniverseObjectRegistered;
delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered; cachedOnUniverseObjectUnregistered = OnUniverseObjectUnregistered;
}
public ActiveBehaviourCollector(IUniverse universe)
{
delegateOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved;
delegateOnBehaviourStateChanged = OnBehaviourStateChanged;
delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered;
delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered;
Assign(universe);
} }
} }

View File

@@ -1,14 +1,11 @@
using System; using System;
using System.Collections.Generic;
namespace Syntriax.Engine.Core; namespace Syntriax.Engine.Core;
public class ActiveBehaviourCollectorSorted<T> : ActiveBehaviourCollector<T> where T : class, IBehaviour public class ActiveBehaviourCollectorSorted<T> : ActiveBehaviourCollector<T> where T : class, IBehaviour
{ {
private readonly Event<IBehaviour, IBehaviour.PriorityChangedArguments>.EventHandler delegateOnPriorityChanged = null!; private Comparison<T>? _sortBy = null;
public Comparison<T>? SortBy
private IComparer<T>? _sortBy = null;
public IComparer<T>? SortBy
{ {
get => _sortBy; get => _sortBy;
set set
@@ -20,48 +17,9 @@ public class ActiveBehaviourCollectorSorted<T> : ActiveBehaviourCollector<T> whe
} }
} }
protected override void AddBehaviour(T behaviour)
{
if (SortBy is null)
{
activeBehaviours.Add(behaviour);
return;
}
int insertionIndex = activeBehaviours.BinarySearch(behaviour, SortBy);
if (insertionIndex < 0)
insertionIndex = ~insertionIndex;
activeBehaviours.Insert(insertionIndex, behaviour);
}
protected override void OnBehaviourAdd(IBehaviour behaviour) protected override void OnBehaviourAdd(IBehaviour behaviour)
{ {
behaviour.OnPriorityChanged.AddListener(delegateOnPriorityChanged); if (SortBy is not null)
} activeBehaviours.Sort(SortBy);
protected override void OnBehaviourRemove(IBehaviour behaviour)
{
behaviour.OnPriorityChanged.RemoveListener(delegateOnPriorityChanged);
}
private void OnPriorityChanged(IBehaviour sender, IBehaviour.PriorityChangedArguments args)
{
T behaviour = (T)sender;
activeBehaviours.Remove(behaviour);
AddBehaviour(behaviour);
}
public ActiveBehaviourCollectorSorted()
{
delegateOnPriorityChanged = OnPriorityChanged;
}
public ActiveBehaviourCollectorSorted(IUniverse universe, Comparison<T> sortBy) : base(universe)
{
delegateOnPriorityChanged = OnPriorityChanged;
SortBy = Comparer<T>.Create(sortBy);
} }
} }

View File

@@ -7,8 +7,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate,
protected IUniverse Universe => BehaviourController.UniverseObject.Universe; protected IUniverse Universe => BehaviourController.UniverseObject.Universe;
protected IUniverseObject UniverseObject => BehaviourController.UniverseObject; protected IUniverseObject UniverseObject => BehaviourController.UniverseObject;
private readonly Event<IUniverseObject, IUniverseObject.EnteredUniverseArguments>.EventHandler delegateEnteredUniverse = null!; private readonly Event<IUniverseObject, IUniverseObject.EnteredUniverseArguments>.EventHandler cachedEnteredUniverse = null!;
private readonly Event<IUniverseObject, IUniverseObject.ExitedUniverseArguments>.EventHandler delegateExitedUniverse = null!; private readonly Event<IUniverseObject, IUniverseObject.ExitedUniverseArguments>.EventHandler cachedExitedUniverse = null!;
public Behaviour() public Behaviour()
{ {
@@ -16,8 +16,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate,
OnFinalized.AddListener(OnFinalize); OnFinalized.AddListener(OnFinalize);
OnUnassigned.AddListener(OnUnassign); OnUnassigned.AddListener(OnUnassign);
delegateEnteredUniverse = EnteredUniverse; cachedEnteredUniverse = EnteredUniverse;
delegateExitedUniverse = ExitedUniverse; cachedExitedUniverse = ExitedUniverse;
} }
protected virtual void OnUnassign() { } protected virtual void OnUnassign() { }
@@ -26,8 +26,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate,
protected virtual void OnInitialize() { } protected virtual void OnInitialize() { }
protected virtual void OnInitialize(IInitializable _) protected virtual void OnInitialize(IInitializable _)
{ {
BehaviourController.UniverseObject.OnEnteredUniverse.AddListener(delegateEnteredUniverse); BehaviourController.UniverseObject.OnEnteredUniverse.AddListener(cachedEnteredUniverse);
BehaviourController.UniverseObject.OnExitedUniverse.AddListener(delegateExitedUniverse); BehaviourController.UniverseObject.OnExitedUniverse.AddListener(cachedExitedUniverse);
OnInitialize(); OnInitialize();
@@ -38,8 +38,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate,
protected virtual void OnFinalize() { } protected virtual void OnFinalize() { }
protected virtual void OnFinalize(IInitializable _) protected virtual void OnFinalize(IInitializable _)
{ {
BehaviourController.UniverseObject.OnEnteredUniverse.RemoveListener(delegateEnteredUniverse); BehaviourController.UniverseObject.OnEnteredUniverse.RemoveListener(cachedEnteredUniverse);
BehaviourController.UniverseObject.OnExitedUniverse.RemoveListener(delegateExitedUniverse); BehaviourController.UniverseObject.OnExitedUniverse.RemoveListener(cachedExitedUniverse);
OnFinalize(); OnFinalize();
@@ -139,8 +139,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate,
} }
protected virtual void OnEnteredUniverse(IUniverse universe) { } protected virtual void OnEnteredUniverse(IUniverse universe) { }
protected virtual void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments args) => OnEnteredUniverse(args.Universe); protected virtual void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments arguments) => OnEnteredUniverse(arguments.Universe);
protected virtual void OnExitedUniverse(IUniverse universe) { } protected virtual void OnExitedUniverse(IUniverse universe) { }
protected virtual void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments args) => OnExitedUniverse(args.Universe); protected virtual void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments arguments) => OnExitedUniverse(arguments.Universe);
} }

View File

@@ -17,6 +17,6 @@ public abstract class Behaviour2D : Behaviour, IBehaviour2D
} }
protected sealed override void OnUnassign(IAssignable assignable) => base.OnUnassign(assignable); protected sealed override void OnUnassign(IAssignable assignable) => base.OnUnassign(assignable);
protected sealed override void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments args) => base.EnteredUniverse(sender, args); protected sealed override void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments arguments) => base.EnteredUniverse(sender, arguments);
protected sealed override void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments args) => base.ExitedUniverse(sender, args); protected sealed override void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments arguments) => base.ExitedUniverse(sender, arguments);
} }

View File

@@ -7,9 +7,9 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
public Event<IActive, IActive.ActiveChangedArguments> OnActiveChanged { get; } = new(); public Event<IActive, IActive.ActiveChangedArguments> OnActiveChanged { get; } = new();
public Event<IHasBehaviourController> OnBehaviourControllerAssigned { get; } = new(); public Event<IHasBehaviourController> OnBehaviourControllerAssigned { get; } = new();
private readonly Event<IHasUniverseObject>.EventHandler delegateOnUniverseObjectAssigned = null!; private readonly Event<IHasUniverseObject>.EventHandler cachedOnUniverseObjectAssigned = null!;
private readonly Event<IActive, IActive.ActiveChangedArguments>.EventHandler delegateOnUniverseObjectActiveChanged = null!; private readonly Event<IActive, IActive.ActiveChangedArguments>.EventHandler cachedOnUniverseObjectActiveChanged = null!;
private readonly Event<IStateEnable, IStateEnable.EnabledChangedArguments>.EventHandler delegateOnStateEnabledChanged = null!; private readonly Event<IStateEnable, IStateEnable.EnabledChangedArguments>.EventHandler cachedOnStateEnabledChanged = null!;
private IBehaviourController _behaviourController = null!; private IBehaviourController _behaviourController = null!;
public IBehaviourController BehaviourController => _behaviourController; public IBehaviourController BehaviourController => _behaviourController;
@@ -40,7 +40,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
_behaviourController = behaviourController; _behaviourController = behaviourController;
OnAssign(behaviourController); OnAssign(behaviourController);
behaviourController.OnUniverseObjectAssigned.AddListener(delegateOnUniverseObjectAssigned); behaviourController.OnUniverseObjectAssigned.AddListener(cachedOnUniverseObjectAssigned);
if (behaviourController.UniverseObject is not null) if (behaviourController.UniverseObject is not null)
OnUniverseObjectAssigned(behaviourController); OnUniverseObjectAssigned(behaviourController);
OnBehaviourControllerAssigned?.Invoke(this); OnBehaviourControllerAssigned?.Invoke(this);
@@ -49,7 +49,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
private void OnUniverseObjectAssigned(IHasUniverseObject sender) private void OnUniverseObjectAssigned(IHasUniverseObject sender)
{ {
sender.UniverseObject.OnActiveChanged.AddListener(delegateOnUniverseObjectActiveChanged); sender.UniverseObject.OnActiveChanged.AddListener(cachedOnUniverseObjectActiveChanged);
UpdateActive(); UpdateActive();
} }
@@ -57,14 +57,14 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
{ {
base.OnAssign(stateEnable); base.OnAssign(stateEnable);
stateEnable.OnEnabledChanged.AddListener(delegateOnStateEnabledChanged); stateEnable.OnEnabledChanged.AddListener(cachedOnStateEnabledChanged);
} }
protected override void UnassignInternal() protected override void UnassignInternal()
{ {
BehaviourController.UniverseObject.OnActiveChanged.RemoveListener(delegateOnUniverseObjectActiveChanged); BehaviourController.UniverseObject.OnActiveChanged.RemoveListener(cachedOnUniverseObjectActiveChanged);
StateEnable.OnEnabledChanged.RemoveListener(delegateOnStateEnabledChanged); StateEnable.OnEnabledChanged.RemoveListener(cachedOnStateEnabledChanged);
BehaviourController.OnUniverseObjectAssigned.RemoveListener(delegateOnUniverseObjectAssigned); BehaviourController.OnUniverseObjectAssigned.RemoveListener(cachedOnUniverseObjectAssigned);
base.UnassignInternal(); base.UnassignInternal();
_behaviourController = null!; _behaviourController = null!;
} }
@@ -75,8 +75,8 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
Debug.Assert.AssertStateEnableAssigned(this); Debug.Assert.AssertStateEnableAssigned(this);
} }
private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments args) => UpdateActive(); private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments arguments) => UpdateActive();
private void OnUniverseObjectActiveChanged(IActive sender, IActive.ActiveChangedArguments args) => UpdateActive(); private void OnUniverseObjectActiveChanged(IActive sender, IActive.ActiveChangedArguments arguments) => UpdateActive();
private void UpdateActive() private void UpdateActive()
{ {
@@ -89,8 +89,8 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
protected BehaviourBase() protected BehaviourBase()
{ {
delegateOnUniverseObjectAssigned = OnUniverseObjectAssigned; cachedOnUniverseObjectAssigned = OnUniverseObjectAssigned;
delegateOnUniverseObjectActiveChanged = OnUniverseObjectActiveChanged; cachedOnUniverseObjectActiveChanged = OnUniverseObjectActiveChanged;
delegateOnStateEnabledChanged = OnStateEnabledChanged; cachedOnStateEnabledChanged = OnStateEnabledChanged;
} }
} }

View File

@@ -10,59 +10,58 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
public Event<IHasUniverse> OnUniverseAssigned { get; } = new(); public Event<IHasUniverse> OnUniverseAssigned { get; } = new();
public Event<IAssignable>? OnUnassigned { get; } = new(); public Event<IAssignable>? OnUnassigned { get; } = new();
private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler delegateOnBehaviourAdded = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler cachedOnBehaviourAdded = null!;
private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler delegateOnBehaviourRemoved = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler cachedOnBehaviourRemoved = null!;
private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler delegateOnUniverseObjectRegistered = null!; private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler cachedOnUniverseObjectRegistered = null!;
private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler delegateOnUniverseObjectUnregistered = null!; private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler cachedOnUniverseObjectUnregistered = null!;
protected readonly List<T> behaviours = new(32); protected readonly List<T> behaviours = new(32);
public IUniverse Universe { get; private set; } = null!; public IUniverse Universe { get; private set; } = null!;
private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments args) private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments arguments)
{ {
IUniverseObject universeObject = args.UniverseObjectRegistered; IUniverseObject universeObject = arguments.UniverseObjectRegistered;
universeObject.BehaviourController.OnBehaviourAdded.AddListener(delegateOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded);
universeObject.BehaviourController.OnBehaviourRemoved.AddListener(delegateOnBehaviourRemoved); universeObject.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved);
for (int i = 0; i < universeObject.BehaviourController.Count; i++) for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i]));
} }
private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments args) private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments arguments)
{ {
IUniverseObject universeObject = args.UniverseObjectUnregistered; IUniverseObject universeObject = arguments.UniverseObjectUnregistered;
universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded);
universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved); universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved);
for (int i = 0; i < universeObject.BehaviourController.Count; i++) for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i]));
} }
protected virtual void AddBehaviour(T behaviour) => behaviours.Add(behaviour);
protected virtual void OnBehaviourAdd(IBehaviour behaviour) { } protected virtual void OnBehaviourAdd(IBehaviour behaviour) { }
private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments args) private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments arguments)
{ {
if (args.BehaviourAdded is not T tBehaviour) if (arguments.BehaviourAdded is not T tBehaviour)
return; return;
AddBehaviour(tBehaviour); behaviours.Add(tBehaviour);
OnBehaviourAdd(args.BehaviourAdded); OnBehaviourAdd(arguments.BehaviourAdded);
OnCollected?.Invoke(this, new(tBehaviour)); OnCollected?.Invoke(this, new(tBehaviour));
} }
protected virtual void OnBehaviourRemove(IBehaviour behaviour) { } protected virtual void OnBehaviourRemove(IBehaviour behaviour) { }
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments args) private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments arguments)
{ {
if (args.BehaviourRemoved is not T tBehaviour) if (arguments.BehaviourRemoved is not T tBehaviour)
return; return;
if (!behaviours.Remove(tBehaviour)) if (!behaviours.Remove(tBehaviour))
return; return;
OnBehaviourRemove(args.BehaviourRemoved); OnBehaviourRemove(arguments.BehaviourRemoved);
OnRemoved?.Invoke(this, new(tBehaviour)); OnRemoved?.Invoke(this, new(tBehaviour));
} }
@@ -75,8 +74,8 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
foreach (IUniverseObject universeObject in universe.UniverseObjects) foreach (IUniverseObject universeObject in universe.UniverseObjects)
OnUniverseObjectRegistered(universe, new(universeObject)); OnUniverseObjectRegistered(universe, new(universeObject));
universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered); universe.OnUniverseObjectRegistered.AddListener(cachedOnUniverseObjectRegistered);
universe.OnUniverseObjectUnRegistered.AddListener(delegateOnUniverseObjectUnregistered); universe.OnUniverseObjectUnRegistered.AddListener(cachedOnUniverseObjectUnregistered);
Universe = universe; Universe = universe;
OnAssign(universe); OnAssign(universe);
@@ -93,8 +92,8 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
foreach (IUniverseObject universeObject in Universe.UniverseObjects) foreach (IUniverseObject universeObject in Universe.UniverseObjects)
OnUniverseObjectUnregistered(Universe, new(universeObject)); OnUniverseObjectUnregistered(Universe, new(universeObject));
Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered); Universe.OnUniverseObjectRegistered.RemoveListener(cachedOnUniverseObjectRegistered);
Universe.OnUniverseObjectUnRegistered.RemoveListener(delegateOnUniverseObjectUnregistered); Universe.OnUniverseObjectUnRegistered.RemoveListener(cachedOnUniverseObjectUnregistered);
Universe = null!; Universe = null!;
OnUnassigned?.Invoke(this); OnUnassigned?.Invoke(this);
@@ -106,19 +105,9 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
public BehaviourCollector() public BehaviourCollector()
{ {
delegateOnBehaviourAdded = OnBehaviourAdded; cachedOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved; cachedOnBehaviourRemoved = OnBehaviourRemoved;
delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered; cachedOnUniverseObjectRegistered = OnUniverseObjectRegistered;
delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered; cachedOnUniverseObjectUnregistered = OnUniverseObjectUnregistered;
}
public BehaviourCollector(IUniverse universe)
{
delegateOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved;
delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered;
delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered;
Assign(universe);
} }
} }

View File

@@ -1,14 +1,11 @@
using System; using System;
using System.Collections.Generic;
namespace Syntriax.Engine.Core; namespace Syntriax.Engine.Core;
public class BehaviourCollectorSorted<T> : BehaviourCollector<T> where T : class public class BehaviourCollectorSorted<T> : BehaviourCollector<T> where T : class
{ {
private readonly Event<IBehaviour, IBehaviour.PriorityChangedArguments>.EventHandler delegateOnPriorityChanged = null!; private Comparison<T>? _sortBy = null;
public Comparison<T>? SortBy
private IComparer<T>? _sortBy = null;
public IComparer<T>? SortBy
{ {
get => _sortBy; get => _sortBy;
set set
@@ -20,48 +17,9 @@ public class BehaviourCollectorSorted<T> : BehaviourCollector<T> where T : class
} }
} }
protected override void AddBehaviour(T behaviour)
{
if (SortBy is null)
{
behaviours.Add(behaviour);
return;
}
int insertionIndex = behaviours.BinarySearch(behaviour, SortBy);
if (insertionIndex < 0)
insertionIndex = ~insertionIndex;
behaviours.Insert(insertionIndex, behaviour);
}
protected override void OnBehaviourAdd(IBehaviour behaviour) protected override void OnBehaviourAdd(IBehaviour behaviour)
{ {
behaviour.OnPriorityChanged.AddListener(delegateOnPriorityChanged); if (SortBy is not null)
} behaviours.Sort(SortBy);
protected override void OnBehaviourRemove(IBehaviour behaviour)
{
behaviour.OnPriorityChanged.RemoveListener(delegateOnPriorityChanged);
}
private void OnPriorityChanged(IBehaviour sender, IBehaviour.PriorityChangedArguments args)
{
T behaviour = (T)sender;
behaviours.Remove(behaviour);
AddBehaviour(behaviour);
}
public BehaviourCollectorSorted()
{
delegateOnPriorityChanged = OnPriorityChanged;
}
public BehaviourCollectorSorted(IUniverse universe, Comparison<T> sortBy) : base(universe)
{
delegateOnPriorityChanged = OnPriorityChanged;
SortBy = Comparer<T>.Create(sortBy);
} }
} }

View File

@@ -27,7 +27,6 @@ public class BehaviourController : BaseEntity, IBehaviourController
if (IsInitialized) if (IsInitialized)
behaviour.Initialize(); behaviour.Initialize();
behaviour.OnPriorityChanged.AddListener(OnPriorityChange); behaviour.OnPriorityChanged.AddListener(OnPriorityChange);
OnBehaviourAdded?.Invoke(this, new(behaviour)); OnBehaviourAdded?.Invoke(this, new(behaviour));
return behaviour; return behaviour;
@@ -146,7 +145,7 @@ public class BehaviourController : BaseEntity, IBehaviourController
behaviours.Add(behaviour); behaviours.Add(behaviour);
} }
private void OnPriorityChange(IBehaviour sender, IBehaviour.PriorityChangedArguments args) private void OnPriorityChange(IBehaviour sender, IBehaviour.PriorityChangedArguments arguments)
{ {
behaviours.Remove(sender); behaviours.Remove(sender);
InsertBehaviourByPriority(sender); InsertBehaviourByPriority(sender);

View File

@@ -28,7 +28,7 @@ public class CoroutineManager : UniverseObject
universe.OnUpdate.RemoveListener(OnUpdate); universe.OnUpdate.RemoveListener(OnUpdate);
} }
private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments arguments)
{ {
for (int i = enumerators.Count - 1; i >= 0; i--) for (int i = enumerators.Count - 1; i >= 0; i--)
{ {

View File

@@ -3,27 +3,6 @@ using System.Collections.Generic;
namespace Syntriax.Engine.Core; namespace Syntriax.Engine.Core;
public class Event
{
private readonly List<EventHandler> listeners = new(8);
public void AddListener(EventHandler listener) => listeners.Add(listener);
public void RemoveListener(EventHandler listener) => listeners.Remove(listener);
public void Clear() => listeners.Clear();
public void Invoke()
{
for (int i = 0; i < listeners.Count; i++)
try { listeners[i].Invoke(); }
catch (Exception exception)
{
string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}()";
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
}
}
public delegate void EventHandler();
}
public class Event<TSender> public class Event<TSender>
{ {
private readonly List<EventHandler> listeners = new(8); private readonly List<EventHandler> listeners = new(8);
@@ -52,16 +31,16 @@ public class Event<TSender, TArguments>
public void AddListener(EventHandler listener) => listeners.Add(listener); public void AddListener(EventHandler listener) => listeners.Add(listener);
public void RemoveListener(EventHandler listener) => listeners.Remove(listener); public void RemoveListener(EventHandler listener) => listeners.Remove(listener);
public void Clear() => listeners.Clear(); public void Clear() => listeners.Clear();
public void Invoke(TSender sender, TArguments args) public void Invoke(TSender sender, TArguments arguments)
{ {
for (int i = 0; i < listeners.Count; i++) for (int i = 0; i < listeners.Count; i++)
try { listeners[i].Invoke(sender, args); } try { listeners[i].Invoke(sender, arguments); }
catch (Exception exception) catch (Exception exception)
{ {
string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, args)})"; string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, arguments)})";
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
} }
} }
public delegate void EventHandler(TSender sender, TArguments args); public delegate void EventHandler(TSender sender, TArguments arguments);
} }

View File

@@ -256,6 +256,8 @@ public class Shape2D(List<Vector2D> vertices) : IEnumerable<Vector2D>
/// <inheritdoc/> /// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator() => Vertices.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => Vertices.GetEnumerator();
public readonly record struct ShapeUpdatedArguments(Shape2D shape2D);
} }
/// <summary> /// <summary>

View File

@@ -1,10 +1,9 @@
using System.Collections.Generic;
namespace Syntriax.Engine.Core; namespace Syntriax.Engine.Core;
public class DrawManager : UniverseObject public class DrawManager : UniverseObject
{ {
private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority)); private static System.Comparison<IBehaviour> SortByPriority() => (x, y) => y.Priority.CompareTo(x.Priority);
private readonly ActiveBehaviourCollectorSorted<IPreDraw> preDrawEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted<IPreDraw> preDrawEntities = new() { SortBy = SortByPriority() };
private readonly ActiveBehaviourCollectorSorted<IDraw> drawEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted<IDraw> drawEntities = new() { SortBy = SortByPriority() };

View File

@@ -1,10 +1,11 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Syntriax.Engine.Core; namespace Syntriax.Engine.Core;
public class UpdateManager : UniverseObject public class UpdateManager : UniverseObject
{ {
private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority)); private static System.Comparison<IBehaviour> SortByPriority() => (x, y) => y.Priority.CompareTo(x.Priority);
private readonly ActiveBehaviourCollectorSorted<IFirstFrameUpdate> firstFrameUpdates = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted<IFirstFrameUpdate> firstFrameUpdates = new() { SortBy = SortByPriority() };
private readonly ActiveBehaviourCollectorSorted<IPreUpdate> preUpdateEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted<IPreUpdate> preUpdateEntities = new() { SortBy = SortByPriority() };
@@ -37,7 +38,7 @@ public class UpdateManager : UniverseObject
universe.OnPostUpdate.RemoveListener(OnPostUpdate); universe.OnPostUpdate.RemoveListener(OnPostUpdate);
} }
private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments arguments)
{ {
for (int i = toCallFirstFrameUpdates.Count - 1; i >= 0; i--) for (int i = toCallFirstFrameUpdates.Count - 1; i >= 0; i--)
{ {
@@ -49,21 +50,21 @@ public class UpdateManager : UniverseObject
preUpdateEntities[i].PreUpdate(); preUpdateEntities[i].PreUpdate();
} }
private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments arguments)
{ {
for (int i = updateEntities.Count - 1; i >= 0; i--) for (int i = updateEntities.Count - 1; i >= 0; i--)
updateEntities[i].Update(); updateEntities[i].Update();
} }
private void OnPostUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnPostUpdate(IUniverse sender, IUniverse.UpdateArguments arguments)
{ {
for (int i = postUpdateEntities.Count - 1; i >= 0; i--) for (int i = postUpdateEntities.Count - 1; i >= 0; i--)
postUpdateEntities[i].PostUpdate(); postUpdateEntities[i].PostUpdate();
} }
private void OnFirstFrameCollected(IBehaviourCollector<IFirstFrameUpdate> sender, IBehaviourCollector<IFirstFrameUpdate>.BehaviourCollectedArguments args) private void OnFirstFrameCollected(IBehaviourCollector<IFirstFrameUpdate> sender, IBehaviourCollector<IFirstFrameUpdate>.BehaviourCollectedArguments arguments)
{ {
toCallFirstFrameUpdates.Add(args.BehaviourCollected); toCallFirstFrameUpdates.Add(arguments.BehaviourCollected);
} }
public UpdateManager() public UpdateManager()

View File

@@ -118,17 +118,17 @@ public class Transform2D : Behaviour, ITransform2D
} }
} }
private void RecalculatePosition(ITransform2D _, ITransform2D.PositionChangedArguments args) private void RecalculatePosition(ITransform2D _, ITransform2D.PositionChangedArguments arguments)
{ {
if (parentTransform is null) if (parentTransform is null)
return; return;
UpdatePosition(); UpdatePosition();
OnPositionChanged?.Invoke(this, args); OnPositionChanged?.Invoke(this, arguments);
} }
private void RecalculateScale(ITransform2D _, ITransform2D.ScaleChangedArguments args) private void RecalculateScale(ITransform2D _, ITransform2D.ScaleChangedArguments arguments)
{ {
if (parentTransform is null) if (parentTransform is null)
return; return;
@@ -138,11 +138,11 @@ public class Transform2D : Behaviour, ITransform2D
UpdateScale(); UpdateScale();
UpdatePosition(); UpdatePosition();
OnScaleChanged?.Invoke(this, args); OnScaleChanged?.Invoke(this, arguments);
OnPositionChanged?.Invoke(this, new(previousPosition)); OnPositionChanged?.Invoke(this, new(previousPosition));
} }
private void RecalculateRotation(ITransform2D _, ITransform2D.RotationChangedArguments args) private void RecalculateRotation(ITransform2D _, ITransform2D.RotationChangedArguments arguments)
{ {
if (parentTransform is null) if (parentTransform is null)
return; return;
@@ -152,7 +152,7 @@ public class Transform2D : Behaviour, ITransform2D
UpdateRotation(); UpdateRotation();
UpdatePosition(); UpdatePosition();
OnRotationChanged?.Invoke(this, args); OnRotationChanged?.Invoke(this, arguments);
OnPositionChanged?.Invoke(this, new(previousPosition)); OnPositionChanged?.Invoke(this, new(previousPosition));
} }
@@ -252,16 +252,16 @@ public class Transform2D : Behaviour, ITransform2D
OnRotationChanged?.Invoke(this, new(Rotation)); OnRotationChanged?.Invoke(this, new(Rotation));
} }
private void LookForTransform2D(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments args) private void LookForTransform2D(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments)
{ {
if (args.BehaviourAdded is not ITransform2D) if (arguments.BehaviourAdded is not ITransform2D)
return; return;
UpdateReferences(UniverseObject.Parent); UpdateReferences(UniverseObject.Parent);
} }
private void OnParentChanged(IUniverseObject sender, IUniverseObject.ParentChangedArguments args) private void OnParentChanged(IUniverseObject sender, IUniverseObject.ParentChangedArguments arguments)
{ {
UpdateReferences(args.CurrentParent); UpdateReferences(arguments.CurrentParent);
} }
} }

View File

@@ -17,16 +17,16 @@ public class Universe : BaseEntity, IUniverse
public Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments> OnUniverseObjectUnRegistered { get; } = new(); public Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments> OnUniverseObjectUnRegistered { get; } = new();
public Event<IUniverse, IUniverse.TimeScaleChangedArguments> OnTimeScaleChanged { get; } = new(); public Event<IUniverse, IUniverse.TimeScaleChangedArguments> OnTimeScaleChanged { get; } = new();
private readonly Event<IInitializable>.EventHandler delegateOnUniverseObjectFinalize = null!; private readonly Event<IInitializable>.EventHandler cachedOnUniverseObjectFinalize = null!;
private readonly Event<IUniverseObject, IUniverseObject.ExitedUniverseArguments>.EventHandler delegateOnUniverseObjectExitedUniverse = null!; private readonly Event<IUniverseObject, IUniverseObject.ExitedUniverseArguments>.EventHandler cachedOnUniverseObjectExitedUniverse = null!;
private readonly List<IUniverseObject> _universeObjects = new(Constants.UNIVERSE_OBJECTS_SIZE_INITIAL); private readonly List<IUniverseObject> _universeObjects = new(Constants.UNIVERSE_OBJECTS_SIZE_INITIAL);
private float _timeScale = 1f; private float _timeScale = 1f;
public Universe() public Universe()
{ {
delegateOnUniverseObjectFinalize = OnUniverseObjectFinalize; cachedOnUniverseObjectFinalize = OnUniverseObjectFinalize;
delegateOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse; cachedOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse;
} }
public IReadOnlyList<IUniverseObject> UniverseObjects => _universeObjects; public IReadOnlyList<IUniverseObject> UniverseObjects => _universeObjects;
@@ -53,8 +53,8 @@ public class Universe : BaseEntity, IUniverse
if (_universeObjects.Contains(universeObject)) if (_universeObjects.Contains(universeObject))
throw new Exception($"{nameof(IUniverseObject)} named {universeObject.Name} is already registered to the {nameof(Universe)}."); throw new Exception($"{nameof(IUniverseObject)} named {universeObject.Name} is already registered to the {nameof(Universe)}.");
universeObject.OnFinalized.AddListener(delegateOnUniverseObjectFinalize); universeObject.OnFinalized.AddListener(cachedOnUniverseObjectFinalize);
universeObject.OnExitedUniverse.AddListener(delegateOnUniverseObjectExitedUniverse); universeObject.OnExitedUniverse.AddListener(cachedOnUniverseObjectExitedUniverse);
if (!universeObject.Initialize()) if (!universeObject.Initialize())
throw new Exception($"{universeObject.Name} can't be initialized"); throw new Exception($"{universeObject.Name} can't be initialized");
@@ -88,8 +88,8 @@ public class Universe : BaseEntity, IUniverse
if (!_universeObjects.Contains(universeObject)) if (!_universeObjects.Contains(universeObject))
throw new Exception($"{nameof(IUniverseObject)} named {universeObject.Name} is not registered to the {nameof(Universe)}."); throw new Exception($"{nameof(IUniverseObject)} named {universeObject.Name} is not registered to the {nameof(Universe)}.");
universeObject.OnFinalized.RemoveListener(delegateOnUniverseObjectFinalize); universeObject.OnFinalized.RemoveListener(cachedOnUniverseObjectFinalize);
universeObject.OnExitedUniverse.RemoveListener(delegateOnUniverseObjectExitedUniverse); universeObject.OnExitedUniverse.RemoveListener(cachedOnUniverseObjectExitedUniverse);
for (int i = universeObject.Children.Count - 1; i >= 0; i--) for (int i = universeObject.Children.Count - 1; i >= 0; i--)
Remove(universeObject.Children[i]); Remove(universeObject.Children[i]);
@@ -145,7 +145,7 @@ public class Universe : BaseEntity, IUniverse
Remove(universeObject); Remove(universeObject);
} }
private void OnUniverseObjectExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments args) private void OnUniverseObjectExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments arguments)
{ {
if (sender is IUniverseObject universeObject) if (sender is IUniverseObject universeObject)
Remove(universeObject); Remove(universeObject);

View File

@@ -135,8 +135,8 @@ public class UniverseObject : BaseEntity, IUniverseObject
stateEnable.OnEnabledChanged.AddListener(OnStateEnabledChanged); stateEnable.OnEnabledChanged.AddListener(OnStateEnabledChanged);
} }
private void OnParentActiveChanged(IActive sender, IActive.ActiveChangedArguments args) => UpdateActive(); private void OnParentActiveChanged(IActive sender, IActive.ActiveChangedArguments arguments) => UpdateActive();
private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments args) => UpdateActive(); private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments arguments) => UpdateActive();
private void UpdateActive() private void UpdateActive()
{ {

View File

@@ -8,24 +8,24 @@ public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
public Event<ICollider2D, CollisionDetectionInformation> OnCollisionResolved { get; } = new(); public Event<ICollider2D, CollisionDetectionInformation> OnCollisionResolved { get; } = new();
public Event<ICollider2D, ICollider2D> OnTriggered { get; } = new(); public Event<ICollider2D, ICollider2D> OnTriggered { get; } = new();
private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler delegateOnBehaviourAddedToController = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler cachedOnBehaviourAddedToController = null!;
private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler delegateOnBehaviourRemovedFromController = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler cachedOnBehaviourRemovedFromController = null!;
private readonly Event<ITransform2D, ITransform2D.PositionChangedArguments>.EventHandler delegateSetNeedsRecalculationFromPosition = null!; private readonly Event<ITransform2D, ITransform2D.PositionChangedArguments>.EventHandler cachedSetNeedsRecalculationFromPosition = null!;
private readonly Event<ITransform2D, ITransform2D.RotationChangedArguments>.EventHandler delegateSetNeedsRecalculationFromRotation = null!; private readonly Event<ITransform2D, ITransform2D.RotationChangedArguments>.EventHandler cachedSetNeedsRecalculationFromRotation = null!;
private readonly Event<ITransform2D, ITransform2D.ScaleChangedArguments>.EventHandler delegateSetNeedsRecalculationFromScale = null!; private readonly Event<ITransform2D, ITransform2D.ScaleChangedArguments>.EventHandler cachedSetNeedsRecalculationFromScale = null!;
private readonly Event<IUniverseObject, IUniverseObject.ParentChangedArguments>.EventHandler delegateUpdateRigidBody2D = null!; private readonly Event<IUniverseObject, IUniverseObject.ParentChangedArguments>.EventHandler cachedUpdateRigidBody2D = null!;
protected bool NeedsRecalculation { get; set; } = true; protected bool NeedsRecalculation { get; set; } = true;
protected IRigidBody2D? _rigidBody2D = null; protected IRigidBody2D? _rigidBody2D = null;
protected Collider2DBehaviourBase() protected Collider2DBehaviourBase()
{ {
delegateOnBehaviourAddedToController = OnBehaviourAddedToController; cachedOnBehaviourAddedToController = OnBehaviourAddedToController;
delegateOnBehaviourRemovedFromController = OnBehaviourRemovedFromController; cachedOnBehaviourRemovedFromController = OnBehaviourRemovedFromController;
delegateSetNeedsRecalculationFromPosition = SetNeedsRecalculationFromPosition; cachedSetNeedsRecalculationFromPosition = SetNeedsRecalculationFromPosition;
delegateSetNeedsRecalculationFromRotation = SetNeedsRecalculationFromRotation; cachedSetNeedsRecalculationFromRotation = SetNeedsRecalculationFromRotation;
delegateSetNeedsRecalculationFromScale = SetNeedsRecalculationFromScale; cachedSetNeedsRecalculationFromScale = SetNeedsRecalculationFromScale;
delegateUpdateRigidBody2D = UpdateRigidBody2D; cachedUpdateRigidBody2D = UpdateRigidBody2D;
} }
public IRigidBody2D? RigidBody2D => _rigidBody2D; public IRigidBody2D? RigidBody2D => _rigidBody2D;
@@ -46,44 +46,44 @@ public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
{ {
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D); BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
BehaviourController.OnBehaviourAdded.AddListener(delegateOnBehaviourAddedToController); BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAddedToController);
BehaviourController.OnBehaviourRemoved.AddListener(delegateOnBehaviourRemovedFromController); BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemovedFromController);
Transform.OnPositionChanged.AddListener(delegateSetNeedsRecalculationFromPosition); Transform.OnPositionChanged.AddListener(cachedSetNeedsRecalculationFromPosition);
Transform.OnRotationChanged.AddListener(delegateSetNeedsRecalculationFromRotation); Transform.OnRotationChanged.AddListener(cachedSetNeedsRecalculationFromRotation);
Transform.OnScaleChanged.AddListener(delegateSetNeedsRecalculationFromScale); Transform.OnScaleChanged.AddListener(cachedSetNeedsRecalculationFromScale);
UniverseObject.OnParentChanged.AddListener(delegateUpdateRigidBody2D); UniverseObject.OnParentChanged.AddListener(cachedUpdateRigidBody2D);
} }
private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject.ParentChangedArguments args) private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject.ParentChangedArguments arguments)
{ {
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D); BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
} }
private void OnBehaviourAddedToController(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments args) private void OnBehaviourAddedToController(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments)
{ {
if (args.BehaviourAdded is IRigidBody2D rigidBody) if (arguments.BehaviourAdded is IRigidBody2D rigidBody)
_rigidBody2D = rigidBody; _rigidBody2D = rigidBody;
} }
private void OnBehaviourRemovedFromController(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments args) private void OnBehaviourRemovedFromController(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments arguments)
{ {
if (args.BehaviourRemoved is IRigidBody2D) if (arguments.BehaviourRemoved is IRigidBody2D)
_rigidBody2D = null; _rigidBody2D = null;
} }
private void SetNeedsRecalculationFromPosition(ITransform2D sender, ITransform2D.PositionChangedArguments args) => NeedsRecalculation = true; private void SetNeedsRecalculationFromPosition(ITransform2D sender, ITransform2D.PositionChangedArguments arguments) => NeedsRecalculation = true;
private void SetNeedsRecalculationFromScale(ITransform2D sender, ITransform2D.ScaleChangedArguments args) => NeedsRecalculation = true; private void SetNeedsRecalculationFromScale(ITransform2D sender, ITransform2D.ScaleChangedArguments arguments) => NeedsRecalculation = true;
private void SetNeedsRecalculationFromRotation(ITransform2D sender, ITransform2D.RotationChangedArguments args) => NeedsRecalculation = true; private void SetNeedsRecalculationFromRotation(ITransform2D sender, ITransform2D.RotationChangedArguments arguments) => NeedsRecalculation = true;
protected override void OnFinalize() protected override void OnFinalize()
{ {
BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAddedToController); BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAddedToController);
BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemovedFromController); BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemovedFromController);
Transform.OnScaleChanged.RemoveListener(delegateSetNeedsRecalculationFromScale); Transform.OnScaleChanged.RemoveListener(cachedSetNeedsRecalculationFromScale);
Transform.OnPositionChanged.RemoveListener(delegateSetNeedsRecalculationFromPosition); Transform.OnPositionChanged.RemoveListener(cachedSetNeedsRecalculationFromPosition);
Transform.OnRotationChanged.RemoveListener(delegateSetNeedsRecalculationFromRotation); Transform.OnRotationChanged.RemoveListener(cachedSetNeedsRecalculationFromRotation);
} }
public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation); public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation);

View File

@@ -7,7 +7,7 @@ namespace Syntriax.Engine.Physics2D;
public class PhysicsCoroutineManager : UniverseObject public class PhysicsCoroutineManager : UniverseObject
{ {
private readonly Event<IUniverse, IUniverse.UpdateArguments>.EventHandler delegateOnUpdate = null!; private readonly Event<IUniverse, IUniverse.UpdateArguments>.EventHandler cachedOnUpdate = null!;
private readonly List<IEnumerator> enumerators = []; private readonly List<IEnumerator> enumerators = [];
private IPhysicsEngine2D? physicsEngine = null; private IPhysicsEngine2D? physicsEngine = null;
@@ -51,7 +51,7 @@ public class PhysicsCoroutineManager : UniverseObject
universe.OnUpdate.RemoveListener(OnUpdate); universe.OnUpdate.RemoveListener(OnUpdate);
} }
private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments arguments)
{ {
if (Universe is not IUniverse universe) if (Universe is not IUniverse universe)
return; return;
@@ -66,6 +66,6 @@ public class PhysicsCoroutineManager : UniverseObject
public PhysicsCoroutineManager() public PhysicsCoroutineManager()
{ {
delegateOnUpdate = OnUpdate; cachedOnUpdate = OnUpdate;
} }
} }

View File

@@ -1,5 +1,3 @@
using System.Collections;
using System.Collections.Generic;
using Syntriax.Engine.Core; using Syntriax.Engine.Core;
namespace Syntriax.Engine.Physics2D; namespace Syntriax.Engine.Physics2D;
@@ -9,7 +7,7 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
public Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; } = new(); public Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; } = new();
public Event<IPhysicsEngine2D, float> OnPhysicsStep { get; } = new(); public Event<IPhysicsEngine2D, float> OnPhysicsStep { get; } = new();
private readonly Event<IUniverse, IUniverse.UpdateArguments>.EventHandler delegateOnPreUpdate = null!; private readonly Event<IUniverse, IUniverse.UpdateArguments>.EventHandler cachedOnPreUpdate = null!;
private float physicsTicker = 0f; private float physicsTicker = 0f;
private int _iterationPerStep = 1; private int _iterationPerStep = 1;
@@ -18,7 +16,7 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
protected readonly ICollisionDetector2D collisionDetector = null!; protected readonly ICollisionDetector2D collisionDetector = null!;
protected readonly ICollisionResolver2D collisionResolver = null!; protected readonly ICollisionResolver2D collisionResolver = null!;
private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority)); private static System.Comparison<IBehaviour> SortByPriority() => (x, y) => y.Priority.CompareTo(x.Priority);
protected ActiveBehaviourCollectorSorted<IPrePhysicsUpdate> physicsPreUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted<IPrePhysicsUpdate> physicsPreUpdateCollector = new() { SortBy = SortByPriority() };
protected ActiveBehaviourCollectorSorted<IPhysicsUpdate> physicsUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted<IPhysicsUpdate> physicsUpdateCollector = new() { SortBy = SortByPriority() };
protected ActiveBehaviourCollectorSorted<IPostPhysicsUpdate> physicsPostUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted<IPostPhysicsUpdate> physicsPostUpdateCollector = new() { SortBy = SortByPriority() };
@@ -196,9 +194,9 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
universe.OnPreUpdate.RemoveListener(OnEnginePreUpdate); universe.OnPreUpdate.RemoveListener(OnEnginePreUpdate);
} }
private void OnEnginePreUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnEnginePreUpdate(IUniverse sender, IUniverse.UpdateArguments arguments)
{ {
physicsTicker += args.EngineTime.DeltaTime; physicsTicker += arguments.EngineTime.DeltaTime;
while (physicsTicker >= IterationPeriod) while (physicsTicker >= IterationPeriod)
{ {
@@ -212,7 +210,7 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
collisionDetector = new CollisionDetector2D(); collisionDetector = new CollisionDetector2D();
collisionResolver = new CollisionResolver2D(); collisionResolver = new CollisionResolver2D();
delegateOnPreUpdate = OnEnginePreUpdate; cachedOnPreUpdate = OnEnginePreUpdate;
} }
public PhysicsEngine2D(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver) public PhysicsEngine2D(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
@@ -220,6 +218,6 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
this.collisionDetector = collisionDetector; this.collisionDetector = collisionDetector;
this.collisionResolver = collisionResolver; this.collisionResolver = collisionResolver;
delegateOnPreUpdate = OnEnginePreUpdate; cachedOnPreUpdate = OnEnginePreUpdate;
} }
} }

View File

@@ -9,8 +9,8 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
public Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; } = new(); public Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; } = new();
public Event<IPhysicsEngine2D, float> OnPhysicsStep { get; } = new(); public Event<IPhysicsEngine2D, float> OnPhysicsStep { get; } = new();
private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler delegateOnBehaviourAdded = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler cachedOnBehaviourAdded = null!;
private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler delegateOnBehaviourRemoved = null!; private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler cachedOnBehaviourRemoved = null!;
private readonly List<IRigidBody2D> rigidBodies = new(32); private readonly List<IRigidBody2D> rigidBodies = new(32);
private readonly List<ICollider2D> colliders = new(64); private readonly List<ICollider2D> colliders = new(64);
@@ -32,16 +32,16 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
foreach (ICollider2D collider2D in rigidBody.BehaviourController.GetBehaviours<ICollider2D>()) foreach (ICollider2D collider2D in rigidBody.BehaviourController.GetBehaviours<ICollider2D>())
colliders.Add(collider2D); colliders.Add(collider2D);
rigidBody.BehaviourController.OnBehaviourAdded.AddListener(delegateOnBehaviourAdded); rigidBody.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded);
rigidBody.BehaviourController.OnBehaviourRemoved.AddListener(delegateOnBehaviourRemoved); rigidBody.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved);
} }
public void RemoveRigidBody(IRigidBody2D rigidBody) public void RemoveRigidBody(IRigidBody2D rigidBody)
{ {
rigidBodies.Remove(rigidBody); rigidBodies.Remove(rigidBody);
rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded); rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded);
rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved); rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved);
} }
public void Step(float deltaTime) public void Step(float deltaTime)
@@ -178,17 +178,17 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
rigidBody.Transform.Rotation += rigidBody.AngularVelocity * intervalDeltaTime; rigidBody.Transform.Rotation += rigidBody.AngularVelocity * intervalDeltaTime;
} }
private void OnBehaviourAdded(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments args) private void OnBehaviourAdded(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments)
{ {
if (args.BehaviourAdded is not ICollider2D collider2D) if (arguments.BehaviourAdded is not ICollider2D collider2D)
return; return;
colliders.Add(collider2D); colliders.Add(collider2D);
} }
private void OnBehaviourRemoved(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments args) private void OnBehaviourRemoved(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments arguments)
{ {
if (args.BehaviourRemoved is not ICollider2D collider2D) if (arguments.BehaviourRemoved is not ICollider2D collider2D)
return; return;
colliders.Remove(collider2D); colliders.Remove(collider2D);
@@ -199,8 +199,8 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
collisionDetector = new CollisionDetector2D(); collisionDetector = new CollisionDetector2D();
collisionResolver = new CollisionResolver2D(); collisionResolver = new CollisionResolver2D();
delegateOnBehaviourAdded = OnBehaviourAdded; cachedOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved; cachedOnBehaviourRemoved = OnBehaviourRemoved;
} }
public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver) public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
@@ -208,7 +208,7 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
this.collisionDetector = collisionDetector; this.collisionDetector = collisionDetector;
this.collisionResolver = collisionResolver; this.collisionResolver = collisionResolver;
delegateOnBehaviourAdded = OnBehaviourAdded; cachedOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved; cachedOnBehaviourRemoved = OnBehaviourRemoved;
} }
} }

View File

@@ -7,13 +7,13 @@ public class StateMachine : Behaviour
{ {
public Event<StateMachine, StateChangedArguments> OnStateChanged { get; } = new(); public Event<StateMachine, StateChangedArguments> OnStateChanged { get; } = new();
private readonly Event<IState, IState.StateTransitionReadyArguments>.EventHandler delegateOnStateTransitionReady = null!; private readonly Event<IState, IState.StateTransitionReadyArguments>.EventHandler cachedOnStateTransitionReady = null!;
private IState _state = new State(); private IState _state = new State();
public StateMachine() public StateMachine()
{ {
delegateOnStateTransitionReady = OnStateTransitionReady; cachedOnStateTransitionReady = OnStateTransitionReady;
} }
[Serialize] [Serialize]
@@ -26,20 +26,20 @@ public class StateMachine : Behaviour
return; return;
IState previousState = _state; IState previousState = _state;
previousState.OnStateTransitionReady.RemoveListener(delegateOnStateTransitionReady); previousState.OnStateTransitionReady.RemoveListener(cachedOnStateTransitionReady);
_state = value; _state = value;
previousState.TransitionFrom(value); previousState.TransitionFrom(value);
value.TransitionTo(_state); value.TransitionTo(_state);
OnStateChanged?.Invoke(this, new(value, previousState)); OnStateChanged?.Invoke(this, new(value, previousState));
value.OnStateTransitionReady.AddListener(delegateOnStateTransitionReady); value.OnStateTransitionReady.AddListener(cachedOnStateTransitionReady);
} }
} }
private void OnStateTransitionReady(IState sender, IState.StateTransitionReadyArguments args) private void OnStateTransitionReady(IState sender, IState.StateTransitionReadyArguments arguments)
{ {
State = args.ToState; State = arguments.ToState;
while (State.GetNextState() is IState nextState) while (State.GetNextState() is IState nextState)
State = nextState; State = nextState;
} }

View File

@@ -8,9 +8,9 @@ namespace Syntriax.Engine.Systems.Tween;
public class TweenManager : UniverseObject, ITweenManager public class TweenManager : UniverseObject, ITweenManager
{ {
private CoroutineManager coroutineManager = null!; private CoroutineManager coroutineManager = null!;
private readonly Queue<Tween> queue = new();
private readonly Dictionary<ITween, IEnumerator> runningCoroutines = []; private readonly Dictionary<ITween, IEnumerator> runningCoroutines = [];
private readonly Queue<Tween> pool = new();
public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null) public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null)
{ {
@@ -22,7 +22,7 @@ public class TweenManager : UniverseObject, ITweenManager
private Tween Get(float duration) private Tween Get(float duration)
{ {
if (!pool.TryDequeue(out Tween? result)) if (!queue.TryDequeue(out Tween? result))
result = new(duration); result = new(duration);
result.Duration = duration; result.Duration = duration;
@@ -31,11 +31,11 @@ public class TweenManager : UniverseObject, ITweenManager
private void Return(Tween tween) private void Return(Tween tween)
{ {
if (pool.Contains(tween)) if (queue.Contains(tween))
return; return;
tween.Wipe(); tween.Wipe();
pool.Enqueue(tween); queue.Enqueue(tween);
} }
private IEnumerator RunTween(Tween tween) private IEnumerator RunTween(Tween tween)
@@ -70,7 +70,6 @@ public class TweenManager : UniverseObject, ITweenManager
tween.State = TweenState.Cancelled; tween.State = TweenState.Cancelled;
coroutineManager.StopCoroutine(runningCoroutine); coroutineManager.StopCoroutine(runningCoroutine);
runningCoroutines.Remove(tween); runningCoroutines.Remove(tween);
Return((Tween)tween);
} }
protected override void OnEnteringUniverse(IUniverse universe) protected override void OnEnteringUniverse(IUniverse universe)