diff --git a/Engine.Core/Abstract/IBehaviourController.cs b/Engine.Core/Abstract/IBehaviourController.cs
index b5a1f2c..28548bb 100644
--- a/Engine.Core/Abstract/IBehaviourController.cs
+++ b/Engine.Core/Abstract/IBehaviourController.cs
@@ -11,6 +11,10 @@ namespace Syntriax.Engine.Core.Abstract;
///
public interface IBehaviourController : IAssignableGameObject
{
+ ///
+ /// Callback triggered when the is called but right before the action is triggered.
+ ///
+ Action? OnPreUpdate { get; set; }
///
/// Callback triggered when the is called.
///
diff --git a/Engine.Core/BehaviourController.cs b/Engine.Core/BehaviourController.cs
index ef60e98..cffe44b 100644
--- a/Engine.Core/BehaviourController.cs
+++ b/Engine.Core/BehaviourController.cs
@@ -10,6 +10,7 @@ namespace Syntriax.Engine.Core;
public class BehaviourController : IBehaviourController
{
+ public Action? OnPreUpdate { get; set; }
public Action? OnUpdate { get; set; } = null;
public Action? OnPreDraw { get; set; } = null;
@@ -111,8 +112,10 @@ public class BehaviourController : IBehaviourController
if (!GameObject.StateEnable.Enabled)
return;
+ OnPreUpdate?.Invoke(this, gameTime);
OnUpdate?.Invoke(this, gameTime);
}
+
public void UpdatePreDraw(GameTime gameTime)
{
if (!GameObject.StateEnable.Enabled)
diff --git a/Engine.Core/BehaviourOverride.cs b/Engine.Core/BehaviourOverride.cs
index 0bc67d5..5c2e9f3 100644
--- a/Engine.Core/BehaviourOverride.cs
+++ b/Engine.Core/BehaviourOverride.cs
@@ -1,4 +1,3 @@
-using System;
using Microsoft.Xna.Framework;
using Syntriax.Engine.Core.Abstract;
@@ -7,6 +6,8 @@ namespace Syntriax.Engine.Core;
public abstract class BehaviourOverride : Behaviour
{
+ private bool isInitializedThisFrame = false;
+
protected IGameObject GameObject => BehaviourController.GameObject;
protected ITransform Transform => BehaviourController.GameObject.Transform;
@@ -23,6 +24,9 @@ public abstract class BehaviourOverride : Behaviour
protected virtual void OnInitialize() { }
private void OnInitialize(IInitialize _)
{
+ isInitializedThisFrame = true;
+
+ BehaviourController.OnPreUpdate += PreUpdate;
BehaviourController.OnPreDraw += PreDraw;
BehaviourController.OnUpdate += Update;
OnInitialize();
@@ -31,11 +35,34 @@ public abstract class BehaviourOverride : Behaviour
protected virtual void OnFinalize() { }
private void OnFinalize(IInitialize _)
{
+ BehaviourController.OnPreUpdate -= PreUpdate;
BehaviourController.OnPreDraw -= PreDraw;
BehaviourController.OnUpdate -= Update;
OnFinalize();
}
+ protected virtual void OnPreUpdatePreEnabledCheck(GameTime time) { }
+ protected virtual void OnPreUpdate(GameTime time) { }
+ private void PreUpdate(IBehaviourController _, GameTime time)
+ {
+ OnPreUpdatePreEnabledCheck(time);
+
+ if (!StateEnable.Enabled)
+ return;
+
+ if (isInitializedThisFrame)
+ FirstActiveFrame(time);
+
+ OnPreUpdate(time);
+ }
+
+ protected virtual void OnFirstActiveFrame(GameTime time) { }
+ private void FirstActiveFrame(GameTime time)
+ {
+ OnFirstActiveFrame(time);
+ isInitializedThisFrame = false;
+ }
+
protected virtual void OnUpdatePreEnabledCheck(GameTime time) { }
protected virtual void OnUpdate(GameTime time) { }
private void Update(IBehaviourController _, GameTime time)