For the complete documentation index, see llms.txt. This page is also available as Markdown.

Animaciones Spine

Puedes añadir objetos interactivos animados a tu juego usando nuestra biblioteca existente de más de 50.000 rigs de Spine.

Spine es cómo funcionan los personajes y props animados en All Out (cofres, animales, props, rigs de VFX y el jugador).

Para que Spine se sienta más simple, mantén este modelo mental:

  • Rig de Spine (.spine): el “plano” (huesos + nombres de animaciones + nombres de skins)

  • Spine_Animator: un componente en una entidad que renderiza/actualiza un rig de Spine en el mundo

  • Spine_Instance: una instancia independiente (sin componente) — se usa para animaciones de UI o control manual de la vida útil

  • Skins: “atuendos/variantes” que deciden qué imágenes son visibles

  • Animaciones: líneas de tiempo con nombre (p. ej. "idle", "walk", "open")

Cuándo usarlo Spine_Animator vs Spine_Instance

  • Usa Spine_Animator para cualquier cosa que exista en el mundo (props, NPCs, interactuables).

  • Usa Spine_Instance directamente cuando quieras dibujar un Spine en UI o necesites control manual de la vida útil.

El motor actualiza un Spine_Animator automáticamente. Una instancia independiente debe ser actualizada y destruida por tu código.

Referencia de la API de Spine (CSL)

// Componente — adjunto a entidades del mundo
Spine_Animator :: class : Component {
    depth_offset: float;
    layer: s32;
    mask_in_shadow: bool;
    instance: Spine_Instance #read_only;

    // Visuales
    color_multiplier: v4;
    scale: v2;
    speed_multiplier: float;
    state_machine: State_Machine #read_only;

    set_skeleton :: method(asset: Spine_Asset) -> u64;
    get_skeleton :: method(id: u64 = 0) -> 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;
    set_to_setup_pose :: method();

    // Desplazamientos locales de huesos (avanzado)
    get_bone_local_position :: method(bone_name: string) -> v2;
    set_bone_local_position :: method(bone_name: string, position: v2);

    // Opcional: dirigir las animaciones mediante una máquina de estados
    set_state_machine       :: method(machine: State_Machine, transfer_ownership: bool);
    set_color_replace_color :: method(color: Color_Replace_Color);
    set_material            :: method(material: Material, transfer_ownership: bool);
    get_tint                :: method() -> v4;
    set_tint                :: method(tint: v4);
    set_destroy_entity_when_done_current_animation :: method(enabled: bool);
}

Spine_Animator hereda Component.awaken(). Cuando tu script y el animador empiezan en la misma entidad, llama a awaken() antes de acceder a la instancia del animador.

Añadir objetos animados a tu mundo

Hay 3 formas de añadir objetos animados a tu escena, todas crearán un componente Spine_Animator.

  • Arrastra cualquier asset animado desde el Catálogo de recursos a tu escena

  • Crea una nueva entidad y añade el componente Spine_Animator

    • Establece el Skeleton Data Asset campo en un archivo .spine de tus assets

  • Añade un spine animator a tu mundo usando scripting (cubierto en los ejemplos)

Si tu código y el Spine_Animator están en la misma entidad y empiezan al mismo tiempo, llama a spine.awaken() antes de llamar a cualquier método de animación.

Ejemplos

Cofre abrible

Un cofre interactuable que reproduce una animación de “open” y luego permanece abierto:

Los nombres de las animaciones y skins deben coincidir con los nombres del rig.

Pollo caminante

Un simple bucle de "idle vs walk" basado en el movimiento:

Coche conducible

Si quieres comportamiento "conducible", el enfoque más simple es controlar el movimiento con tu propia lógica de gameplay, y controlar la animación según si el coche se está moviendo.

Si estás alternando solo entre dos animaciones en bucle, las llamadas directas a set_animation suelen ser más simples que construir una máquina de estados.

Skins (variantes/atuendos)

Algunos spines no empiezan con una skin predeterminada. Si tu entidad es "invisible", probablemente necesites elegir una skin.

Eventos de animación

Usa callbacks cuando un evento de línea de tiempo de Spine deba disparar gameplay o audio. Para un Spine_Animator componente, registra callbacks en su instancia.

El callback del evento se ejecuta en la ruta predicha compartida. Llama directamente a la lógica de gameplay y a los SFX; no lo protejas con Game.is_server() o is_local().

Instancias independientes y UI.spine

La API independiente proporciona vida útil y actualizaciones de animación manuales:

Mantén la instancia en el estado persistente de la UI del jugador. Créala una vez, actualízala y dibújala desde ao_late_update, luego destrúyela desde ao_end:

No crees la instancia dentro de ao_late_update; eso reiniciaría su animación en cada frame y provocaría una fuga de la instancia anterior.

Máquinas de estados (opcional, para lógica de animación compleja)

Puedes mantener la lógica de animación simple llamando a set_animation directamente. Si tienes muchos estados (idle/run/attack/hit/death), una State_Machine ayuda a definir las transiciones una vez y luego solo establecer variables/disparadores.

La idea clave: los nombres de los estados deben coincidir con los nombres de las animaciones en tu archivo Spine.

Qué hace una máquina de estados

Piensa en una máquina de estados como un pequeño “controlador de animaciones”:

  • Defines estados (cada nombre de estado debe coincidir con un nombre de animación de Spine)

  • Defines variables (bool, disparador, int, float)

  • Defines transiciones entre estados según esas variables

  • En tiempo de ejecución, solo actualizas variables (la máquina de estados elige la animación)

Ejemplo mínimo: idle/walk + disparador de ataque

Si pasas transfer_ownership = true a set_state_machine, el animador destruirá la máquina de estados por ti. De lo contrario, debes destruirla tú mismo.

Solución de problemas

P: Arrastré un asset de spine a mi escena y no veo ningún objeto, solo una entidad vacía

R: Asegúrate de hacer clic en "Add Skin" y seleccionar una variante del spine para aplicar. Algunos spines no empiezan con una skin predeterminada.

P: Mi script falla cuando llamo a métodos de animación en mi Spine_Animator

R: Si tu script y el Spine_Animator empiezan al mismo tiempo, llama a spine.awaken() antes de llamar a cualquier método de animación.

P: Cambié las skins pero no pasó nada

R: Después de cualquier cambio de skin (set_skin, enable_skin, disable_skin, disable_all_skins), debes llamar a refresh_skins().

Skins/animaciones personalizadas del jugador

Si quieres añadir animaciones personalizadas a tu jugador, puedes hacerlo fusionando el rig base de Spine de All Out con un rig personalizado que contenga más animaciones. Podemos proporcionar muchas de estas; solo Soporte para desarrolladores.

El formato del rig de Spine

Los rigs de Spine incluyen:

  • Un archivo skeleton (.spine) con los huesos, skins, animaciones y estructura.

  • Un archivo atlas (.atlas) que asigna los attachments a imágenes.

  • Cada página de imagen nombrada por el atlas. Una exportación de una sola página normalmente tiene una .png.

Creando tus propias animaciones

Formato de exportación

Para usar un rig de Spine personalizado en All Out, exporta el paquete estándar de Spine en tu res carpeta:

  • something.spine

  • something.atlas

  • Cada archivo de imagen nombrado por something.atlas

Si no estás seguro sobre la configuración de exportación, empieza con un asset de Spine existente de All Out desde el Catálogo de Assets y replica su estructura o ¡contáctanos!

Última actualización