perf: regular events to custom events

This commit is contained in:
2025-05-30 12:58:08 +03:00
parent b1b5af94d3
commit 846aa75dd5
42 changed files with 342 additions and 198 deletions

View File

@@ -1,11 +1,17 @@
using System;
namespace Syntriax.Engine.Core;
[System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")]
public abstract class BehaviourBase : BaseEntity, IBehaviour
{
public event IHasBehaviourController.BehaviourControllerAssignedEventHandler? OnBehaviourControllerAssigned = null;
public event IBehaviour.PriorityChangedEventHandler? OnPriorityChanged = null;
public event IActive.ActiveChangedEventHandler? OnActiveChanged = null;
public Event<IBehaviour, int> OnPriorityChanged { get; private set; } = new();
public Event<IActive, bool> OnActiveChanged { get; private set; } = new();
public Event<IHasBehaviourController> OnBehaviourControllerAssigned { get; private set; } = new();
private Action<IHasUniverseObject> cachedOnUniverseObjectAssigned = null!;
private Action<IActive, bool> cachedOnUniverseObjectActiveChanged = null!;
private Action<IStateEnable, bool> cachedOnStateEnabledChanged = null!;
private IBehaviourController _behaviourController = null!;
public IBehaviourController BehaviourController => _behaviourController;
@@ -36,7 +42,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
_behaviourController = behaviourController;
OnAssign(behaviourController);
behaviourController.OnUniverseObjectAssigned += OnUniverseObjectAssigned;
behaviourController.OnUniverseObjectAssigned.AddListener(cachedOnUniverseObjectAssigned);
if (behaviourController.UniverseObject is not null)
OnUniverseObjectAssigned(behaviourController);
OnBehaviourControllerAssigned?.Invoke(this);
@@ -45,7 +51,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
private void OnUniverseObjectAssigned(IHasUniverseObject sender)
{
sender.UniverseObject.OnActiveChanged += OnUniverseObjectActiveChanged;
sender.UniverseObject.OnActiveChanged.AddListener(cachedOnUniverseObjectActiveChanged);
UpdateActive();
}
@@ -53,13 +59,14 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
{
base.OnAssign(stateEnable);
stateEnable.OnEnabledChanged += OnStateEnabledChanged;
stateEnable.OnEnabledChanged.AddListener(cachedOnStateEnabledChanged);
}
protected override void UnassignInternal()
{
StateEnable.OnEnabledChanged -= OnStateEnabledChanged;
BehaviourController.OnUniverseObjectAssigned -= OnUniverseObjectAssigned;
BehaviourController.UniverseObject.OnActiveChanged.RemoveListener(cachedOnUniverseObjectActiveChanged);
StateEnable.OnEnabledChanged.RemoveListener(cachedOnStateEnabledChanged);
BehaviourController.OnUniverseObjectAssigned.RemoveListener(cachedOnUniverseObjectAssigned);
base.UnassignInternal();
_behaviourController = null!;
}
@@ -81,4 +88,11 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
if (previousActive != IsActive)
OnActiveChanged?.Invoke(this, previousActive);
}
protected BehaviourBase()
{
cachedOnUniverseObjectAssigned = OnUniverseObjectAssigned;
cachedOnUniverseObjectActiveChanged = OnUniverseObjectActiveChanged;
cachedOnStateEnabledChanged = OnStateEnabledChanged;
}
}