Настройка выбора анимаций
Каждому описанию FSM в ресурсах есть одноименный файл Animation Selector (далее по тексту - Селектор).
Описания Селекторов хранятся в папке \properties\animation_selector\
. Файлы имеют расширение .set
.
Примеры:
human.set
— используется для объектаhuman
.animal.set
— используется для объектов животных, например,horse
.
Файлы анимаций размещаются либо в папке соответствующего объекта, либо в общем каталоге: \properties\animation\
и его подкаталогах.
Структура описания селектора
Описание селектора включают следующие элементы:
Условие ;
Имя запроса на выбор анимаций
Имя запроса в Селекторе анимаций обычно соответствует имени состояния анимируемого объекта. Имя запроса может включать слова, поясняющий контекст происходящего.
Примеры:
stand_idle
walk
lie_holdback_in
Способы указания анимации
1. Конкретная анимация указывается с помощью блока параметра anm
:
{anm "animation_name"}
Имя анимации указывается в двойных кавычках.
Запись
" "
означает пустую анимацию - новая анимация не будет запущена, а текущая анимация сохранится.
2. Случайный выбор анимаций
Блок параметра random_select
позволяет задать список альтернативных анимаций с различной вероятностью выбора:
{random_select
{weight n1 "animation_1"}
{weight n2 "animation_2"}
...
}
Параметр weight
задаёт относительную вероятность выбора n
в диапазоне от 0.01
до 100
.
Условия в Селекторе
Система Animation Selector
поддерживает использование условий, позволяющих адаптировать выбор анимации к контексту текущего состояния или окружения актёра.
Условия задаются внутри блока if
и могут быть:
одиночными,
составными,
вложенными.
В качестве условий могут использоваться любые условия, подходящие для данного типа актера. Если условие срабатывает, выбор анимации осуществляется только среди вложенных в этот блок вариантов. Если ни одно условие не выполнено и не задана анимация по умолчанию, то активная анимация остаётся без изменений.
Формат записи условия в селекторе:
{if [condition] [...] ;anm или random_select }
Условие может быть простым или составным. В случае составного условия его части перечисляются через пробел.
{if cond1 cond2 cond3
[...]
}
В описаниях выбора анимаций поддерживаются вложенные условия.
Формат записи вложенных условий:
{if cond1 {if cond2 {anm "animation_1"} } {anm "animation_2"} }
Ниже описаны наиболее часто используемые условия, актуальные для текущей конфигурации игровых ресурсов.
Общие условия
fsm_tags "<tag>"
Проверяет, содержит ли текущее FSM-состояние заданный тэг.
Тэги задаются в описании FSM актера.
Для human
: core\resource\properties\human_fsm\
terrain_pp "<typename>"
Проверяет, находится ли актёр на участке с указанным типом поверхности.
Типы поверхности зависят от настроек terrain physics.
place_mask "<maskname>"
Проверяет, привязан ли актёр к place
, имя которого соответствует маске.
Поддерживается *
как wildcard.
Без *
— сравнение по точному совпадению.
linked ["<props>" ...]
Без параметров — проверяет факт линковки к другому объекту (uplink
). Если задан список <props>
, то проверяет, что uplink
содержит все указанные свойства в своём спискеprops
.
Список props можно посмотреть в .def-файле объекта
have_enemy
Проверяет, имеются ли враги в поле зрения или зоне реагирования актёра.
Используется, например, в боевых состояниях.
movement_mode "<modename>"
Проверяет, активен ли у актёра указанный режим передвижения.
режимов передвижения
throwing_range <near> <far>
Проверяет, находится ли цель броска в указанном диапазоне расстояний.
Расстояния указываются в метрах.
cover_type "<тип>"
Проверяет, находится ли актёр в укрытии заданного типа.
none
— не в укрытии.
Список названий укрытий
(и др.)
Можно использовать и другие условия, поддерживаемые типом актёра
Условия для актера human
human
human_fsm_idle_semaphore "<tag>"
Проверяет, активен ли указанный семафор в состоянии idle
.
Например: "smoke"
human_fsm_idle_state "<state>"
Проверяет, соответствует ли текущее состояние idle
заданному значению.
Например: "smoking_begin"
human_kill_flags "<flag>" [...]
Проверяет наличие всех указанных в списке флагов, связанных с обстоятельствами смерти.
Обычная проверка на linked
не сработает, так как в момент смерти юнит уже отлинкован и не находится в укрытии
human_fsm_counter
Проверяет счетчики fsm
human_hold_strap
Проверяет, нужно ли рукой удерживать оружейный ремень (например, при оружии за спиной).
Используется для управления позой
human_throw_type
Проверяет тип выбранного способа броска (например, гранаты).
Тип зависит от результата выбора анимации броска
human_stuff
[holding|mounting|picking]
"<item_type[ <item_type>...]>"
Проверить какой тип оружия сейчас у человека:
holding
- в руках;или
mounting
- берется в руки;или
picking
- поднимается с земли
Можно указывать несколько типов сразу (тип определяется по тэгам оружия)
Если item_type nothing
- у актера нет оружия.
Теги можно посмотреть в set\stuff
item_in_hand "<prop>" [...]
Проверка на наличие в руках предмета с одним из указанных свойств в stuff
Например: "rpg40"
, "rpg43"
, "pwm1"
Скорость анимации
Скорость проигрывания анимации задаётся числом, следующим после имени анимации. Пример:
{anm "animation_name" 0.75}
Если скорость анимации не указана, то используется значение по умолчанию:
1.0
Отрицательные значения скорости — означает реверсное воспроизведение анимации.
Last updated