Настройка выбора анимаций

Каждому описанию FSM в ресурсах есть одноименный файл Animation Selector (далее по тексту - Селектор).

Описания Селекторов хранятся в папке \properties\animation_selector\ . Файлы имеют расширение .set.

Примеры:

  • human.set — используется для объекта human.

  • animal.set — используется для объектов животных, например, horse.

Файлы анимаций размещаются либо в папке соответствующего объекта, либо в общем каталоге: \properties\animation\ и его подкаталогах.


Структура описания селектора

Описание селектора включают следующие элементы:

Для упрощения редактирования и повторного использования, рекомендовано выносить смысловые и повторяющиеся блоки выбора анимаций в отдельные .inc-файлы. Например, в ресурсе Men of War II файл human.set подключает смысловые блоки через include из внешних файлов.

Имя запроса на выбор анимаций

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

Примеры:

  • stand_idle

  • walk

  • lie_holdback_in


Способы указания анимации

1. Конкретная анимация указывается с помощью блока параметра anm:

{anm "animation_name"}
  • Имя анимации указывается в двойных кавычках.

  • Запись " " означает пустую анимацию - новая анимация не будет запущена, а текущая анимация сохранится.

Пример выбора анимации с указанием конкретной анимации
{lie_belt_in
	{if human_stuff holding "pistol"
		{anm "lie_take_pistol" -1}
	}
	{anm "lie_put_small" 0.75}
}
  • lie_belt_in - имя запроса

  • блок if - условие для запуска анимации

  • lie_take_pistol - имя анимации, которая проигрывается со скоростью -1 ( минус означает, что анимация будет проигрываться с конца в начало)

  • lie_put_small - имя анимации, которая проигрывается со скоростью 0,75

2. Случайный выбор анимаций

Блок параметра random_select позволяет задать список альтернативных анимаций с различной вероятностью выбора:

{random_select
    {weight n1 "animation_1"}
    {weight n2 "animation_2"}
    ...
}

Параметр weight задаёт относительную вероятность выбора n в диапазоне от 0.01 до 100.

Названия анимаций записываются в двойных кавычках

Пример случайного выбора анимации по ее весу
{squat 
    {random_select
        {weight 5 "squat_idle_rifle_2"}
        {weight 2 "squat_idle_rifle_3" -1}
        {weight 1 "squat_idle_rifle_4"}
        {weight 1 "squat_idle_rifle_5"}
        {weight 1 "squat_idle_rifle_6"}
    }
}
  • Анимация squat_idle_rifle_2 с весом 5

  • Анимация squat_idle_rifle_3 с весом 2 и скоростью проигрывания -1 (проигрывается с конца к началу)


Условия в Селекторе

Система 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_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