filmSpine Animations

You can add animated interactable objects to your game using our existing library of 50k+ Spine rigs.

Spine is how animated characters and props work in All Out (chests, animals, props, VFX rigs, and the player).

To make Spine feel simpler, keep this mental model:

  • Spine rig (.spine): the “blueprint” (bones + animation names + skin names)

  • Spine_Animator: a component on an entity that renders/updates a Spine rig in the world

  • Spine_Instance: the underlying instance you control in code (play animations, switch skins, etc)

  • Skins: “outfits/variants” that decide which images are visible

  • Animations: named timelines (e.g. "idle", "walk", "open")

When to use Spine_Animator vs Spine_Instance

  • Use Spine_Animator for anything that exists in the world (props, NPCs, interactables).

  • Use Spine_Instance directly when you want to draw a Spine in UI or you need manual lifetime control.

circle-exclamation

Spine API reference (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);

    // Skins
    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;

    // Bone local offsets (advanced)
    get_bone_local_position :: method(bone_name: string) -> v2;
    set_bone_local_position :: method(bone_name: string, position: v2);

    // Optional: drive animations via a state machine
    set_state_machine :: method(new_state_machine: State_Machine, transfer_ownership: bool);

    // Visuals
    color_multiplier: v4;
    set_color_replace_color :: method(color: Color_Replace_Color);
}

Adding animated objects to your world

There are 3 ways to add animated objects to your scene, all of which will create a Spine_Animator component.

  • Drag any animated asset from the Asset Cataloginto your scene

  • Create a new entity and add the Spine_Animator component

    • Set the Skeleton Data Asset field to a .spine file in your assets

  • Add a spine animator to your world using scripting (covered in the examples)

circle-info

If your code and the Spine_Animator are on the same entity and start at the same time, call spine->awaken() before accessing spine.instance.

Examples

Openable Chest

An interactable chest that plays an “open” animation and then stays open:

Walking Chicken

A simple “idle vs walk” loop based on movement:

Driveable Car

If you want "driveable" behavior, the simplest approach is to drive the movement with your own gameplay logic, and drive the animation based on whether the car is moving.

circle-info

If you're switching between only two looping animations, direct set_animation calls are usually simpler than building a state machine.

Skins (variants/outfits)

Some spines don't start with a default skin. If your entity is "invisible", you likely need to pick a skin.

circle-exclamation

State machines (optional, for complex animation logic)

You can keep animation logic simple by calling set_animation directly. If you have many states (idle/run/attack/hit/death), a State_Machine helps you define transitions once and then just set variables/triggers.

The key idea: state names must match animation names in your Spine file.

What a state machine does

Think of a state machine as a tiny “animation controller”:

  • You define states (each state name should match a Spine animation name)

  • You define variables (bool, trigger, int, float)

  • You define transitions between states based on those variables

  • At runtime, you only update variables (the state machine chooses the animation)

Minimal example: idle/walk + attack trigger

circle-info

If you pass transfer_ownership = true to set_state_machine, the Spine_Instance will destroy the state machine for you. Otherwise, you must destroy it yourself.

Troubleshooting

Q: I dragged a spine asset into my scene and I don't see any object, it's just an empty entity

A: Make sure to click "Add Skin" and select a variant of the spine to apply! Some spines don't start with a default skin.

Q: My script crashes when I access spine.instance

A: If your script and the Spine_Animator start at the same time, call spine->awaken() before using spine.instance.

Q: I changed skins but nothing happened

A: After any skin change (set_skin, enable_skin, disable_skin, disable_all_skins), you must call refresh_skins().

Custom Player Skins/Animations

If you want to add custom animations to your player, you can do so by merging the base All Out player spine rig together with a custom rig containing more animations (we can provide many of these, just contact usDeveloper Support)

The Spine Rig Format

Spines rigs are made up of 3 files (automatically downloaded for you when you use the Asset Catalog)

  • The skeleton file (.spine) provides information about the bones, skins, and structure of your animated object.

  • The atlas image (.png) has the actual textures used to draw the spine in the world.

  • The atlas file (.atlas) provides information about where inside the .png atlas image each part of the animated object is.

Creating your own animations

circle-exclamation

Export Format

To use a custom Spine rig in All Out, you need to export the standard 3-file Spine bundle into your res folder:

  • something.spine

  • something.atlas

  • something.png (atlas texture)

If you're unsure about export settings, start from an existing All Out Spine asset from the Asset Catalog and mirror its structure or reach out to us!

Last updated