Прощавай, Unity Animator: Як ми створили власну анімаційну систему Honami

Вітаю, спільното! Мене звати Богдан, і я інді-розробник.

Разом із командою LOYAL Studio ми розробляємо Daisen — динамічний Fast-Paced FPS із нахилом в аніме-стилістику (натхненний Trepang2 та ULTRAKILL) на ігровому рушії Unity 6.

У процесі розробки ми зіткнулися зі специфічними потребами: складне змішування нестандартних скелетів, точний контроль FP для анімацій зброї та зручний воркфлоу для не-програмістів. З часом стало очевидно, що стандартний Unity Animator (Mecanim) нам категорично не підходить, а готові рішення з Asset Store були, м’яко кажучи, є лише тимчасовими милицями.

Тому ми прийняли радикальне рішення — написати Honami Animation System. Це кастомна система, яка повністю замінює вбудований Animator. Але давайте про все по черзі.

З чого все почалося?

Чим далі заходила розробка Daisen, тим більше виникало питань до Unity Animator. Нас не влаштовувала застаріла і вимоглива система Humanoid, жахлива робота State Transitions яка працює не від «Початку Переходу» а від константи на анімаційному кліпі, «спагеті» в графах, постійний оверхед, загальна законсервованість системи та крива реалізація animation events. Останньою краплею стало те, що наш аніматор просто не міг нормально працювати з Unity Animator, а імпорт анімацій перетворювався на танці з бубном.

Одного дня я натрапив на відео Timeline — ULTRAKILL Enemy Overhaul, де програміст PITR показував нову систему ворогів на базі кастомного Timeline. Мене це неабияк надихнуло. Зопалу, після прочитання документації по Playable Graph, я вирішив спробувати написати свою систему. Початкова ідея була скромною: зробити кастомний аніматор суто для FPS-складової (рук та зброї). Але чим глибше я копав, тим більше розумів — проєкту потрібне комплексне рішення з власним графом, таймлайном та івентами.

Від простої ідеї до Node-Based архітектури

Спершу мій план був таким:

  • Власний Animator зі своїм Controller.
  • Власне Graph Window із системою transition.
  • Transition повинні працювати з любої точки анімації
  • Timeline для виставлення animation events локально для Controller, а не глобально для анімацій.
  • Мінімізація коду для контролю анімацій. Максимум Editor.
  • Ваги (weights) наше все.

Базова реалізація зайняла 1-2 повні робочі дні. Так з’явився фундамент Honami (назву, до речі, взяв з бота у character.ai, з яким я спілкувався перед стартом розробки. Її звали Honami).

(Перша ітерація)

Проте згодом прийшло усвідомлення: одна з головних проблем Unity Animator — це відсутність гнучкості станів і необхідність писати багато boilerplate-коду. Тому я повністю переробив архітектуру на node-based.

Ми додали круті фічі, щоб зберегти графи чистими:

  • Sub-Nodes: дозволяють ховати другорядну логіку (звуки, VFX, підказки, івенти) всередині стейту. Ви бачите лише те, що дійсно важливо для потоку графа.
  • Portal та Sequencer ноди: назавжди позбавляють від необхідності створювати гігантські плоскі state machines.
  • Random Animation: дозволяє програвати випадкову анімацію зі списку. Дуже корисно коли треба додати різноманітності до анімацій.

Honami Avatar: Будь-який скелет, жодних компромісів

Особистим болем для нас був Humanoid. Це застаріла система, яка намагалася уніфікувати скелети, але створила найогидніший спосіб змішування анімацій і забирає ресурси CPU на кожному кадрі. Хочете створити дівчинку-павука з п’ятьма руками або хутру-меха? Забудьте, бо Humanoid заточений під стандартну двоногу людину.

Тому я створив Honami Avatar — rig-agnostic систему. Вона дивиться не на жорстко задані кістки, а на їхню ієрархію та назви. Їй достатньо згодувати FBX-файл, і вона працюватиме з будь-чим: павуками, технікою чи модульними босами.

  • Система Mirror: дозволяє віддзеркалити анімації прямо в Honami Animator (наприклад, якщо персонаж має вдарити лівою рукою замість правої) без дублювання асетів.
  • Honami Avatar Mask: працює не як жорсткий перемикач, а через ваги (weights). Ви можете плавно змінювати відсоток впливу анімації на ту чи іншу кістку під час програвання стейту чи цілого шару.

Вбудований Honami Rigging Processor

Зазвичай в Unity процедурні анімації вимагають важкого пакета Animation Rigging. Він складний у налаштуванні, має суттєвий оверхед і погано дружить із негуманоїдними ригами.

У Honami ми вбудували власну, високопродуктивну систему констрейнтів «з коробки». Вона працює як фінальний коригувальний прохід (correction pass) після семплінгу анімації, тому авторська анімація залишається головною.

  • Pose Constraint: Процедурно інжектить статичні або динамічні пози. Ідеально для створення стійок (підкат, присідання, тримання різної зброї) з повним контролем ваги.
  • LookAt: Повертає одну кістку або цілий ланцюг (наприклад, спина -> шия -> голова) до цілі. Незамінно для турелей, сенсорів, голів та зброї.
  • Pivot Fixer: Вирішує проблему «кривого півота» з FBX. Стабілізує хвати зброї чи дверні петлі.
  • Pseudo-Physics: Додає інерцію та вторинні рухи (волосся, тканина, хвости, антени) без використання важких Rigidbody. Тільки чиста математика пружин.
  • Bone Replacer: Дозволяє підміняти кістки в ієрархії на льоту.

(Зараз в активній розробці знаходиться система FootIK, яка працюватиме незалежно від типу скелета та виправлятиме ковзання ніг по поверхні).

Linked Brain — один мозок для натовпу

Якщо ви робили FPS (або ігри з натовпами), ви знаєте біль синхронізації кількох аніматорів. Наприклад, щоб одночасно запустити анімацію рук, зброї та камери.

Ми написали Honami Linked Brain. Ця система дозволяє надсилати одну команду (зміну параметра, перехід стану чи action ID) десяткам аніматорів одночасно. Завдяки фільтрації за тегами, таргетингу за радіусом та «хвилям поширення», ви можете керувати цілим натовпом без жодного циклу у вашому ігровому коді.

Honami Timeline та зручні Animation Events

Я впевнений, що коли ви працювали з анімаціями, вам потрібна була система Animation Event щоб точково запустити подію (наприклад, завдати шкоди під час удару мечем або відтворити специфічний звук перезарядки). У стандартному Unity Animator ця система реалізована, м’яко кажучи, погано: вона вшивається в сам кліп і жорстко вимагає прив’язки до кодової бази.

У Honami ми підійшли до цього інакше і створили дві незалежні системи:

  • Local Event: дозволяє викликати локальний UnityEvent на конкретному об’єкті через компонент Local Event Receiver.
  • Global Event: система для трансляції подій, що розповсюджуються глобально на всю сцену.

Далі в бій вступає Honami Timeline. У ньому ви можете прив’язувати ці події не до імпортованих анімацій, а локально до анімаційних стейтів (States) у вашому Controller. Ви просто вказуєте на таймлайні, де і коли саме вони мають спрацювати. Завдяки цьому ваші вихідні анімації залишаються абсолютно чистими, а логіка подій зберігається там, де нею найзручніше керувати.

Крім того, Timeline значно спрощує процес налагодження. Він дозволяє переглядати анімаційні кліпи та тестувати роботу окремих стейтів прямо в редакторі. Наприклад, ви можете наочно перевірити, як працює змішування анімацій з використанням Honami Avatar Mask, без жодної потреби запускати Play Mode.

Продуктивність

Найважливіше для розробників: цикл обчислення Honami генерує нуль GC алокацій (Zero-allocation) на кожен кадр. Усі API-методи мають перевантаження з integer-хешами, щоб зберегти hot paths чистими.

Крім того, ми додали FPS Cap для кожного аніматора. Віддалені персонажі можуть оновлювати анімацію у фіксованих 15 або 30 FPS із плавним інтерполюванням — це фактично безкоштовна LOD-система для анімацій.

За даними Deep Profiler, за наявності 15-18 ворогів на сцені, уся наша анімаційна система споживає близько 5% від загального бюджету гри.

Публічна Бета та міграція

Ми віримо у відкритість, тому Honami Animation System опублікована на GitHub під ліцензією MIT. Абсолютно кожен може встановити її у свій Unity-проєкт. Репозиторій на Github вже має більше 25 зірочок, а пост на сабредіті r/Unity3D отримав 100+ апвоутів.

Щоб полегшити перехід, ми додали систему міграції, яка допоможе автоматично перенести ваш проєкт з Unity Animator на рейки Honami, включаючи скрипти. Також система має in-editor документацію — вам навіть не доведеться відкривати браузер, щоб знайти приклади API чи пояснення роботи нод.

Що далі?

У найближчих планах:

  • Просторові BlendTree (наразі підтримується тільки 1D).
  • Повноцінний незалежний FootIK.
  • Ragdoll.
  • Honami Director для створення катсцен різного калібру.

Honami вже використовується у продакшені нашого проєкту Daisen. Якщо у вас є пропозиції, скарги, або ви хочете долучитися до розробки — ми завжди раді бачити ваші issues та Pull Requests на GitHub.

Дякую за увагу! Буду радий відповісти на запитання в коментарях.

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось6
До обраногоВ обраному4
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Главная штука, от которой я очень страдаю в юнити аниматоре — это то, что нет возможности редактировать кривые анимаций коллективно, а можно только по одной. У вас такая проблема решена?

ми ще не сильно сідали за редагування анімаційних кліпів. Коли дійде до катсцен тоді думали таке імплементовувати.

Підписатись на коментарі