Animaciones de 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 animados y los props en All Out (cofres, animales, props, rigs de VFX y el jugador).
Para hacer que Spine se sienta más simple, ten 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 mundoSpine_Instance: una instancia independiente (no componente), usada para animaciones de UI o control manual del ciclo de vidaSkins: “atuendos/variantes” que deciden qué imágenes son visibles
Animaciones: líneas de tiempo con nombre (por ejemplo
"idle","walk","open")
Spine_Bone_Transform describe la base afín actual de un hueso en el espacio local del esqueleto. Un punto local del hueso {x, y} se asigna a posición + x_axis*x + y_axis*y.
Cuándo usar Spine_Animator vs Spine_Instance
Usa
Spine_Animatorpara cualquier cosa que exista en el mundo (props, NPCs, objetos interactivos).Usa
Spine_Instancedirectamente cuando quieras dibujar un Spine en la UI o necesites control manual del ciclo de vida.
El motor actualiza una Spine_Animator automáticamente. Una instancia independiente debe ser actualizada y destruida por tu código.
Si llamas a Spine_Instance.create(), debes llamar a instance.destroy() cuando termines (si no, filtras memoria).
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: v4; // Multiplicador RGBA; {1, 1, 1, 1} deja la apariencia sin cambios.
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;
try_get_bone_local_transform :: method(bone_name: string) -> (Spine_Bone_Transform, bool);
set_bone_local_position :: method(bone_name: string, position: v2);
// Opcional: controla 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 comienzan en la misma entidad, llama a awaken() antes de acceder a la instancia del animador.
Añadiendo objetos animados a tu mundo
Hay 3 formas de añadir objetos animados a tu escena, y 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 campo
Skeleton Data Asseten un archivo .spine en tus assets
Añade un spine animator a tu mundo usando scripting (se cubre en los ejemplos)
Ejemplos
Cofre que se puede abrir
Un cofre interactivo que reproduce una animación de “open” y luego permanece abierto:
Los nombres de animaciones y skins deben coincidir con los nombres del rig.
Pollo caminante
Un simple ciclo “idle vs walk” basado en el movimiento:
Coche conducible
Si quieres un comportamiento “conducible”, la forma más simple es controlar el movimiento con tu propia lógica de juego, y controlar la animación según si el coche se está moviendo.
Skins (variantes/atuendos)
Algunos spines no comienzan con una skin predeterminada. Si tu entidad está “invisible”, probablemente necesites elegir una skin.
Llama siempre a refresh_skins() después de cambiar las skins.
Eventos de animación
Usa callbacks cuando un evento de la línea de tiempo de Spine deba activar 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 al gameplay y a los SFX; no lo protejas con Game.is_server() o is_local().
Instancias independientes y UI.spine
La API independiente proporciona control manual del ciclo de vida y actualizaciones de animación:
Mantén la instancia en el estado persistente de la UI del jugador. Créala una sola vez, actualízala y dibújala desde método ao_late_update, y luego destrúyela desde ao_end:
No crees la instancia dentro de método ao_late_update; eso reiniciaría su animación en cada fotograma y filtraría 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 te ayuda a definir las transiciones una sola vez y luego solo establecer variables/triggers.
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 animación”:
Defines estados (cada nombre de estado debe coincidir con un nombre de animación de Spine)
Defines variables (
bool,disparadores,int,float)Defines transiciones entre estados basadas en 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
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 "Agregar skin" y seleccionar una variante de spine para aplicar! Algunos spines no comienzan 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 comienzan 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 del jugador 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 de esqueleto (
.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 un
.png.
Creando tus propias animaciones
Actualmente, para crear tus propias animaciones o rigs, necesitarás tener una copia de Esoteric Spine. Sin embargo, proporcionamos una enorme biblioteca de rigs de Spine y animaciones existentes como parte de Catálogo de recursos para que las uses, ¡y recomendamos empezar por ahí!
Formato de exportación
Para usar un rig personalizado de Spine en All Out, exporta el paquete estándar de Spine en tu res carpeta:
something.spinesomething.atlasCada archivo de imagen nombrado por
something.atlas
Si no estás seguro de los ajustes de exportación, empieza a partir de un asset de Spine existente de All Out desde el Asset Catalog y replica su estructura, ¡o contacta con nosotros!
Última actualización