namespace Syntriax.Engine.Core; public abstract class Behaviour : BehaviourBase { private bool isInitializedThisFrame = false; protected IUniverse Universe => BehaviourController.UniverseObject.Universe; protected IUniverseObject UniverseObject => BehaviourController.UniverseObject; public Behaviour() { OnInitialized += OnInitialize; OnFinalized += OnFinalize; OnUnassigned += OnUnassign; } protected virtual void OnUnassign() { } protected virtual void OnUnassign(IAssignable assignable) => OnUnassign(); protected virtual void OnInitialize() { } protected virtual void OnInitialize(IInitializable _) { isInitializedThisFrame = true; BehaviourController.OnPreUpdate += PreUpdate; BehaviourController.OnPreDraw += PreDraw; BehaviourController.OnUpdate += Update; BehaviourController.UniverseObject.OnEnteredUniverse += EnteredUniverse; BehaviourController.UniverseObject.OnExitedUniverse += ExitedUniverse; OnInitialize(); if (UniverseObject.IsInUniverse) EnteredUniverse(UniverseObject, Universe); } protected virtual void OnFinalize() { } protected virtual void OnFinalize(IInitializable _) { BehaviourController.OnPreUpdate -= PreUpdate; BehaviourController.OnPreDraw -= PreDraw; BehaviourController.OnUpdate -= Update; BehaviourController.UniverseObject.OnEnteredUniverse -= EnteredUniverse; BehaviourController.UniverseObject.OnExitedUniverse -= ExitedUniverse; OnFinalize(); if (UniverseObject.IsInUniverse) ExitedUniverse(UniverseObject, Universe); } protected virtual void OnPreUpdatePreActiveCheck() { } protected virtual void OnPreUpdate() { } protected virtual void PreUpdate(IBehaviourController _) { Debug.AssertHelpers.AssertInitialized(this); OnPreUpdatePreActiveCheck(); if (!IsActive) return; if (isInitializedThisFrame) FirstActiveFrame(); OnPreUpdate(); } protected virtual void OnFirstActiveFrame() { } protected virtual void FirstActiveFrame() { OnFirstActiveFrame(); isInitializedThisFrame = false; } protected virtual void OnUpdatePreActiveCheck() { } protected virtual void OnUpdate() { } protected virtual void Update(IBehaviourController _) { Debug.AssertHelpers.AssertInitialized(this); OnUpdatePreActiveCheck(); if (!IsActive) return; OnUpdate(); } protected virtual void OnPreDrawPreActiveCheck() { } protected virtual void OnPreDraw() { } protected virtual void PreDraw(IBehaviourController _) { Debug.AssertHelpers.AssertInitialized(this); OnPreDrawPreActiveCheck(); if (!StateEnable.Enabled) return; OnPreDraw(); } protected virtual void OnEnteredUniverse(IUniverse universe) { } protected virtual void EnteredUniverse(IUniverseObject sender, IUniverse universe) => OnEnteredUniverse(universe); protected virtual void OnExitedUniverse(IUniverse universe) { } protected virtual void ExitedUniverse(IUniverseObject sender, IUniverse universe) => OnExitedUniverse(universe); }