filmАнимации Spine

Вы можете добавить в игру анимированные интерактивные объекты, используя нашу библиотеку из более чем 50 000 Spine-ригга.

Spine — это способ работы анимированных персонажей и объектов в All Out (сундуки, животные, реквизит, VFX-риги и игрок).

Чтобы Spine казался проще, держите в голове эту модель:

  • Spine rig (.spine): «чертеж» (кости + имена анимаций + имена скинов)

  • Spine_Animator: компонент у сущности, который рендерит/обновляет Spine-риг в мире

  • Spine_Instance: базовый экземпляр, которым вы управляете в коде (воспроизводите анимации, переключаете скины и т.д.)

  • Скины: «наряды/варианты», которые определяют, какие изображения видимы

  • Анимации: именованные таймлайны (например. "idle", "walk", "open")

Когда использовать Spine_Animator против Spine_Instance

  • Используйте Spine_Animator для всего, что существует в мире (реквизит, NPC, взаимодействуемые объекты).

  • Используйте Spine_Instance непосредственно, когда вы хотите отрисовать Spine в UI или вам нужен ручной контроль времени жизни.

circle-exclamation

Справочник Spine API (CSL)

Spine_Animator :: class : Component {
    depth_offset: float;
    layer: s32;
    instance: Spine_Instance #read_only;
}

Spine_Instance :: class {
    create  :: proc() -> Spine_Instance;
    destroy :: method();
    update  :: method(dt: float);

    set_skeleton :: method(asset: Spine_Asset);
    get_skeleton :: method() -> Spine_Asset;

    set_animation :: method(animation: string, loop: bool, track: s64, speed: float = 1);

    // Скины
    set_skin          :: method(skin: string);
    enable_skin       :: method(skin: string);
    disable_skin      :: method(skin: string);
    disable_all_skins :: method();
    refresh_skins     :: method();
    get_skins         :: method() -> []string;

    // Локальные смещения костей (для продвинутых пользователей)
    get_bone_local_position :: method(bone_name: string) -> v2;
    set_bone_local_position :: method(bone_name: string, position: v2);

    // Необязательно: управлять анимациями через машину состояний
    set_state_machine :: method(new_state_machine: State_Machine, transfer_ownership: bool);

    // Визуальные настройки
    color_multiplier: v4;
    set_color_replace_color :: method(color: Color_Replace_Color);
}

Добавление анимированных объектов в мир

Существуют 3 способа добавить анимированные объекты в сцену, все они создадут компонент Spine_Animator.

  • Перетащите любой анимированный ассет из Каталог ассетовв вашу сцену

  • Создайте новую сущность и добавьте компонент Spine_Animator

    • Установите Skeleton Data Asset поле на .spine файл в ваших ассетах

  • Добавьте spine-animator в мир с помощью скриптинга (рассматривается в примерах)

circle-info

Если ваш код и Spine_Animator находятся на одной сущности и запускаются одновременно, вызовите spine->awaken() перед доступом к spine.instance.

Примеры

Открываемый сундук

Взаимодействуемый сундук, который проигрывает анимацию «open» и затем остается открытым:

Идущая курица

Простой цикл «idle vs walk» на основе движения:

Управляемая машина

Если вы хотите поведение «управляемого» объекта, самый простой подход — управлять движением своей игровой логикой, а управлять анимацией на основе того, движется ли машина.

circle-info

Если вы переключаетесь только между двумя цикличными анимациями, прямые вызовы set_animation обычно проще, чем построение машины состояний.

Скины (варианты/наряды)

Некоторые спайны не имеют стартового скина по умолчанию. Если ваша сущность «невидима», вероятно, нужно выбрать скин.

circle-exclamation

Машины состояний (необязательно, для сложной логики анимаций)

Вы можете упростить логику анимации, вызывая вызовы set_animation напрямую. Если у вас много состояний (idle/run/attack/hit/death), State_Machine помогает определить переходы один раз, а затем просто задавать переменные/триггеры.

Ключевая идея: имена состояний должны совпадать с именами анимаций в вашем Spine-файле.

Что делает машина состояний

Думайте о машине состояний как о маленьком «контроллере анимаций»:

  • Вы определяете состояния (каждое имя состояния должно совпадать с именем анимации в Spine)

  • Вы определяете переменные (bool, триггер, int, float)

  • Вы определяете переходы между состояниями на основе этих переменных

  • Во время выполнения вы обновляете только переменные (машина состояний выбирает анимацию)

Минимальный пример: idle/walk + триггер атаки

circle-info

Если вы передаете transfer_ownership = true в set_state_machine, то Spine_Instance уничтожит машину состояний за вас. В противном случае вы должны уничтожить её сами.

Устранение неполадок

В: Я перетащил spine-ассет в сцену и не вижу объект — сущность пустая

О: Убедитесь, что вы нажали «Add Skin» и выбрали вариант скина для применения! Некоторые спайны не имеют скина по умолчанию.

В: Мой скрипт падает, когда я обращаюсь к spine.instance

О: Если ваш скрипт и Spine_Animator запускаются одновременно, вызовите spine->awaken() перед использованием spine.instance.

В: Я сменил скины, но ничего не произошло

О: После любой смены скина (set_skin, enable_skin, disable_skin, disable_all_skins), вы должны вызвать refresh_skins().

Пользовательские скины/анимации игрока

Если вы хотите добавить пользовательские анимации для вашего игрока, вы можете сделать это, объединив базовый Spine-риг игрока All Out с пользовательским ригом, содержащим дополнительные анимации (мы можем предоставить многие из них, просто свяжитесь с намиПоддержка разработчиков)

Формат Spine-рига

Spine-риги состоят из 3 файлов (автоматически загружаются для вас при использовании Каталога ассетов)

  • Файл скелета (.spine) содержит информацию о костях, скинах и структуре вашего анимированного объекта.

  • Изображение атласа (.png) содержит текстуры, используемые для отрисовки спайна в мире.

  • Файл атласа (.atlas) содержит информацию о том, где внутри .png-атласа находится каждая часть анимированного объекта.

Создание собственных анимаций

circle-exclamation

Формат экспорта

Чтобы использовать пользовательский Spine-риг в All Out, нужно экспортировать стандартный 3-файловый Spine-бандл в вашу res папку:

  • something.spine

  • something.atlas

  • something.png (текстура атласа)

Если вы не уверены в настройках экспорта, начните с существующего Spine-ассета All Out из Каталога ассетов и повторите его структуру или свяжитесь с нами!

Последнее обновление