112 lines
3.3 KiB
C#
112 lines
3.3 KiB
C#
using Syntriax.Engine.Core.Abstract;
|
|
|
|
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);
|
|
}
|