A.AppInitDevAcademy / Luna Virtual
Capítulo 05 / 13 · Automatización

Nodos, animaciones y temporizadores

Conecta API Message, Hotkey y Play Animation como en tu captura, sin Pose Studio.

1. Reproduce el grafo de tu captura sin Pose Studio

Grafo real de VNyan con nodos API Message, Hotkey, Play Animation, Start Timer, Timer y Stop Animation.
Tu grafo LunaRegalo incluye dos entradas de prueba y una ruta de salida con temporizador. Las líneas amarillas representan las conexiones que disparan la animación.Descargar captura original PNG ↗Descargar versión optimizada WebP ↗
API Message / Hotkey→Play Animation + Start Timer→Timer (8 s)→Stop Animation
  1. En VNyan entra a Node Graphs y pulsa Add new graph.
  2. Nombra el grafo LunaRegalo.
  3. Agrega API Message en los nodos de callback y escribe LunaRegalo en Action.
  4. Añade un nodo Hotkey; usa Set hotkey para probarlo a mano con una tecla disponible.
  5. Añade Play Animation; elige una animación incluida entre las disponibles en VNyan y ajusta las mezclas de movimiento.
  6. Conecta las salidas de API Message y Hotkey tanto a Play Animation como a Start Timer, como en la captura.
  7. En Start Timer usa un nombre idéntico al del nodo Timer, por ejemplo FinSaludo, y un valor de 8000 milisegundos.
  8. Añade el nodo Timer con nombre FinSaludo y conecta su salida a Stop Animation.
  9. Activa la casilla Active, guarda el grafo, y prueba la tecla rápida y después el mensaje API.

2. Código real que envía el evento desde Node

Tu archivo src/avatar.mjs toma config.avatar.actions[kind] y envía el objeto {action,payload} a la URL de VNyan. Esto explica por qué el valor LunaRegalo tiene que coincidir exactamente con el del callback.

Extracto explicativo de src/avatar.mjs
const action = config.avatar.actions[kind];
await fetch(config.avatar.apiUrl, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ action, payload: {} })
});
Prueba sin estar en LIVE
Invoke-RestMethod -Method Post -Uri "http://127.0.0.1:8069/" -ContentType "application/json" -Body '{"action":"LunaRegalo","payload":{}}'
avatar.mjs: controlador real del proyectoArchivo completo de la fuente adjunta.
Descargar ↘
probar_movimientos.ps1Envía varias acciones al servidor VNyan.
Descargar ↘

3. Replica grafos para regalos, seguidores y suscripciones

GrafoAction del callbackAnimación sugeridaComprobación
LunaRegaloLunaRegaloCelebración suaveRegalo → movimiento corto → fin.
LunaSeguidorLunaSeguidorSaludo con manoSeguir → gesto visible.
LunaSuscripcionLunaSuscripcionAgradecimientoSuscribir → gesto visible.
LunaComparteLunaComparteMovimiento discretoCompartir → gesto visible.
LunaSaludaLunaSaludaSaludo de bienvenidaPrueba con hotkey.

Usa la misma estructura API Message → Play Animation → Timer → Stop Animation. Cambia el nombre de Action y selecciona el movimiento que exista en tu instalación. Puedes usar una tecla distinta para cada grafo si deseas probar sin depender de TikFinity.

4. Gestos idle opcionales (no son poses importadas)

En tu config.json están configurados cuatro nombres de movimientos de espera y un intervalo de 30 segundos. El programa intenta iniciar uno cuando hay suficiente silencio. Sin un grafo activo para cada nombre, la solicitud no moverá el avatar.

Fragmento de avatar en config.json
"idleEveryMs": 30000,
"idleQuietMs": 12000,
"idleActions": [
  "idleLookLeft",
  "idleLookRight",
  "idlePosture",
  "idleHands"
]
  1. Crea grafos LunaIdleIzquierda, LunaIdleDerecha, LunaIdlePostura y LunaIdleManos si realmente los quieres usar.
  2. En cada uno configura una acción predeterminada ligera, no una postura extrema.
  3. Prueba con .\scripts\probar_movimientos.ps1.
  4. Si prefieres solo movimientos naturales propios de VNyan, desactiva las acciones idle del puente o elimina sus entradas activas sin deshabilitar otros gestos que sí uses.

5. Errores habituales de conexión

  • La hotkey funciona y el API no: confirma Action exacto, API REST activa, puerto 8069 y permiso del cortafuegos local.
  • El API responde y no hay movimiento: confirma cables, Active, selección de animación y controles de blend.
  • La animación no termina: revisa que el nombre de Start Timer sea idéntico al de Timer.
  • Se superponen dos gestos: evita disparos simultáneos y acorta duraciones o reduce amplitud.
  • La boca no se mueve: los gestos no equivalen a lipsync; revisa el capítulo 07.
Captura ampliada