⚙

State Machine

What's that?

State Machine is a programming pattern that groups the behavior of an object into a state or what is known as a state. The state can change according to the action performed by the object. This pattern is widely used in game development to manage the behavior of characters or objects in the game.
State Machine illustration
One example of the use of State Machines in game development is the character movement system. In-game characters can move in different directions, such as walking, running or jumping. Each of these movements is a separate state. State Machines can be used to manage transitions from one state to another. For example, when a character is walking and the jump button is pressed, the character will enter a jump state which will perform a function when the state changes to jump, such as playing a jump animation for the character.
Apart from that, the State Machine Design Pattern can also be used to manage the behavior of other objects in the game, such as NPC (Non-Player Character) or enemies. NPCs can have various states, such as idle, chatting, or currently attacking. By using the State Machine Design Pattern, we can easily manage the transition from one state to another on the NPC.
However, there are a few things to consider when using State Machine. First, we have to make sure that each state has an implementation that fits that state. Second, we have to make sure that every state transition is done correctly, so that invalid state doesn't occur.
State machines in Gamepangin are different from Finite State Machines. Where if in the Finite State Machine you determine the Transition from one state to another possible state so that you can prevent unwanted changes to the state from the previous state. In an ordinary State Machine, you are free to move from any state to any state, you are expected to manage the possibilities that occur in the state that you will create later.

Implementation

Add the StateMachine component to the GameObject you want. Then create a new GameObject under the parent State Machine which will act as the State.
After creating the GameObject, add the State component, then add the GameObject to the States field in the State Machines component.
For the implementation of methods that will be executed when this State Machine enters/exits a certain State, you can fill in the UnityEvent directly through the inspector on the currently selected State component.
To change a State to another State, you can use the SetState() API
public StateMachine myStateMachine;
​
void GoToStateB(){
myStateMachine.SetState("State B")
}