filmАнимации Spine

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

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

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

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

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

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

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

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

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

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

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

circle-exclamation

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

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

Spine_Instance_Base :: class {
    // Визуальные параметры
    color_multiplier: v4;
    scale: v2;
    speed_multiplier: float;
    state_machine: State_Machine #read_only;
    color_replace_color: Color_Replace_Color #read_only;
    set_color_replace_color :: method(color: Color_Replace_Color);
    set_material :: method(material: Material, transfer_ownership: bool);
}

Spine_Instance :: class : Spine_Instance_Base {
    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);

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

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

Есть 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 обычно проще, чем строить state machine.

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

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

circle-exclamation

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

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

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

Что делает state machine

Думайте о state machine как о маленьком «контроллере анимаций»:

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

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

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

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

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

circle-info

Если вы передаёте transfer_ownership = true в set_state_machine, Spine_Instance то state machine будет уничтожена автоматически. Иначе вы должны уничтожить её сами.

Поиск и устранение неисправностей

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

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

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

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

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

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

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

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

Формат Spine Rig

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

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

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

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

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

circle-exclamation

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

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

  • something.spine

  • something.atlas

  • something.png (atlas texture)

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

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