Настройка idle актера human
Основные принципы
Список FSM-состояний, из которых возможен запуск idle-анимаций:
board
- актер прилинкован к другому объекту;lie_idle
- лежит;snipe
- выглядывает из-за забора;squat
- сидит;idle
- стоит и ничем не занят.
Выбор idle-анимации происходит в два этапа:
Выбор запроса для Селектора анимаций
Логика выбора запроса описана в файле Селектора запроса \properties\animation_selector\
human_idle_selector.set
.
Выбор idle-анимаций
По выбранному на первом шаге запросу выбираются конкретные idle-анимации.
Логика выбора описана в файле human_idle.inc
, который является частью файла Селектора анимаций \properties\animation_selector\
human.set
Для создания цепочек переключения idle-состояний в FSM хранится текущее idle-состояние актера.
Конфигурация Селектора idle-запроса
Синтаксис
human_idle_selector.set
{init {state "<initial_state>"} ; обязательный параметр {semaphore "<name>" <time_from> <time_to>} } {selector {if <condition> {idle {run "<request_name>"} ; имя запроса к Animation Selector {state "<new_state>"} ; при необходимости изменить состояние FSM {semaphore "<name>" <time_from> <time_to>} ; переопределение семафора } } [...] {idle {run ""} ;запуск пустого запроса } }
{init ...}
Блок инициализации, вызывается при старте игры или спавне юнита.
Задаёт начальное состояние FSM (state
) и устанавливает блокировки семафоров (semaphore
).
state "<initial_state>"
Устанавливает FSM-состояние актера сразу после его спавна. Обязательный параметр.
Пример: "idle"
.
semaphore "<name>" <time_from> <time_to>
Блокирует или разблокирует семафор на указанное время (в секундах). Например, semaphore "can_smoke" 10 30
означает запрет курения на случайный срок от 10 до 30 сек.
{selector ...}
Основной блок, в котором происходит логика выбора запросов к Селектору анимаций в зависимости от текущего состояния FSM и условий.
{if <condition> ...}
Условная конструкция.
Проверяет состояние FSM (fsm_tags
, human_fsm_idle_state
), активность семафоров (human_fsm_idle_semaphore
), наличие взаимодействия актера с предметами (например, human_stuff holding
) и другие параметры.
Подробнее про синтаксис условий
{idle ...}
Блок для описания набора действий, исполняемых, если соответствующее условие выполнилось.
Внутри блока задается команда run
запуска запроса для Селектора анимаций.
Опционально может задаваться смена состояния (state
) и семафоров (semaphore
).
run "<request_name>"
Команда активирует указанный запрос, который в дальнейшем используется в Селекторе анимаций (animation_selector/human.set
).
Пример: run "stand_smoking_begin"
.
По имени запроса будет подобран соответствующий набор анимаций.
Отсутствие указанного имени в команде означает запуск пустого запроса. При этом сохраняется текущая анимация актера.
В случае выбора пустого запроса актер стоит неподвижно некоторое время, после чего выбор запроса стартует заново.
Cостояния idle
В игре Men of War II используются два idle-состояния:
idle
- играет обычные idle анимации;smoking
- играет анимации курения.
Чтобы добавить возможность выбора idle анимаций в состоянии, где его раньше никогда не было, необходимо добавить в коде состояния поддержку idle .
Семафоры в Селекторе idle-запросов
Семафоры применяются для управления частотой и условиями запуска определённых запросов. Они служат для задания временных ограничений, предотвращающих синхронное анимирование группы юнитов.
Синтаксис семафора
{semaphore "<semaphore_name>" N}
N
- время блокировки семафора, в секундах.
Семафор может быть в 2-х состояниях:
разрешен -
N=0
;заблокирован на указанное в
N
время.
Рекомендуется указывать два числа для времени блокировки семаформа, чтобы создать рандомные задержки между переключениями в разные состояния для имитации естественного поведения юнита.
Условия
Составные условия в Селекторе idle-запроса записываются с помощью логических операторов and
, or
и not
Условия, которые используются в первую очередь:
{if human_fsm_idle_semaphore "can_smoke"
{if human_fsm_idle_state "smoking_begin"
{if fsm_tags "board"
Варианты запроса для выбора idle-анимаций
Варианты имен запросов для команды run
приведены в таблице ниже.
stand_idle
stand_breath
Стоит
squat_idle
squat_breath
Сидит
snipe_breath
Смотрит из-за горизонтального укрытия (окопы, заборы по пояс)
lie_idle
lie_breath
Лежит
stand_smoking_begin
Поджигает сигарету
stand_smoking_process
Делает затяжку
stand_smoking_end
Тушит сигарету
Last updated