From e77772cbc2ffec986beb297a4756d301e5b7a7ef Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sat, 11 Oct 2025 15:08:02 +0300 Subject: [PATCH] refactor: behaviour collector base added --- Engine.Core/BehaviourCollector.cs | 120 ++----------------------- Engine.Core/BehaviourCollectorBase.cs | 125 ++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 113 deletions(-) create mode 100644 Engine.Core/BehaviourCollectorBase.cs diff --git a/Engine.Core/BehaviourCollector.cs b/Engine.Core/BehaviourCollector.cs index f43ef7b..137088c 100644 --- a/Engine.Core/BehaviourCollector.cs +++ b/Engine.Core/BehaviourCollector.cs @@ -2,122 +2,16 @@ using System; namespace Engine.Core; -public class BehaviourCollector : IBehaviourCollector where T : class +public class BehaviourCollector : BehaviourCollectorBase where T : class { - public Event, IBehaviourCollector.BehaviourCollectedArguments> OnCollected { get; } = new(); - public Event, IBehaviourCollector.BehaviourRemovedArguments> OnRemoved { get; } = new(); - public Event OnUniverseAssigned { get; } = new(); - public Event? OnUnassigned { get; } = new(); - - private readonly Event.EventHandler delegateOnBehaviourAdded = null!; - private readonly Event.EventHandler delegateOnBehaviourRemoved = null!; - private readonly Event.EventHandler delegateOnUniverseObjectRegistered = null!; - private readonly Event.EventHandler delegateOnUniverseObjectUnregistered = null!; - protected readonly FastList behaviours = new(32); - public IUniverse Universe { get; private set; } = null!; + public override T this[Index index] => behaviours[index]; + public override int Count => behaviours.Count; - private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments args) - { - IUniverseObject universeObject = args.UniverseObjectRegistered; + protected override void AddBehaviour(T behaviour) => behaviours.Add(behaviour); + protected override bool RemoveBehaviour(T tBehaviour) => behaviours.Remove(tBehaviour); - universeObject.BehaviourController.OnBehaviourAdded.AddListener(delegateOnBehaviourAdded); - universeObject.BehaviourController.OnBehaviourRemoved.AddListener(delegateOnBehaviourRemoved); - - for (int i = 0; i < universeObject.BehaviourController.Count; i++) - OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); - } - - private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments args) - { - IUniverseObject universeObject = args.UniverseObjectUnregistered; - - universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded); - universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved); - - for (int i = 0; i < universeObject.BehaviourController.Count; i++) - OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); - } - - protected virtual void AddBehaviour(T behaviour) => behaviours.Add(behaviour); - protected virtual void OnBehaviourAdd(IBehaviour behaviour) { } - private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments args) - { - if (args.BehaviourAdded is not T tBehaviour) - return; - - AddBehaviour(tBehaviour); - OnBehaviourAdd(args.BehaviourAdded); - OnCollected?.Invoke(this, new(tBehaviour)); - } - - protected virtual void OnBehaviourRemove(IBehaviour behaviour) { } - private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments args) - { - if (args.BehaviourRemoved is not T tBehaviour) - return; - - if (!behaviours.Remove(tBehaviour)) - return; - - OnBehaviourRemove(args.BehaviourRemoved); - OnRemoved?.Invoke(this, new(tBehaviour)); - } - - protected virtual void OnAssign(IUniverse universe) { } - public bool Assign(IUniverse universe) - { - if (Universe is not null) - return false; - - foreach (IUniverseObject universeObject in universe.UniverseObjects) - OnUniverseObjectRegistered(universe, new(universeObject)); - - universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered); - universe.OnPreUniverseObjectUnRegistered.AddListener(delegateOnUniverseObjectUnregistered); - - Universe = universe; - OnAssign(universe); - OnUniverseAssigned?.Invoke(this); - - return true; - } - - public bool Unassign() - { - if (Universe is null) - return false; - - foreach (IUniverseObject universeObject in Universe.UniverseObjects) - OnUniverseObjectUnregistered(Universe, new(universeObject)); - - Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered); - Universe.OnPreUniverseObjectUnRegistered.RemoveListener(delegateOnUniverseObjectUnregistered); - - Universe = null!; - OnUnassigned?.Invoke(this); - return true; - } - - public int Count => behaviours.Count; - public T this[Index index] => behaviours[index]; - - public BehaviourCollector() - { - delegateOnBehaviourAdded = OnBehaviourAdded; - delegateOnBehaviourRemoved = OnBehaviourRemoved; - delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered; - delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered; - } - - public BehaviourCollector(IUniverse universe) - { - delegateOnBehaviourAdded = OnBehaviourAdded; - delegateOnBehaviourRemoved = OnBehaviourRemoved; - delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered; - delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered; - - Assign(universe); - } + public BehaviourCollector() { } + public BehaviourCollector(IUniverse universe) : base(universe) { } } diff --git a/Engine.Core/BehaviourCollectorBase.cs b/Engine.Core/BehaviourCollectorBase.cs new file mode 100644 index 0000000..dd2bbc5 --- /dev/null +++ b/Engine.Core/BehaviourCollectorBase.cs @@ -0,0 +1,125 @@ +using System; + +namespace Engine.Core; + +public abstract class BehaviourCollectorBase : IBehaviourCollector where T : class +{ + private readonly Event.EventHandler delegateOnBehaviourAdded = null!; + private readonly Event.EventHandler delegateOnBehaviourRemoved = null!; + private readonly Event.EventHandler delegateOnUniverseObjectRegistered = null!; + private readonly Event.EventHandler delegateOnUniverseObjectUnregistered = null!; + + public Event, IBehaviourCollector.BehaviourCollectedArguments> OnCollected { get; } = new(); + public Event, IBehaviourCollector.BehaviourRemovedArguments> OnRemoved { get; } = new(); + public Event OnUniverseAssigned { get; } = new(); + public Event? OnUnassigned { get; } = new(); + + public IUniverse Universe { get; private set; } = null!; + + public abstract int Count { get; } + + public abstract T this[Index index] { get; } + + public bool Assign(IUniverse universe) + { + if (Universe is not null) + return false; + + foreach (IUniverseObject universeObject in universe.UniverseObjects) + OnUniverseObjectRegistered(universe, new(universeObject)); + + universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered); + universe.OnPreUniverseObjectUnRegistered.AddListener(delegateOnUniverseObjectUnregistered); + + Universe = universe; + OnAssign(universe); + OnUniverseAssigned?.Invoke(this); + + return true; + } + + public bool Unassign() + { + if (Universe is null) + return false; + + foreach (IUniverseObject universeObject in Universe.UniverseObjects) + OnUniverseObjectUnregistered(Universe, new(universeObject)); + + Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered); + Universe.OnPreUniverseObjectUnRegistered.RemoveListener(delegateOnUniverseObjectUnregistered); + + Universe = null!; + OnUnassigned?.Invoke(this); + return true; + } + + protected virtual void OnAssign(IUniverse universe) { } + + protected abstract void AddBehaviour(T behaviour); + protected virtual void OnBehaviourAdd(IBehaviour behaviour) { } + private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments args) + { + if (args.BehaviourAdded is not T tBehaviour) + return; + + AddBehaviour(tBehaviour); + OnBehaviourAdd(args.BehaviourAdded); + OnCollected?.Invoke(this, new(tBehaviour)); + } + + protected abstract bool RemoveBehaviour(T tBehaviour); + protected virtual void OnBehaviourRemove(IBehaviour behaviour) { } + private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments args) + { + if (args.BehaviourRemoved is not T tBehaviour) + return; + + if (!RemoveBehaviour(tBehaviour)) + return; + + OnBehaviourRemove(args.BehaviourRemoved); + OnRemoved?.Invoke(this, new(tBehaviour)); + } + + + private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments args) + { + IUniverseObject universeObject = args.UniverseObjectRegistered; + + universeObject.BehaviourController.OnBehaviourAdded.AddListener(delegateOnBehaviourAdded); + universeObject.BehaviourController.OnBehaviourRemoved.AddListener(delegateOnBehaviourRemoved); + + for (int i = 0; i < universeObject.BehaviourController.Count; i++) + OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); + } + + private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments args) + { + IUniverseObject universeObject = args.UniverseObjectUnregistered; + + universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded); + universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved); + + for (int i = 0; i < universeObject.BehaviourController.Count; i++) + OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); + } + + public BehaviourCollectorBase() + { + delegateOnBehaviourAdded = OnBehaviourAdded; + delegateOnBehaviourRemoved = OnBehaviourRemoved; + delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered; + delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered; + } + + public BehaviourCollectorBase(IUniverse universe) + { + delegateOnBehaviourAdded = OnBehaviourAdded; + delegateOnBehaviourRemoved = OnBehaviourRemoved; + delegateOnUniverseObjectRegistered = OnUniverseObjectRegistered; + delegateOnUniverseObjectUnregistered = OnUniverseObjectUnregistered; + + Assign(universe); + } +}