Gamedev. Finite State Machine. Объясните новичку

сам я занимаюсь бэкенд-разработкой. Но стало интересно посмотреть на gamedev. Увидел, что разработчики часто используют паттерн FSM. Сама концепция этого паттерна мне понятна, но есть один момент, который я пока не могу понять. Важный момент FSM в том, что активным может быть только одно состояние. Из всех материалов, которые мне попались подаётся тривиальный пример состояний. К примеру, player может находиться в состоянии бездействия (IdleState), в состоянии прыжка (JumpState) и состоянии бега (RunState). Здесь действительно всё понятно. А что, если мы добавим состояние, когда player атакует (AttackState)? Player может атаковать в прыжке, а может бежать и атаковать. Но не может же быть активно несколько состояний сразу. Подскажите пожалуйста, как правильно будет поступить в данной ситуации? И если есть возможность, был бы рад ссылкам на толковые материалы по FSM, желательно на русском языке.

UPD: Или для таких случаев нужно иметь несколько отдельных FSM? К примеру, у player'a может быть MovementFSM, в котором находятся состояния (Idle, Run, Jump), а также CombatFSM, в котором находятся такие состояния, как (Attack, Defend)?


Ответы (1 шт):

Автор решения: Kromster

FSM это как про атомарное, так и про комплекс в целом. Игра работает, игра зависла - вот например два состояния.

Важно (https://ru.wikipedia.org/wiki/Конечный_автомат) - это машина Н-ного конечного количества состояний (бегу, жуя бутерброд, с развязанным шнурком, в толстовке, думая про ГОСы), а не Н-ного количества одного состояния (либо бегу, либо стою).

Даже в простом примере, обязательно будет несколько наслоенных состояний, когда игрок одновременно и атакует, и регенерирует здоровье и восстанавливает ману и движется по оси Х, и движется по оси Y (видите, как можно одно движение разделить на 2 атрибута?) одновременно N разными состояниями на M разных подсистемах и O атрибутах.

На фронте с аналогией попроще - каждая программа находится в каком-то состоянии и переключается между состояниями. Каждое состояние может быть сколь-угодно комплексным.

Касательно вашего примера, скорее всего это будет FSM для текущего действия (команды от игрока) и набора атрибутов на которые они (не все) влияют при смене состояния. Игрок сказал бежать - повернули player`а, задали вектор скорости, выбрали нужную анимацию (возможно с интерполяцией от прошлой). Какие-то системы (например стамина) смотрят на состояние и перестают действовать (или проактивно отключаются при смене состояния). Через n тиков игрок сказал атаковать - решили что делать с вектором скорости (плавно погасить до 0 за n тиков или обнулить сразу в зависимости от типа атаки?) поменяли анимацию (возможно с интерполяцией от прошлой), начали проверять хитбоксы npc на предмет нанесения урона.

Начните с простого - потом усложните.

→ Ссылка