FSM

Общие сведения o FSM

FSM - это Finite State Machine или конечный автомат (КА). Конечный автомат — Википедия В случае человека или животных КА отвечает за то, чтобы объект адекватно анимировался и не попадал в недопустимые состояния.

Реализация FSM в игре отличается от классического КА. Состояния юнита в игре переключаются по внешним запросам, а не по сигналам, и могут работать длительное время. FSM не используется для управления объектом! FSM является арбитром между противоречивыми запросами от внешних систем управления

Каждому состоянию соответствует свой набор анимаций.

Он нужен как арбитр между противоречивыми запросами от внешних систем управления, чтобы управляемый объект точно знал в какое состояние он может перейти и какой именно из запросов сейчас должен выполниться.

Компоненты FSM

Состояния

Состояния формируют граф. Каждому состоянию соответствует набор анимаций. Юнит может находится в каждый конкретный момент времени только в одном состоянии Связи между состояниями задают структуру возможных переходов между состояниями.

Теги состояний

По тэгам внешние подсистемы определяют, что с юнитом происходит в данный момент. По тэгам запросы знают, в какое состояние им нужно переключиться.

Запросы от внешних управляющих систем

Запрос переключает состояние юнита в ближайшее доступное по графу состояние с нужным тэгом. Тэг равен имени запроса. Состояния не обязательно находятся на графе рядом - переключение может идти через промежуточные состояния.

Виды запросов

Switch

  • делается однократно

  • висит в ожидании своего часа пока не выполнится

  • после выполнения запрос удаляется например, команда "лечь"

Job

  • запрос должен вызываться постоянно (каждый квант)

  • после захода в нужное состояние юнит будет оставаться в этом состоянии, пока запрос не будет прерван более приоритетным запросом или пока запрос не перестанет вызываться

  • если запрос не вызывался из кода более чем duration квантов, то он автоматически удаляется

  • если при отмене запроса он находится в нужном состоянии, то запустится switch запрос прописанный в exit, например, ремонт техники

Action

  • запрос должен вызываться постоянно (каждый квант)

  • если не вызывался хотя бы 1 квант - сбрасывается

  • сразу после срабатывания автоматически сбрасывается

  • как только запрос сработал - значит что мы в нужном состоянии и можно выполнить необходимую операцию, например, бросок гранаты

State

  • запрос вызывается один раз

  • после переключения юнит остаётся в этом состоянии, пока не будет выведен из него более приоритетным запросом или пока запрос не будет отменен и сработает другой запрос, например, убирание оружия солдатом, если оно вошло в стену при прямом управлении

FSM handler

  • Запускает анимации в коде.

  • Ведет список запущенных анимаций, чтобы знать когда анимация закончилась или остановить её при экстренном переходе на другое состояние.

  • Может запускать скрипты или информировать верхний уровень об изменениях в состоянии (например, что оружие уже взято в руки или солдат наконец принял нужную позу в укрытии).

FSM handler вызывается 2 раза для каждого состояния: 1) на входе в состояние - запускаются анимации 2) при выходе из состояния - останавливаются запущенные в этом состоянии анимации

Подмножества в FSM handler

Код выбирает в fsm handler нужное fsm подмножество, в зависимости от состояния юнита Подмножество определяет какие состояния доступны в графе, а какие нет. Например, юнит с канистрой в руках не сможет лежать, сидеть и ремонтировать, поэтому эти состояния будут недоступны.

Не прописывайте анимации в коде. Используйте запросы в animation selector, чтобы была возможность добавлять новые анимации из настроечных файлов, не трогая код.

Для каждого объекта лучше иметь свой специфический fsm handler, если только объекты не являются однотипными и всё их различие только в анимациях.

Last updated