Actions как основа стейтов

Начинка каждого стейта внутри FSM — это экшены — действия. То, что выполняется внутри стейта пока объект находится в этом состоянии.

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

Слева — наше состояние, по центру — список действий внутри состояния и справа — библиотека экшенов для стейта.

Как только объект переходит в стейт — программа начинается выполнять экшены внутри него. Все экшены в стейт заносятся через огромную библиотеку экшенов, которая поставляется сразу с Unity Playmaker и которую можно расширять через Ecosystem Browser.

Разберем на примере, как устроены экшены в стейтах FSM внутри плеймейкера.

Как происходит добавление экшена

Самый простой вариант — найти экшн через строку поиска в библиотеке и перетащить его. Или дважды кликнуть по нему (убедитесь, что у вас выбран стейт, с которым вы работаете).

Слева добавленный экшн, справа поиск экшена в библиотеке.

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

Экшн 1

Установим количество полученного игроком урона. Жмем на None и ставим целочисленную переменную Damage, выбрав из выпадающего списка пункт New Variable.

Во второй строчке ставим к примеру 10.

Всё — мы задали урон, который получил игрок и сохранили его в переменную в пределах редактируемого FSM — теперь в любом стейте этого FSM мы сможем узнать, какой урон был нанесен игроку. Ни строчки кода, если не считать названия переменной.

Если поставить галочку Every Frame у этого экшена, то каждый кадр, каждый игровой такт, Плеймейкер будет назначать этой переменной Damage значение равное 10. Это бывает полезно, но в данном случае нам это не нужно. Наш стейт — «проходной» и зацикливаться в нем мы не будем.