diff --git a/Assets/Plugins/Jason Tu/StateMachine/StateBehaviour.cs b/Assets/Plugins/Jason Tu/StateMachine/StateBehaviour.cs index ef65653e..0b61830a 100644 --- a/Assets/Plugins/Jason Tu/StateMachine/StateBehaviour.cs +++ b/Assets/Plugins/Jason Tu/StateMachine/StateBehaviour.cs @@ -8,8 +8,13 @@ public abstract class StateBehaviour : MonoBehaviour { public class TransitionToArgs : EventArgs { - public StateEnumValue NewState; + public StateBehaviour NewState; } - public event EventHandler TransitionTo; + public event EventHandler OnTransitionTo; + + protected void TransitionTo(StateBehaviour newState) + { + OnTransitionTo?.Invoke(this, new TransitionToArgs { NewState = newState }); + } } diff --git a/Assets/Plugins/Jason Tu/StateMachine/StateMachineBehaviour.cs b/Assets/Plugins/Jason Tu/StateMachine/StateMachineBehaviour.cs index e8aebcb6..7736595c 100644 --- a/Assets/Plugins/Jason Tu/StateMachine/StateMachineBehaviour.cs +++ b/Assets/Plugins/Jason Tu/StateMachine/StateMachineBehaviour.cs @@ -30,22 +30,26 @@ public class StateMachineChangedArgs : EventArgs private void Start() { TransitionTo(initialState); - CurrentState.TransitionTo += StateBehaviour_OnTransitionTo; } private void OnDisable() { - CurrentState.TransitionTo -= StateBehaviour_OnTransitionTo; + if (CurrentState != null) + CurrentState.OnTransitionTo -= StateBehaviour_OnTransitionTo; } protected void TransitionTo(StateBehaviour newState) { // Disable current state, if there is any. if (CurrentState != null) + { CurrentState.enabled = false; + CurrentState.OnTransitionTo -= StateBehaviour_OnTransitionTo; + } // Enable new state. newState.enabled = true; + newState.OnTransitionTo += StateBehaviour_OnTransitionTo; // Emit change event. OnChanged?.Invoke(this, new StateMachineChangedArgs { OldState = CurrentState, NewState = newState }); @@ -56,11 +60,6 @@ protected void TransitionTo(StateBehaviour newState) private void StateBehaviour_OnTransitionTo(object sender, StateBehaviour.TransitionToArgs args) { - CurrentState.TransitionTo -= StateBehaviour_OnTransitionTo; - - var newState = args.NewState.State; - newState.TransitionTo += StateBehaviour_OnTransitionTo; - - TransitionTo(newState); + TransitionTo(args.NewState); } } diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index d40f3c46..42ffcdad 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -409,6 +409,7 @@ MonoBehaviour: m_EditorClassIdentifier: playerConfiguration: {fileID: 11400000, guid: 0e29962fbc3e34aaea3620693e304758, type: 2} + playerMovingState: {fileID: 7520308135305952835} playerAnimationEvents: {fileID: 7873346240423897778} --- !u!114 &7520308135305952833 MonoBehaviour: @@ -424,6 +425,7 @@ MonoBehaviour: m_EditorClassIdentifier: playerConfiguration: {fileID: 11400000, guid: 0e29962fbc3e34aaea3620693e304758, type: 2} + playerMovingState: {fileID: 7520308135305952835} playerAnimationEvents: {fileID: 7873346240423897778} --- !u!114 &7520308135305952838 MonoBehaviour: @@ -439,6 +441,7 @@ MonoBehaviour: m_EditorClassIdentifier: playerConfiguration: {fileID: 11400000, guid: 0e29962fbc3e34aaea3620693e304758, type: 2} + playerMovingState: {fileID: 7520308135305952835} playerAnimationEvents: {fileID: 7873346240423897778} --- !u!1 &6524875693616862465 GameObject: diff --git a/Assets/Scripts/Behaviours/PlayerStateMachine/PlayerCollectingState.cs b/Assets/Scripts/Behaviours/PlayerStateMachine/PlayerCollectingState.cs index 6792243d..3630d0ab 100644 --- a/Assets/Scripts/Behaviours/PlayerStateMachine/PlayerCollectingState.cs +++ b/Assets/Scripts/Behaviours/PlayerStateMachine/PlayerCollectingState.cs @@ -7,6 +7,10 @@ public abstract class PlayerCollectingState : StateBehaviour [NotNull] protected PlayerConfiguration playerConfiguration; + [SerializeField] + [NotNull(IgnorePrefab = true)] + protected PlayerMovingState playerMovingState; + protected Resource resourceBeingCollected; protected Quaternion desiredRotation; @@ -34,10 +38,16 @@ private void ResourceBeingCollected_OnCollectCompleted(object sender, EventArgs OnCollectCompleted(); } + private void ResourceBeingCollected_OnDepleted(object sender, EventArgs eventArgs) + { + TransitionTo(playerMovingState); + } + public void Initialize(Resource resourceBeingCollected) { this.resourceBeingCollected = resourceBeingCollected; resourceBeingCollected.OnCollectCompleted += ResourceBeingCollected_OnCollectCompleted; + resourceBeingCollected.OnDepleted += ResourceBeingCollected_OnDepleted; desiredRotation = GetDesiredRotation(resourceBeingCollected, transform); } @@ -46,6 +56,7 @@ protected virtual void OnDisable() if (resourceBeingCollected != null) { resourceBeingCollected.OnCollectCompleted -= ResourceBeingCollected_OnCollectCompleted; + resourceBeingCollected.OnDepleted -= ResourceBeingCollected_OnDepleted; resourceBeingCollected.ResetRemainingTime(); } }