Уроки Коммент.

Создание игр » AI, Featured » FSM (Finite-state machine)

FSM (Finite-state machine)

FSM собаки из игры QuakeFinite-state machine или FSM это термин, под которым обычно подразумевают так называемую машину конечных состояний или, как ещё иногда говорят, конечный автомат. Но чаще, всё же, используется именно сокращение FSM. FSM – это абстракция, которая используется для создания логики, в том числе и игровой. Например, обычно любой объект АИ это FSM, разного рода анимации обычно можно описать как FSM. Да и само состояние игры обычно описывается именно как ФСМ. Само название Finite-state machine говорит о том, что состояний имеется конечное количество и потому программист может каждое из них описать и задать поведение объекта (будь то монстр, космический корабль или состояние игры) в данном состоянии. В общем, ФСМ это штука нужная и полезная, и потому нам надо будет разобраться как её использовать на практике.

FSM

Фактически, FSM это просто некий “автомат”, который может иметь какие-то различные состояния и в один момент времени может находиться лишь в одном из этих состояний. Например, если враг может просто ходить по уровню, может атаковать игрока, а так же может прятаться, то его поведение легко задаётся с помощью Finite-state machine с тремя состояниями: иду, атакую, прячусь. Если мы опишем действия, которые должен выполнять враг в каждом из этих трёх состояний, а потом будем переключать их по каким-то законам (или случайным образом) – у игрока возникнет ощущение, что враг наделён каким-то интеллектом.

FSM transition table

В играх (да и не только) чаще всего описываются не только возможные состояния FSM, но и правила (условия) перехода FSM из одного состояния в другое. Чаще всего при проектировании эти правила представляются в виде таблицы перехода состояний и потому таблицу эту называют “state transition table”, явно намекая на то, что она задаёт как будет осуществляться переход (transition) из одного состояния FSM в другое её состояние. Ну, например, простая таблица FSM может выглядеть так:

Состояние конечное/исходноеПрогулкаАтака
Вижу врагаАтака-
Не вижу врага-Прогулка

Работать FSM по этой таблице будет примерно так:

Текущее состояние: Прогулка
Вижу врага? Да. Перехожу в состояние “Атака”

Текущее состояние: Атака
Вижу врага? Нет. Перехожу в состояние “Прогулка”

Текущее состояние: Прогулка
Вижу врага? Нет. Не меняю состояние.

Текущее состояние: Атака
Вижу врага? Да. Не меняю состояние.

Иными словами, FSM принимает данные (например, данные об игровом мире) и, основываясь на них, может менять (либо не менять) своё текущее состояние.

FSM, вход и выход из состояний

Для удобства работы, обычно каждому состоянию FSM так же задают 2 дополнительных функции: функцию входа в состояние и функцию выхода из состояния. Причин для их использования можно найти много, я же приведу лишь одну: эти функции позволяют “подготовить” объект к входу в состояние, либо к выходу их него. Что бы это не звучало банально, приведу несколько примеров:

  • При входе в состояние “иду”, мы можем загрузить анимацию ходьбы
  • При выходе из состояния “иду” мы можем выгрузить эту анимацию, поскольку она нам больше не нужна
  • При входе в состояние “прячусь” мы можем запомнить: куда мы решили спрятаться, от кого мы прячемся, каким путём мы решили пройти в выбранную нами точку-нычку )))

В случае, если ФСМ не является отдельной сущностью, а является частью объекта, часто добавляется ещё одна функция – функция “исполнения” состояния. Например, эта функция может переключать “кадры” анимации, для получения плавной ходьбы или реализовывать какой-то AI, либо и то и другое вместе.

Методы реализации FSM

Есть два наиболее часто применяемых метода реализации FSM:

  1. Статический FSM. Поведение Finite-state machine определяется на стадии компиляции программы и не может изменяться в runtime. Этот метод обеспечивает наибольшее быстродействие и он проще в реализации.
  2. Динамический метод реализации FSM. Поведение машины состояний может изменяться runtime путём добавления или удаления (включения/выключения) возможных состояний FSM. Гораздо более гибкий метод, но он значительно сложнее в реализации и используется достаточно редко.

Хочу подкинуть вам ещё одну интересную статейку по реализации статической FSM – попробуйте разобраться, вам понравится идея.

Это всё, что я хотел вам рассказать о FSM. В следующих уроках я покажу вам примеры реализации ФСМ на C++.

Ещё по этой теме:




Раздел: AI, Featured · Теги: AI, FSM

2 комментариев на "FSM (Finite-state machine)"
  1. Артем пишет:

    Заметил не допечатку:

    Есть два наиболее метода реализации FSM:

    1. Вячеслав пишет:

      Спасибо! Исправил!

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>