fix: active checks on behaviour base and universe object not working properly

This commit is contained in:
Syntriax 2025-08-04 22:01:16 +03:00
parent 11719440dc
commit e00319d7ff
2 changed files with 6 additions and 1 deletions

View File

@ -44,6 +44,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
_behaviourController = behaviourController; _behaviourController = behaviourController;
OnAssign(behaviourController); OnAssign(behaviourController);
behaviourController.OnUniverseObjectAssigned.AddListener(delegateOnUniverseObjectAssigned); behaviourController.OnUniverseObjectAssigned.AddListener(delegateOnUniverseObjectAssigned);
behaviourController.StateEnable.OnEnabledChanged.AddListener(delegateOnStateEnabledChanged);
if (behaviourController.UniverseObject is not null) if (behaviourController.UniverseObject is not null)
OnUniverseObjectAssigned(behaviourController); OnUniverseObjectAssigned(behaviourController);
OnBehaviourControllerAssigned?.Invoke(this); OnBehaviourControllerAssigned?.Invoke(this);
@ -68,6 +69,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
BehaviourController.UniverseObject.OnActiveChanged.RemoveListener(delegateOnUniverseObjectActiveChanged); BehaviourController.UniverseObject.OnActiveChanged.RemoveListener(delegateOnUniverseObjectActiveChanged);
StateEnable.OnEnabledChanged.RemoveListener(delegateOnStateEnabledChanged); StateEnable.OnEnabledChanged.RemoveListener(delegateOnStateEnabledChanged);
BehaviourController.OnUniverseObjectAssigned.RemoveListener(delegateOnUniverseObjectAssigned); BehaviourController.OnUniverseObjectAssigned.RemoveListener(delegateOnUniverseObjectAssigned);
BehaviourController.StateEnable.OnEnabledChanged.RemoveListener(delegateOnStateEnabledChanged);
base.UnassignInternal(); base.UnassignInternal();
_behaviourController = null!; _behaviourController = null!;
} }
@ -76,6 +78,8 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
{ {
Debug.Assert.AssertBehaviourControllerAssigned(this); Debug.Assert.AssertBehaviourControllerAssigned(this);
Debug.Assert.AssertStateEnableAssigned(this); Debug.Assert.AssertStateEnableAssigned(this);
UpdateActive();
} }
private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments args) => UpdateActive(); private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments args) => UpdateActive();
@ -84,7 +88,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour
private void UpdateActive() private void UpdateActive()
{ {
bool previousActive = IsActive; bool previousActive = IsActive;
_isActive = StateEnable.Enabled && _behaviourController.UniverseObject.IsActive; _isActive = StateEnable.Enabled && _behaviourController.StateEnable.Enabled && _behaviourController.UniverseObject.IsActive;
if (previousActive != IsActive) if (previousActive != IsActive)
OnActiveChanged?.Invoke(this, new(previousActive)); OnActiveChanged?.Invoke(this, new(previousActive));

View File

@ -133,6 +133,7 @@ public class UniverseObject : BaseEntity, IUniverseObject
base.OnAssign(stateEnable); base.OnAssign(stateEnable);
stateEnable.OnEnabledChanged.AddListener(OnStateEnabledChanged); stateEnable.OnEnabledChanged.AddListener(OnStateEnabledChanged);
UpdateActive();
} }
private void OnParentActiveChanged(IActive sender, IActive.ActiveChangedArguments args) => UpdateActive(); private void OnParentActiveChanged(IActive sender, IActive.ActiveChangedArguments args) => UpdateActive();