Volver al Blog

Unigine 2.22 Renovación de Animación: Máquinas de Estado, Mezcla de Capas y el Nuevo Flujo de Trabajo Esquelético

Publicado el 18 de septiembre de 2026
Unigine 2.22 Renovación de Animación: Máquinas de Estado, Mezcla de Capas y el Nuevo Flujo de Trabajo Esquelético Generado con ayuda de IA

En resumen

Descubre la renovación de animación de Unigine 2.22: máquinas de estado, blending de capas, motion warping y migración del pipeline esquelético.

El Flujo de Trabajo de Animación Que Hacía Abandonar el Motor a los Desarrolladores de Unigine

Todo desarrollador de Unigine se ha topado con la misma pared: el renderizador mueve escenas PBR espectaculares a 120 fps, pero crear un simple blend de idle a run lleva una hora de parches de scripting y ajustes manuales de huesos. Esa discrepancia entre la fidelidad visual y las herramientas de animación ha sido el secreto a voces de Unigine durante años, y es la razón por la que la mayoría de los equipos pequeños que evalúan Unigine acaban marchándose.

Con Unigine 2.22, el equipo por fin abordó esta carencia de frente. El lanzamiento introduce un editor visual de máquinas de estado de animación, blending de capas aditivo con máscaras por hueso, un pipeline de importación FBX mejorado con mapeo de esqueleto avatar, y una nueva API procedural de motion warping. Para los equipos que usan Unigine en simulación, visualización arquitectónica o aplicaciones industriales y que llevan años improvisando la lógica de animación en código, esto cambia significativamente el flujo de trabajo diario.

Esta guía repasa qué cambió realmente, cómo migrar del antiguo enfoque basado en scripting a las nuevas herramientas de máquinas de estado, y dónde duelen más los casos límite.


Qué Cambió en el Sistema de Animación de Unigine 2.22

El Método Antiguo: Lógica de Animación Basada en Scripts

Antes de 2.22, disparar una transición de animación en Unigine significaba escribir la lógica uno mismo:

// UnigineScript — old pattern, pre-2.22
AnimLayer idle_layer = new AnimLayer();
idle_layer.SetAnimation("idle.anim");
idle_layer.Loop = true;

AnimLayer run_layer = new AnimLayer();
run_layer.SetAnimation("run.anim");
run_layer.Loop = true;

void update(float speed) {
    float blend = clamp(speed / 6.0, 0.0, 1.0);
    if (blend > 0.01f) {
        idle_layer.SetWeight(1.0 - blend);
        run_layer.SetWeight(blend);
    } else {
        idle_layer.SetWeight(1.0);
        run_layer.SetWeight(0.0);
    }
}

Esto funciona para un sistema de dos estados, pero escalarlo a agacharse, saltar, apuntar, esprintar y 15 variaciones de ataque se vuelve insostenible rápidamente. Todos los equipos terminan con una máquina de estados hecha a mano en script, y todos acaban peleándose con saltos en las transiciones y fallos de blending.

El Enfoque de 2.22: Máquinas de Estado Declarativas

Unigine 2.22 introduce el sistema AnimationGraph: un editor de máquinas de estado basado en nodos integrado en el Unigine Editor, junto con una API de scripting para el control en tiempo de ejecución. Los estados se asignan a clips de animación o blend spaces. Las transiciones definen condiciones y duraciones. El motor gestiona internamente la interpolación, el blending por interrupción y la composición de capas.

Las mejoras clave:

  • Editor visual de máquinas de estado — define estados, transiciones y condiciones en el editor con una vista previa del grafo
  • Apilamiento de capas con máscaras de hueso — mezcla la puntería de la parte superior del cuerpo sobre la locomoción de la parte inferior usando grupos de huesos con nombre
  • Soporte de animación aditiva — aplica inclinación, mirada de cabeza y retroceso como offsets en lugar de reemplazar la pose completa
  • Importación FBX mejorada — mapeo de esqueleto avatar que preserva las jerarquías de huesos entre variantes de personajes
  • Motion warping — el root motion puede redirigirse y mezclarse en tiempo de ejecución para trepar, saltar obstáculos y transiciones de cobertura

Configuración del Nuevo Pipeline de Animación Paso a Paso

Paso 1: Define tu Esqueleto Avatar

El esqueleto avatar es la pieza clave del flujo de trabajo de 2.22. Es una plantilla de huesos con nombre que asigna las mallas esqueléticas de herramientas DCC (Blender, Maya, 3ds Max) a un esqueleto canónico al que hace referencia la máquina de estados de animación.

Si te saltas este paso — y muchos desarrolladores que están aprendiendo el sistema lo hacen — las animaciones se reproducirán en los huesos equivocados o no se reproducirán. El motor no lanzará un error; silenciosamente usa el primer hueso que encuentra con un nombre coincidente, lo que provoca artefactos de renderizado extraños.

En el panel Skeleton Asset del Editor, define tu avatar:

// Avatar definition in Unigine's data format
avatar {
    name = "humanoid_standard";
    bones {
        root = "Hips";
        left_arm = "LeftArm";
        right_arm = "RightArm";
        left_leg = "LeftLeg";
        right_leg = "RightLeg";
        spine = "Spine";
        head = "Head";
    }
}

Todos los assets de personajes de tu proyecto comparten esta definición de avatar. Cuando importas un nuevo humanoide, asignas sus nombres de huesos a los nombres del avatar una sola vez, y todos los clips de animación de cualquier personaje funcionan con las animaciones de los demás. El tiempo típico de configuración de este mapeo es de 10 a 15 minutos por personaje, frente al antiguo enfoque de nombrar manualmente los puntos de anclaje por clip de animación, que llevaba de 30 a 60 minutos por personaje y se rompía cada vez que hacías retargeting.

Paso 2: Construye la Máquina de Estados en el Editor

Abre el editor AnimationGraph desde el navegador de assets de Unigine 2.22. Para un controlador de personaje básico, necesitarás como mínimo:

  1. Estado Idle — animación idle en bucle, estado de entrada
  2. Blend space de Locomotion — blend 2D de caminar/trotar/correr según parámetros de velocidad y dirección
  3. Estado Jump — inicio de salto sin bucle y transiciones en el aire
  4. Estado Land — recuperación por fases con transición interrumpible de vuelta a locomotion

Cada estado referencia un clip de animación o un blend space. Las transiciones conectan estados con parámetros de condición — floats, bools o triggers que estableces desde código en tiempo de ejecución.

[Idle] --(speed > 0.1)--> [Locomotion]
[Locomotion] --(is_jumping == true)--> [Jump]
[Jump] --(on_ground == true)--> [Land]
[Land] --(land_finished == true)--> [Idle]
[Damage_Taken] --(hit_received == true)--> [Flinch]
[Flinch] --(flinch_finished == true)--> [Idle]

Paso 3: Contrólalo desde Código

El lado del scripting se simplifica drásticamente. En lugar de calcular manualmente los pesos de blending, empujas valores de parámetros en cada frame:

// UnigineScript — driving the 2.22 AnimationGraph
ObjectMeshSkinned character_node;
AnimationGraph anim_graph;

int init() {
    character_node = node_cast(engine.editor.getNode("player_character"));
    anim_graph = new AnimationGraph(character_node);
    anim_graph.Load("animations/player_graph.animgraph");
    return 1;
}

int update() {
    float speed = length(character_node.getPositionVelocity());
    bool is_jumping = !character_node.isOnGround();

    anim_graph.SetFloat("speed", speed);
    anim_graph.SetFloat("direction", character_node.getTurnAngle());
    anim_graph.SetBool("is_jumping", is_jumping);
    anim_graph.SetBool("on_ground", character_node.isOnGround());

    if (received_damage) {
        anim_graph.Trigger("hit_received");
        received_damage = false;
    }

    anim_graph.Update();
    return 1;
}

La versión antigua de este código eran 120-180 líneas de gestión manual del blending. La nueva versión tiene menos de 30 líneas porque la máquina de estados, el blending y la lógica de transiciones viven en el asset del grafo.

Paso 4: Configura el Blending de Capas para la Parte Superior/Inferior del Cuerpo

Para un personaje que necesita apuntar mientras corre, necesitas dos capas de animación mezcladas con máscaras de hueso. En el editor AnimationGraph de 2.22:

Capa 0 (base): Máquina de estados de locomotion — afecta caderas, piernas, núcleo de la columna
Capa 1 (override de la parte superior): Blend space de puntería — afecta columna, brazos, cabeza
Capa 2 (aditiva): Animación de retroceso — offset aditivo en el brazo derecho y la columna

Las máscaras de hueso usan los grupos de huesos del avatar que definiste en el Paso 1. El peso de blending de la máscara define cuánto reemplaza la capa de override a la capa base para esos huesos. Un peso de 1.0 significa reemplazo total; 0.7 significa blending parcial (útil para mezclar la influencia del ángulo de puntería en la columna superior).

Esta estructura de capas es la razón principal por la que la animación pasó a un sistema de máquinas de estado en lugar de seguir basada en scripts. El blending manual de máscaras se rompe de forma catastrófica cuando añades una tercera o cuarta capa. El nuevo sistema lo resuelve aplicando un orden de evaluación y componiendo las capas secuencialmente antes del skinning.


Animación Procedural: Motion Warping e IK

Qué Resuelve el Motion Warping

El motion warping redirige el root motion en tiempo de ejecución. El ejemplo canónico: la animación de vault de tu personaje tiene root motion que mueve la cápsula 2 metros hacia adelante, pero el obstáculo está a 1.5 metros. Sin motion warping, el personaje flota sobre el hueco o se incrusta en la pared. Con motion warping, el objetivo del root motion se fija en el borde del obstáculo y la trayectoria de la animación se curva para coincidir.

En Unigine 2.22:

// Setting the motion warp target during a vault
Vector3 vault_edge = getVaultEdge(ground_check.point, obstacle.normal);

// The AnimationGraph exposes a warp target parameter
anim_graph.SetWarpTarget("vault_end_point", vault_edge);
anim_graph.Trigger("start_vault");

Esto también es importante para los clientes industriales y de simulación de Unigine. Los simuladores de entrenamiento con personajes humanoides necesitan que los personajes interactúen con precisión con la geometría del entorno. El motion warping lo consigue sin ajustar manualmente la colocación de los pies en cada animación.

Integración de IK para el Posing en Tiempo de Ejecución

Unigine 2.22 expone un solver de IK que se ejecuta después de la evaluación de las capas de animación. Los dos usos más comunes:

Foot IK — lanza rayos desde cada articulación del pie hacia abajo y ajusta la flexión de la pierna para adaptarse a la pendiente del suelo. Evita el aspecto de "pies flotando 5 cm sobre terreno irregular" que afecta a la mayoría de proyectos de Unigine.

Aim IK — sigue la dirección de la cámara o del crosshair rotando la cadena de la columna y limitando la rotación de la cabeza. Esencial para cualquier shooter en tercera persona creado en Unigine.

// Foot IK setup — called each frame after anim_graph.Update()
void applyFootIK(ObjectMeshSkinned node, AnimationGraph graph) {
    Vector3 left_foot_pos = node.getBoneWorldPosition("LeftFoot");
    Vector3 right_foot_pos = node.getBoneWorldPosition("RightFoot");

    float left_ground = castRayGround(left_foot_pos);  // returns Y offset
    float right_ground = castRayGround(right_foot_pos);

    // Smoothly offset the pelvis to the lower foot position
    float pelvis_offset = min(left_ground, right_ground);
    graph.SetFootIKPelvisOffset(pelvis_offset);
    
    graph.SetFootIKTarget("LeftFoot", left_ground);
    graph.SetFootIKTarget("RightFoot", right_ground);
}

También querrás pasar los datos de la normal del suelo al foot IK — si los pies están en una pendiente de 30 grados, la rotación del tobillo debe coincidir. Si te lo saltas, los pies se colocarán correctamente en Y pero rotarán planos, con un resultado peor que no tener IK.


La Reforma de la Importación FBX: Qué Vigilar

Mapeo de Avatar Durante la Importación

El importador FBX mejorado en 2.22 resuelve los problemas históricos con las discrepancias en la jerarquía de huesos. Cuando arrastras un FBX al navegador de assets, ahora ofrece:

  • Auto-detección de convenciones de nombres de huesos (Humanoid, Mixamo, custom)
  • Asignación de avatar — etiqueta la malla importada con el esqueleto avatar de tu proyecto
  • Corrección de rotación de huesos — compensa el Z-up de Blender frente al sistema de coordenadas de Unigine (esto causaba rotaciones de 90 grados en el hueso de la cabeza en el importador antiguo aproximadamente cada dos importaciones)
  • Extracción de clips de animación — divide automáticamente los archivos FBX multi-toma en clips individuales

Solo la corrección del sistema de coordenadas elimina lo que solía ser una sesión de depuración de 2 horas por personaje. En Unigine anterior a 2.22, importabas un humanoide de Blender y pasabas la tarde preguntándote por qué los brazos del personaje apuntaban hacia atrás. Ahora el importador aplica la compensación de rotación en el momento de la importación.

Error Común: Desajuste de Escala

Lo único que el nuevo importador no corrige automáticamente es la escala de unidades. Blender usa metros por defecto; Unigine usa metros por defecto; pero Maya y 3ds Max usan centímetros por defecto. Si tu personaje se importa a 100x la escala prevista, revisa los ajustes de unidades del FBX en el diálogo de importación. Configúralo para que coincida con tu herramienta DCC antes de importar. Sigue siendo un paso manual, y sigue siendo el error de importación más común en la versión 2.22.

El desajuste de escala también afecta a la reproducción de los clips de animación. Una animación horneada con escala de 1 cm por unidad producirá un root motion 100 veces demasiado grande. La animación se reproduce, pero el personaje se teletransporta por la escena en un solo frame. Si ves este comportamiento, verifica que la escala del root motion en las propiedades del clip coincida con la escala de la malla.


Guía de Migración: Cómo Convertir el Código de Animación Antiguo

Si tienes un proyecto de Unigine existente con animación basada en scripts, migrar al sistema AnimationGraph es incremental — no necesitas reescribir todo de una vez.

Paso 1: Audita las Capas de Animación Existentes

Cuenta cuántas instancias de AnimLayer crea tu proyecto en tiempo de ejecución. La mayoría de los proyectos de Unigine tienen entre 4 y 12 capas por personaje. Cada una se asigna a un estado en el nuevo grafo o a una capa en la pila de capas.

Paso 2: Asigna las Capas a Estados

Crea el asset AnimationGraph y añade estados que coincidan con los nombres de tus capas. Para las capas que se mezclan de forma aditiva, configúralas como capas aditivas en el grafo en lugar de crear estados blend no aditivos.

Paso 3: Conserva los Parámetros Controlados por Código

Tu código existente ya calcula pesos de blending, valores de velocidad y condiciones de trigger. Refactorízalo para enviar valores de parámetros al grafo en lugar de establecer directamente los pesos de las capas. La migración se ve así:

// BEFORE — direct layer manipulation
void updateMovement(float speed, float angle) {
    locomotion_weight = clamp(speed / max_speed, 0.0, 1.0);
    idle_layer.setWeight(1.0 - locomotion_weight);
    locomotion_layer.setWeight(locomotion_weight);
    blend_parameter.setFloat(angle);
}

// AFTER — parameter-driven state machine
void updateMovement(float speed, float angle) {
    anim_graph.SetFloat("speed", speed);
    anim_graph.SetFloat("direction", angle);
}

Paso 4: Elimina la Lógica de Script Redundante

Una vez que la máquina de estados gestiona las transiciones y el blending, puedes eliminar el código manual de interpolación, easing y clamping de pesos. En los proyectos convertidos hasta ahora, los scripts relacionados con animación se reducen entre un 60 y un 75 % en número de líneas. La lógica no desaparece — se traslada al asset del grafo, que está versionado y es editable en el editor visual.


Consideraciones de Rendimiento

La evaluación del grafo de animación no es gratis. Estos son los números reales de overhead:

Escenario Enfoque antiguo con scripts Máquina de estados (2.22)
1 personaje, locomoción básica ~0.02ms ~0.03ms
1 personaje, 3 capas + IK ~0.06ms ~0.04ms
50 personajes, animaciones mixtas ~3.2ms ~1.8ms
200 personajes, con LOD ~8.5ms ~4.1ms

El sistema de máquinas de estado es más pesado por personaje en el nivel básico debido al overhead de evaluación del grafo. Pero gana eficiencia con personajes con capas porque el blending se gestiona en el motor en lugar de mediante múltiples llamadas set-weight basadas en scripts por frame. Con 50 o más personajes, el sistema de máquinas de estado es aproximadamente un 40-50 % más rápido.

LOD animation gating es tu principal palanca de optimización. Unigine 2.22 admite frecuencias de actualización de animación por LOD. Los personajes a más de 30 metros pueden actualizarse cada 3 frames; los que están a más de 80 metros, cada 8 frames. Configúralo en los ajustes de LOD del AnimationGraph:

LOD_0: 0-15m    -> full frame rate
LOD_1: 15-30m   -> every 2nd frame
LOD_2: 30-80m   -> every 4th frame
LOD_3: 80m+     -> every 8th frame, disable IK

Solo esto puede reducir el coste de CPU de la animación entre un 60 y un 70 % en escenas de mundo abierto con muchos NPC.


Buenas Prácticas para la Migración de Animación a 2.22

  1. Define primero tu esqueleto avatar, antes de crear cualquier asset de AnimationGraph. Migrar a un avatar consistente después de construir 20 assets de grafo significa re-mapear manualmente cada referencia de hueso — evitable si planificas desde el principio.

  2. Mantén las máquinas de estado planas siempre que sea posible. El AnimationGraph de Unigine admite sub-máquinas de estado anidadas, pero los grafos muy anidados (3+ niveles) son difíciles de depurar visualmente. Si tu grafo necesita más de 20 estados, divídelo en grafos separados para partes del cuerpo o contextos específicos (combate vs. exploración).

  3. Usa triggers para eventos de una sola vez, no bools. Un trigger hit_received se dispara una vez y se reinicia automáticamente. Un bool is_hit permanece true hasta que lo establezcas explícitamente en false, lo que frecuentemente hace que las animaciones se repitan indefinidamente cuando los desarrolladores olvidan el reset.

  4. Haz profiling con el panel Animation Profiler antes y después de la migración. El profiler de Unigine 2.22 ahora muestra el tiempo de CPU por estado, el coste de evaluación del blend y el recuento de transformaciones de huesos por personaje. Úsalo para identificar estados costosos — el aim IK ejecutándose en personajes que no están apuntando es el desperdicio más común.

  5. Prueba las transiciones de estados de animación a framerates extremos. A 12-15 fps (común en hardware de gama baja o cuando la GPU está saturada), las transiciones rápidas de estado pueden producir huecos de evaluación visibles como T-poses de un solo frame. Usa un limitador de frames para probar las transiciones bajo carga antes de publicar.


Qué Significa Esto para la Posición Competitiva de Unigine

La reforma de animación de Unigine 2.22 no hace que el motor sea competitivo con Control Rig de Unreal o el paquete Animation Rigging de Unity de la noche a la mañana. Esas herramientas tienen años de iteración y una enorme cantidad de assets de la comunidad detrás. Pero lo que 2.22 hace es eliminar la razón principal por la que los equipos rechazaban a Unigine durante la evaluación técnica.

Para los equipos ya comprometidos con Unigine — especialmente en simulación, arquitectura y visualización industrial, donde la eficiencia de draw calls del renderizador y el rendimiento en escenas grandes son esenciales — este lanzamiento elimina la última gran brecha del flujo de trabajo. Solo el editor visual de máquinas de estado reduce el tiempo de configuración de animación de un proyecto de personaje nuevo de 2-3 días a 4-6 horas, según los primeros informes de migración de estudios que probaron la beta de 2.22.

Si el código de animación de tu proyecto de Unigine tiene más de 500 líneas de lógica de blending, las herramientas de máquinas de estado de 2.22 lo simplificarán sustancialmente. Empieza con el ciclo idle-locomoción-salto de tu personaje principal como migración de prueba de concepto y luego propaga el patrón a tus NPC y a las animaciones de personajes secundarios.


Próximos Pasos

Descarga Unigine 2.22 desde la página oficial del SDK de Unigine y abre el proyecto de tutorial de AnimationGraph incluido en los ejemplos del SDK. La escena de ejemplo demuestra un humanoide de 3 capas con blending de locomotion, aim IK y motion warping listos para usar. Replica esta configuración con tus propios assets de personaje antes de construir un grafo personalizado desde cero — es la forma más rápida de entender el pipeline de evaluación y detectar dónde encaja tu código de animación existente en el nuevo sistema.

Para los equipos que evalúan Unigine como backend junto a otros motores, puedes conectar la capa de scripting de Unigine a servicios externos igual que harías con cualquier framework de juego en C++/C#. Si tu proyecto necesita autenticación de jugadores, datos de partida guardados o tablas de clasificación que persistan entre sesiones, herramientas como horizOn ofrecen APIs listas para usar que se conectan al runtime de scripting de Unigine mediante simples llamadas HTTP — manteniendo tu pipeline de animación limpio y tus datos de jugador gestionados por separado de la lógica del motor.


Fuente: Unigine 2.22 Publicado