namespace Syntriax.Engine.Core; public abstract class Behaviour : BehaviourBase { private readonly Event.EventHandler delegateEnteredUniverse = null!; private readonly Event.EventHandler delegateExitedUniverse = null!; public Behaviour() { OnInitialized.AddListener(OnInitialize); OnFinalized.AddListener(OnFinalize); OnUnassigned.AddListener(OnUnassign); delegateEnteredUniverse = EnteredUniverse; delegateExitedUniverse = ExitedUniverse; } protected virtual void OnUnassign() { } protected void OnUnassign(IAssignable assignable) => OnUnassign(); protected virtual void OnInitialize() { } protected void OnInitialize(IInitializable _) { BehaviourController.UniverseObject.OnEnteredUniverse.AddListener(delegateEnteredUniverse); BehaviourController.UniverseObject.OnExitedUniverse.AddListener(delegateExitedUniverse); OnInitialize(); if (UniverseObject.IsInUniverse) EnteredUniverse(UniverseObject, new(Universe)); } protected virtual void OnFinalize() { } protected void OnFinalize(IInitializable _) { BehaviourController.UniverseObject.OnEnteredUniverse.RemoveListener(delegateEnteredUniverse); BehaviourController.UniverseObject.OnExitedUniverse.RemoveListener(delegateExitedUniverse); OnFinalize(); if (UniverseObject.IsInUniverse) ExitedUniverse(UniverseObject, new(Universe)); } protected virtual void OnEnteredUniverse(IUniverse universe) { } protected void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments args) => OnEnteredUniverse(args.Universe); protected virtual void OnExitedUniverse(IUniverse universe) { } protected void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments args) => OnExitedUniverse(args.Universe); }