Анимации
Модификация системы анимаций
Экспорт анимации для Bannerlord
Настройки анимации по умолчанию
- Частота кадров: 30 FPS (оптимально) или 60 FPS
- Настройки гуманоидного или звериного скелета (Rig)
- Максимальное поддерживаемое количество костей: 64
- Кости, которые не используются, должны содержать «_notused» в конце строки. Также корневая кость (самая верхняя в иерархии) должна содержать это только для анимаций.

Настройки экспорта FBX (Autodesk Maya)
Эти настройки применяются в Maya. Похожее программное обеспечение может содержать такие же настройки. Когда мы экспортируем новый риг впервые, экспортированный FBX-файл должен содержать скелет и меш.
Первоначальная настройка (скелет + меш)

Настройки экспорта только анимации
Мы обязательно отключаем параметры, связанные с мешем и скином, перед экспортом анимаций. «Use scene name» очень важно проверить при экспорте как анимаций, так и ригов. Также убедитесь, что корневая кость содержит «_notused» в конце строки.

Мы убеждаемся, что не отправляем никаких «Constraints and Skeleton Definitions» (ограничений и определений скелета). Constraints, Connections и Unit settings должны быть установлены так, как на изображении ниже. Наш движок также использует ось «Z» в качестве направления вверх.

Определение новых анимаций
После экспорта анимации, чтобы сослаться на неё в игре, вам нужно добавить новые клипы анимации из браузера ресурсов, которые ссылаются на эту анимацию. Для этого используйте кнопку «Animation Clip» внутри родительской сборки «Create». Самые важные свойства этих клипов:
- id: ID (уникальное имя) клипа анимации, используемого в других системах
- source1: Начальный ключевой кадр клипа анимации
- source2: Конечный ключевой кадр клипа анимации
- anim_data_name: Исходный ресурс анимации, импортированный в движок для этого клипа
- duration: Продолжительность этого клипа анимации в секундах
Типичная анимация также содержит несколько опциональных атрибутов. Самый распространённый — blend_in_period, который задаёт продолжительность смешивания с существующей анимацией и достижения 100% веса. blend_out_period — это противоположность этому смешиванию, но с важным отличием. Смешивание на выходе на самом деле означает, что анимация заканчивается раньше заданной продолжительности, а оставшаяся часть анимации используется только для смешивания с другой анимацией. Но продолжительность смешивания задаётся только через blend_in_period. Наличие более длинного blend_out_period, чем blend_in_period следующей анимации, не увеличивает эту продолжительность смешивания. Это просто помогает смешиванию выглядеть более плавным, так как во время этого смешивания, если обе анимации проигрываются одновременно, это выглядит визуально более привлекательно. Анимация с 0 blend_out_period просто приостанавливается во время смешивания со следующей анимацией, что вызывает резкую остановку/изменение скорости во вращениях костей.
Анимация имеет ещё несколько опциональных атрибутов:
- priority: Priority просто разрешает/запрещает проигрывание анимаций в качестве прерывания, пока проигрывается другая анимация. Анимации с более высоким приоритетом проигрываются поверх анимаций с более низким или равным приоритетом в качестве прерываний.
- param1, param2, param3: Параметры используются в случаях, когда движку требуются дополнительные данные. Они могут иметь совершенно разное значение.
- sound_code: Проигрывает звук при проигрывании анимации.
- step_points: Это точки шага для звука.
- voice_code: Проигрывает голос при проигрывании анимации.
- facial_anim_id: Преобразует лицо в это выражение при проигрывании анимации.
- left_hand_pose, right_hand_pose: Преобразуют позы рук в заданные значения при проигрывании анимации.
- combat_parameter_id: Передаёт движку дополнительный набор информации (см. combat_parameters.xml)
- blends_with_action: Этот атрибут ссылается на другое действие (внимание: действие, а не анимация), с которым нужно смешать анимацию. Это актуально только тогда, когда движку требуется смешать две анимации (например, поднятие/опускание блока щитом, взмахи оружием, требующие сбалансированной и несбалансированной версий и т. д.).
- continue_to_action: Этот атрибут вызывает другое действие (внимание: действие, а не анимация), которое проигрывается вскоре после завершения этой анимации. Анимация считается завершённой всегда, когда достигается продолжительность (blend_out_period).
Анимации обычно содержат два других узла: flags и clip_usage_data. clip_usage_data — это общий указатель на данные, который может ссылаться на blend_data, displacement_data, bipedal_movement_and_ik_data и quadrupedal_movement_data. Их использование в основном предназначено для специфических случаев, и их детали выходят за рамки данного объяснения. Флаги же используются практически для всех анимаций и требуют некоторого объяснения. Возможные флаги, которые можно использовать для анимации:
- disable_agent_agent_collisions: Отключает столкновения между агентами.
- ignore_all_collisions: Отключает все столкновения.
- Ignore_static_body_collisions: Отключает столкновения со статическими телами.
- use_last_step_point_as_data: 4-я точка шага считается данными, а не звуковой точкой.
- make_bodyfall_sound: Создаёт звук падения, когда тело касается земли.
- client_prediction: Предотвращает отправку анимаций через сеть.
- keep: Не завершает анимацию по окончании, а оставляет её на паузе.
- restart: Принудительно запускает анимацию с начала, если та же анимация уже проигрывается этим скелетом.
- client_owner_prediction: Предотвращает отправку анимаций через сеть только для агентов, управляемых этим клиентом.
- make_walk_sound: Проигрывает жёстко закодированные звуки ходьбы.
- disable_hand_ik: Предотвращает применение обратной кинематики рук во время анимации.
- blends_according_to_look_slope: Позволяет смешивать анимацию с другой анимацией в зависимости от угла наклона взгляда, причём эта является нисходящей.
- synch_with_horse: Проигрывает анимацию без использования её исходной продолжительности, вместо этого синхронизируя прогресс с анимацией коня.
- use_left_hand_during_attack: Позволяет боевой системе проверять левую руку как коллайдер во время атаки.
- lock_camera: Предотвращает управление камерой игроком во время этой анимации.
- lock_movement: Предотвращает движение агентов во время этой анимации.
- synch_with_movement: Проигрывает анимацию без использования её исходной продолжительности, вместо этого синхронизируя прогресс с анимациями движения агента.
- enable_hand_spring_ik: Позволяет применять пружинную обратную кинематику к рукам для передачи на них сил движения нижней части тела.
- enable_hand_blend_ik: Позволяет обратной кинематике пытаться удерживать руки немного в начальном положении при старте этой анимации, смешивая исходное положение и положение анимации.
- synch_with_ladder_movement: Проигрывает анимацию без использования её исходной продолжительности, вместо этого синхронизируя прогресс с движением агента по лестнице.
- do_not_keep_track_of_sound: Предотвращает удержание движком ссылки на звук, когда он проигрывается.
- reset_camera_height: Уменьшает дополнительную высоту камеры для этой анимации.
- disable_auto_increment_progress: Предотвращает проигрывание анимации и удерживает её на паузе на текущем прогрессе. Прогресс может потребоваться устанавливать вручную из кода.
- enforce_lowerbody: Предотвращает проигрывание предыдущего канала и анимаций движения во время этой анимации.
- enforce_all: Актуально только для канала 0. Предотвращает проигрывание канала 1 и анимаций движения во время этой анимации.
- cyclic: Анимация зацикливается и никогда не заканчивается.
- enforce_root_rotation: Вращение живота (корня) берётся из этой анимации вместо предыдущего канала или анимации движения для внутренних расчётов.
- allow_head_movement: Позволяет голове агента двигаться в соответствии с направлением взгляда.
- disable_foot_ik: Отключает обратную кинематику ног для этой анимации.
- affected_by_movement: Позволяет накладывать анимации-добавки движения поверх этой анимации для создания более качественного эффекта тряски.
- update_bounding_volume: Отключает оптимизацию ограничивающего объёма, следует использовать, когда агент выходит за пределы своих обычных границ с этой анимацией.
- align_with_ground: Выравнивает систему координат агента с землёй во время этой анимации.
- ignore_slope: Предотвращает выравнивание четвероногих агентов с землёй во время этой анимации.
- displace_position: Обновляет мировую позицию агента во время анимации, используя данные смещения.
- enable_left_hand_ik: Заставляет левую руку оставаться в целевой позиции этой анимации даже во время смешивания с другими анимациями с помощью обратной кинематики.
- ignore_scale_on_root_position: Позволяет позиции живота (корня) оставаться в том же положении с исходным масштабом, позволяя агентам лучше взаимодействовать с объектами.
- randomization_weight: Рандомизирует анимацию внутри её альтернативной группы с этим значением. Более высокое значение позволяет анимации выбираться чаще.
Изменение/добавление новых действий
Анимации агентов сопоставляются с наборами действий (action sets) как действия (actions). Чтобы назначить новую анимацию существующему действию, сначала нужно определить новый клип анимации через браузер ресурсов. Клипы анимации определяют начальную и конечную секунды анимации, FPS и различные свойства. Затем нужно сопоставить его в action_sets.xml для конкретного набора действий. Если необходимо создать новое действие, сначала нужно добавить его как новую строку в action_types.xml, а затем выполнить те же шаги, что и выше.
Анимации, не относящиеся к агентам, не сопоставляются как действия. Для них просто нужно добавить клипы анимации через браузер ресурсов, а затем начать использовать их в коде.
Каждое действие имеет несколько атрибутов. Эти атрибуты жёстко закодированы, чтобы движок мог понимать определённые свойства действия. Атрибуты:
type (по умолчанию: actt_other):
- actt_other,
- actt_defend_fist,
- actt_defend_shield,
- actt_defend_forward_2h,
- actt_defend_up_2h,
- actt_defend_right_2h,
- actt_defend_left_2h,
- actt_defend_forward_1h,
- actt_defend_up_1h,
- actt_defend_right_1h,
- actt_defend_left_1h,
- actt_defend_forward_staff,
- actt_defend_up_staff,
- actt_defend_right_staff,
- actt_defend_left_staff,
- actt_ready_ranged,
- actt_release_ranged,
- actt_release_throwing,
- actt_reload,
- actt_ready_melee,
- actt_release_melee,
- actt_parried_melee,
- actt_blocked_melee,
- actt_fall,
- actt_jump_start,
- actt_jump,
- actt_jump_end,
- actt_jump_end_hard,
- actt_kick,
- actt_weapon_bash,
- actt_passive_usage,
- actt_equip_unequip,
- actt_idle,
- actt_guard,
- actt_mount,
- actt_dismount,
- actt_dash,
- actt_mount_quick_stop,
- actt_hit_object,
- actt_sit,
- actt_sit_on_the_floor,
- actt_ladder_raise,
- actt_ladder_raise_end,
- actt_rear,
- actt_strike_light,
- actt_strike_medium,
- actt_strike_heavy,
- actt_strike_knock_back,
- actt_mount_strike
usage_direction (опционально):
- ud_attack_up,
- ud_attack_down,
- ud_attack_left,
- ud_attack_right,
- ud_defend_up,
- ud_defend_down,
- ud_defend_left,
- ud_defend_right,
- ud_defend_any,
- ud_attack_any
action_stage (опционально):
- as_attack_ready,
- as_attack_quick_ready,
- as_attack_release,
- as_reload_phase_1,
- as_reload_phase_2,
- as_defend,
- as_defend_parry
Использование изменённых действий довольно простое — вам просто нужно изменить сопоставление действия с анимацией в action_sets.xml, и этого, вероятно, будет достаточно. Но если вы хотите создать новое действие или новое поведение для существующего действия, возможные способы интеграции его в игру могут быть следующими:
- Вызов действия из кода: класс Agent имеет необходимые функции для этого. Из соображений производительности обязательно кэшируйте индекс действия с помощью класса ActionIndexCache.
- Использование в movement_sets.xml: этот файл содержит два набора: movement_sets и full_movement_sets. movement_set содержит все анимации, необходимые персонажу для движения во всех направлениях в одной стойке и состоянии. full_movement_set содержит группу movement_set, чтобы удовлетворить все стойки и все состояния: ходьба, бег, ходьба и бег в приседе с левой и правой стойкой. Пожалуйста, учтите, что присед не имеет левой стойки, и поэтому некоторые варианты использования оружия предписывают использовать только правую стойку во всех случаях (например, дальнобойное оружие в Native). full_movement_sets содержат свои условия в виде атрибутов: left_stance и movement_mode.
- Использование в item_usage_sets.xml: новые боевые действия следует задавать отсюда, если они не требуют изменения боевой системы. Простой, стража, использование оружия, действия удара ногой можно задать отсюда для каждого предмета с определёнными условиями. Кроме того, действия, определённые в movement_sets.xml, также упоминаются отсюда. Для usage_sets существует слишком много условий и атрибутов, чтобы объяснять их здесь, но существующие примеры должны помочь вам понять, как всё работает. Одна важная и не самая очевидная деталь заключается в том, что все варианты использования, определённые здесь, обходятся сверху вниз, и используется первый вариант, удовлетворяющий условию. Поэтому важно держать варианты с большим количеством ограничений в верхней части списка, а резервные варианты — внизу.
- Использование в monster_usage_sets.xml: как и item_usage_sets.xml, этот файл содержит возможные действия, которые агенты могут выполнять независимо от типа предмета. Это могут быть удары, прыжки, падения и посадки верхом. Для четвероногих агентов есть ещё несколько возможностей: upper_body_movements, movements и movement_adders. Этот файл требует более подробного объяснения, но его структура похожа на item_usage_sets.xml, и примеры, показанные там, должны быть понятны сами по себе. Опять же, во всех случаях варианты использования обходятся сверху, и используется первый, удовлетворяющий условиям. Поскольку условия сильно различаются для разных состояний действий, иногда условие может использоваться вне своего смысла (например, значение is_heavy становится условием скорости для падений и ударов четвероногих). А некоторые направления могут не применяться для определённых условий (некоторые действия проверяют 4 направления, некоторые проверяют front_left и front_right вместо front, а некоторые проверяют только перекрёстные направления: front_left, front_right, back_left и back_right), поэтому рекомендуется немного поэкспериментировать, если вы пытаетесь выйти за рамки того, что даёт вам код Native. Полный список возможных body_parts можно найти в bone_body_types.xml, который в основном содержит некоторые атрибуты для частей тела, связанных с проверками боевых столкновений.
