Машина (допустим MyFsm) управляет состояниями внутри себя.
И твой игровой Update() не содержит код для всех состояний, он просто содержит 1 строку - MyFsm.Tick()
Если нужно сменить состояние пишешь MyFsm.SetState(newState).
Всё, простая машина состояний готова.
Пример методов:
public class StateMachine
{
public void Tick() {}
public void SetState(IState state) {}
}
public interface IState
{
void OnEnter();
void Tick();
void OnExit();
}
Можно расширить это дело классом переходов - Transition(IState from, IState to, bool Funция predicate) чтобы ограничить машину состояний. И дать предикаты (функции-условия) для переходов.
Потом в Start() можно будет создать что-то вида:
fsm = new FSM.StateMachine();
// What states
var wait = new Waiting(this);
var move = new Moving(this, 5f);
var attack = new Attacking(this, Player.Instance);
// Transitions
fsm.AddTransition(wait, move, () => isTargetInRange);
fsm.AddTransition(move, wait, () => !isTargetInRange);
fsm.AddTransition(attack, wait, () => attack.IsComplete());
fsm.SetState(wait);
и дальше оно само себя управляет. Сделаешь базовое, потом станет понятно что там на Ютубе хотят показать. Я сам долгое время не понимал эту тему.