Using a hierarchical state machine
Now that our FSM is working, it’s only natural to start thinking about sharing behavior across states. Luckily, OOP already provides the answer: just use the existing class hierarchy!
Since all our battle states inherit from BaseBattleState
, we can add the logic we want every subclass to have access to without duplicating it in each state script. Then, we can call the base class from each state whenever we want to defer the action. In our example, imagine we want to be able to pause and unpause the game at any time, but also prevent the player state from listening for key presses when the game is paused.
Open BaseBattleState
and update it to match the following code block, which overrides the HandleInput
method, listens for the spacebar key press, and toggles the pause state using the Manager
script.
public class BaseBattleState : State
{
protected BattleSM _stateMachine;
public BaseBattleState(BattleSM sm)
{
...