using Syntriax.Engine.Core.Abstract; namespace Syntriax.Engine.Core; public abstract class Behaviour : BehaviourBase { private bool isInitializedThisFrame = false; protected IGameObject GameObject => BehaviourController.GameObject; protected ITransform Transform => BehaviourController.GameObject.Transform; public Behaviour() { OnInitialized += OnInitialize; OnFinalized += OnFinalize; OnUnassigned += OnUnassign; } protected virtual void OnUnassign() { } private void OnUnassign(IAssignable assignable) => OnUnassign(); protected virtual void OnInitialize() { } private void OnInitialize(IInitialize _) { isInitializedThisFrame = true; BehaviourController.OnPreUpdate += PreUpdate; BehaviourController.OnPreDraw += PreDraw; BehaviourController.OnUpdate += Update; OnInitialize(); } protected virtual void OnFinalize() { } private void OnFinalize(IInitialize _) { BehaviourController.OnPreUpdate -= PreUpdate; BehaviourController.OnPreDraw -= PreDraw; BehaviourController.OnUpdate -= Update; OnFinalize(); } protected virtual void OnPreUpdatePreActiveCheck() { } protected virtual void OnPreUpdate() { } private void PreUpdate(IBehaviourController _) { OnPreUpdatePreActiveCheck(); if (!IsActive) return; if (isInitializedThisFrame) FirstActiveFrame(); OnPreUpdate(); } protected virtual void OnFirstActiveFrame() { } private void FirstActiveFrame() { OnFirstActiveFrame(); isInitializedThisFrame = false; } protected virtual void OnUpdatePreActiveCheck() { } protected virtual void OnUpdate() { } private void Update(IBehaviourController _) { OnUpdatePreActiveCheck(); if (!IsActive) return; OnUpdate(); } protected virtual void OnPreDrawPreActiveCheck() { } protected virtual void OnPreDraw() { } private void PreDraw(IBehaviourController _) { OnPreDrawPreActiveCheck(); if (!StateEnable.Enabled) return; OnPreDraw(); } }