Что такое FSM в Unity Playmaker

FSM (ФСМ) — это то, с чем вам придется работать при создании игр с помощью Playmaker в Unity, если вы не хотите использовать классическое программирование. Проще говоря FSM это тот же самый скрипт, только визуальный.

FSM расшифровывается как Finite State Machine — вычислительная модель, описывающая автомат с конечным числом состояний, иногда можно встретить FSA как обозначение, но в плеймейкере такого нет. Почитать об истории этой вычислительной модели (которая к слову лежит в основе большинства техники, что вы используете) можно в англоязычной википедии.

Что такое FSM в Unity Playmaker? Это скрипт визуального программирования, суть которого заключается в определении возможных состояний объекта и связей между ними.

Разберем пример, как «читается» обычный FSM.

Состояние 1(еще его называют стейт): на столе возникла булка с кремом и ждет пока её кто нибудь съест. Сейчас булка находится в состоянии ожидания. С ней ничего не происходит кроме этого ожидания.

Состояние 2: Кот подходит и слизывает крем. Проверяем что это за кот — наш или соседский. Если кот наш, то ничего не делаем, если кот соседский, то переходим в другое состояние.

Состояние 3: Мы знаем что к булке с кремом подходил кот, и что этот кот оказался соседским. Проверим на всякий случай какой был у булки крем, который слизал соседский кот — если крем был вкусный ванильный — то переходим в Состояние 4. Если же крем был из жмыха соплей умирающего дракона — то переходим в Состояние 5.

Состояние 4: Мы знаем, что соседский кот слизал с нашей булки ванильный крем, и поэтому единственное действие в этом состоянии — включить сирену на всю улицу, потому что никто кроме нашего собственного кота не может пробовать ванильный крем. Все. На этом сценарий заканчивается и мы слышим сирену.

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

Всё, сценарий работы ФСМ готов. В двух последних случаях, мы можем сослаться на первое состояние булки, чтобы она снова лежала на столе и ждала действий с собой, и тогда у нас будет возможность целых 9 раз дать коту слизать драконий жмых, прежде чем усатый отдаст концы.

Именно так работает визуальный скриптинг с помощью FSM в Unity Playmaker — мы навешиваем на объект компонент FSM и задаем состояния, в которых этот объект может пребывать, ссылаясь при этом на какие-либо сторонние объекты (к примеру мы можем проверить, является ли хозяином соседского кота конкретный человек).

FSM выполняется каждый игровой такт (или если быть точным — каждый фрейм) — это значит, что игра каждый фрейм проверяет у объекта его состояние, и если условия позволяют сменить это состояние — то тут же его меняет. Обычные скрипты также работают основываясь на игровых фреймах и ожидающие «событий».

Разберем на примерах, из чего состоит FSM

Как уже было сказано, основная сущность внутри FSM в Unity Playmaker — это стейт, или же состояние. Но помимо этого есть еще не менее важная сущность — это Событие. Или если использовать привычное название — эвент.

Стартовое событие

Все ФСМ начинаются с базового события, которое называется START — это внешний эвент, если угодно — глобальный, который происходит как бы извне с объектом. Когда объект создается на сцене в Unity — у него инициируется событие Start и объект переходит в самое первое свое состояние. Обычно здесь указываются все стартовые параметры объекта например.

Событие это та сущность, которая определяет некое действие. Скажем, в приведенном примере, когда в первом состоянии булка дождалась кота и он лизнул булку — происходит Событие — Эвент — и оно инициирует новое состояние.

2 стейта и одно событие в первом стейте.

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

При выполнении разных условий переходим к разным стейтам.

Может получиться так, что этот объект, участвует в сценарии, который был инициирован где-то извне, и к этому объекту обращаются как бы извне — скажем, булку порезали на двое. В этом случае событие приходит извне, и объекту нужно на него отреагировать. Для этого можно задать внешний эвент в этом же FSM и тогда булка перейдет в новое состояние, отвечающее тому, чего требует условия извне.

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

Такие внешние события могут быть изолированыыми, а могут возвращать булку у исходному состоянию, с которого все начиналось — в нашем случае булка поделенная две части, продолжит ждать когда с нее слижут крем.

Нехитро ссылаемся на стартовое состояние.

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