El Editor de Gráficos de Animación es una herramienta visual, basada en nodos, que empodera a artistas técnicos y animadores para construir lógica de animación compleja directamente en Roblox Studio. Al proporcionar una interfaz simplificada para crear comportamientos como árboles de mezcla, elimina la dependencia tradicional de la programación manual para el movimiento de personajes.
Este sistema trabaja en conjunto con tu flujo de trabajo de animación existente:
- Editor de Animaciones: Sigue utilizando el Editor de Animaciones como tu herramienta principal para autorizar clips individuales y ajustar fotogramas clave y curvas.
- Editor de Gráficos de Animación: Utiliza este nuevo espacio de trabajo para tomar esos clips y organizarlos en un árbol lógico para impulsar comportamientos de juego sofisticados.
Diseñado para mejorar la colaboración, el gráfico visual permite a los desarrolladores inspeccionar, depurar y entender rápidamente la lógica creada por los animadores. Mientras que los artistas se enfocan en refinar el movimiento interactivo, los desarrolladores aún pueden acceder a los nodos del gráfico de animación programáticamente para tener control directo sobre las animaciones y estados mezclados.
Construir un gráfico
Para comenzar a construir la lógica para un personaje animable, accede al editor de gráficos de animación a través de la pestaña Avatar en la cinta de Studio. Los siguientes pasos demuestran cómo inicializar un rig y construir una red de nodos básica utilizando animaciones de caminar y saludar predeterminadas.
Para un análisis más profundo de aplicaciones prácticas, puedes explorar el Archivo de Referencia del Gráfico de Animación, que contiene ejemplos tanto fundamentales como complejos de implementación.
Para crear tu propio gráfico de animación, similar al ejemplo básico proporcionado en la referencia, utiliza los siguientes pasos:
En Studio, añade un rig animable navegando a la pestaña Avatar y seleccionando Personaje ⟩ Mi Avatar.

Abre el Editor de Gráficos de Animación navegando a Editor de Gráficos en la pestaña Avatar.

Selecciona el rig animable en la vista 3D y selecciona Crear Gráfico.
En el Editor de Gráficos, haz clic derecho y selecciona Clip.

En el nuevo nodo Clip, establece el ID de la Animación.
Selecciona el menú desplegable ID de Animación.
Para enviar un ID de activo de animación específico, haz clic en Importar.

En el campo ID de Animación, añade la animación de caminar predeterminada: 507777826.
Selecciona Importar.
Agrega otro nodo de clip repitiendo los pasos 4-5 usando la animación de saludar predeterminada: 507770239.

En el Editor de Gráficos, haz clic derecho y selecciona Agregar.

Conecta los nodos Clip al nodo Agregar arrastrando el conector de salida superior derecho al puerto correspondiente:
- Conecta el nodo Clip con la animación de caminar al puerto Base.
- Conecta el nodo Clip con la animación de saludar al puerto Adicional.

Desde el nodo Agregar, conecta el conector de salida superior derecho al puerto de salida del gráfico Pose.

(Opcional) Asigna un parámetro a tu variable Speed.
Haz clic y arrastra el puerto verde de velocidad a un área vacía. Se muestra un nuevo nodo de parámetro.

En la parte superior izquierda del editor de gráficos, utiliza el panel de parámetros para modificar rápidamente los parámetros en tus nodos. También puedes acceder a esto programáticamente.

Prueba la animación presionando el botón de reproducción.

Intenta probar varios pesos, velocidades, modos de reproducción y otras animaciones. Para más información sobre nodos individuales, consulta la Referencia de Nodos.
Integración de API
Crear y desplegar un Gráfico de Animación sigue el pipeline estándar de animación de Roblox. Después de seleccionar un rig en el Editor de Gráficos de Animación, se crea un nuevo activo AnimationGraphDefinition. Este activo sirve como el contenedor para tus nodos, conexiones y parámetros. Una vez que tu lógica está finalizada, publicas el gráfico para recibir un ID de Activo estándar.
En tus scripts, interactúas con estos gráficos cargándolos en un Animator como lo harías con una animación tradicional. Para impulsar la lógica interna del gráfico, utiliza AnimationTrack:SetParameter() para pasar valores en tiempo real, como la velocidad de movimiento o booleanos de estado, directamente a las variables del gráfico.
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- Tu ID del gráfico publicado
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- Actualizaciones de parámetros dinámicos a través de RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)
Referencia de Nodos
Cada nodo de gráfico de animación sirve como una puerta lógica o fuente de datos que procesa datos de animación antes de que lleguen al rig del personaje. Esta sección proporciona un desglose técnico de los bloques funcionales dentro del Editor de Gráficos de Animación. Todos los nodos actualmente producen una pose de animación.
Cada sección de nodo incluye:
- Definición – Un resumen del propósito y rol del nodo dentro del gráfico.
- Entradas – Los flujos de datos que entran en el nodo. Varias entradas se representan como Input1, Input2, ..., InputN.
- Propiedades de Entrada – Configuraciones atadas directamente a una entrada específica (una entrada de inactividad asignada a una posición de 0.5 en un nodo Blend1D).
- Datos de Evento – Eventos emitidos o consumidos por el nodo para activar la lógica interna del gráfico o scripts de Luau externos. Este comportamiento puede cambiar durante el desarrollo de la beta.
Reglas de eventos globales
Para todos los nodos y transiciones, las siguientes reglas se aplican por defecto:
- Los eventos se propagan hacia arriba desde su nodo fuente a través del gráfico. Cada evento lleva un peso que representa la influencia de su fuente en la mezcla final. Si el peso llega a cero en algún momento, el evento se silencia.
- Los nodos sin lógica de eventos personalizada pasan todos los eventos a través sin cambios; los nodos que mezclan o seleccionan entre entradas pueden escalar el peso o bloquear eventos de entradas no primarias (ver sección de Eventos por nodo).
- Los eventos de marcador que alcanzan la parte superior del gráfico pueden ser observados a través de AnimationTrack:GetMarkerReachedSignal().
Clip

Una referencia a un activo de AnimationClip. Esto sirve como un nodo hoja en el gráfico, generando los datos de animación en bruto que alimentan otros nodos para mezcla, selección o modificación.
- Entradas
- Ninguna
- Propiedades
Propiedad Tipo Descripción Clip ID de activo El activo de animación a reproducir (por ejemplo, rbxassetid://12345). Modo de Reproducción Enum.AnimationNodePlayMode Define el comportamiento del clip una vez que alcanza el final de su duración.
- Bucle (predeterminado): Se reinicia automáticamente desde el principio una vez que el clip termina.
- PingPong: Se reproduce de inicio a fin, luego inmediatamente se reproduce al revés de fin a inicio.
- Una vez y mantener: Se reproduce una vez y mantiene la pose final al completar.
- Una vez y reiniciar: Se reproduce una vez y se restaura a la pose inicial al completar.
Reversa Booleano Controla la dirección de la reproducción. Velocidad Número Un multiplicador para la tasa de reproducción. 0.0 pausa el gráfico, 1.0 es velocidad normal, y 2.0 es el doble de velocidad. Recortar Booleano Activa o desactiva si la duración del clip debe ser truncada. RecortarInicio Número La marca de tiempo absoluta (en segundos) donde debería comenzar la reproducción. RecortarFin Número La marca de tiempo absoluta (en segundos) donde debería terminar la reproducción. - Datos de eventos
- Manejo de Eventos: Ninguno. Este es un nodo hoja sin hijos.
- Emisión de Eventos: Lee marcadores personalizados incrustados en el clip de animación (por ejemplo, "Paso", "Golpe de Arma") y los emite como eventos nombrados en el marco preciso en que ocurren. Si el clip está recortado, solo se emiten marcadores dentro del intervalo definido [TrimStart, TrimEnd] (inclusive).
Seleccionar

Selecciona entre cualquier número de entradas a través de la propiedad Selección. Siempre que la selección actual cambie, se activa una nueva transición.
- Entradas
- Input1...InputN
- Propiedades
Propiedad Tipo Descripción Selección Cadena El ID único de la entrada que se va a seleccionar, que coincide con el nombre de la conexión de entrada (por ejemplo, "Caminar"). - Datos de eventos
- Manejo de Eventos: Los eventos de la entrada seleccionada actualmente pasan a través de su peso sin cambios.
- Emisión de Eventos: Pasa solo todos los eventos de la entrada seleccionada actualmente. Durante una transición, la emisión de eventos sigue reglas de eventos globales.
SelecciónPrioritaria

Evalúa una lista de entradas conectadas de arriba a abajo y reproduce la primera cuya condición se evalúa como verdadera. Esto permite una selección de animación jerárquica basada en lógica específica. Siempre que la selección actual cambie, se activa una nueva transición.
- Entradas
- Input1...InputN
- Trigger (Booleano): Una condición lógica que debe ser verdadera para que se active esta entrada. En las versiones actuales, esto está conectado a un parámetro booleano.
- Interrumpible (Enum.AnimationNodeInterruptible): Define la regla de cuándo esta animación activa puede ser interrumpida por una entrada de mayor prioridad.
- Siempre (predeterminado): La entrada puede ser interrumpida en cualquier momento por una condición de mayor prioridad.
- Terminado: La animación actual debe completar su reproducción antes de que una entrada de mayor prioridad pueda tomar control.
- Trigger: La entrada solo es interrumpible cuando el InterruptibleTrigger está configurado en verdadero.
- InterruptibleTrigger (Booleano): Solo disponible si Interrumpible está configurado en Trigger. La entrada puede ser interrumpida cuando esta expresión específica es verdadera.
- Propiedades
Propiedad Tipo Descripción DefaultInterruptible Enum.AnimationNodeInterruptible La regla de interrupción base aplicada a todas las entradas. Cada entrada puede anular esto con su propia propiedad de entrada Interruptible. DefaultInterruptibleTrigger Booleano El valor de activación base utilizado cuando el modo Interruptible resuelto de una entrada es Trigger. Cada entrada puede anular esto con su propia propiedad de entrada InterruptibleTrigger. - Datos de eventos
- Manejo de Eventos: Los eventos de la entrada seleccionada actualmente pasan a través de su peso sin cambios.
- Emisión de Eventos: Pasa solo todos los eventos de la entrada seleccionada actualmente. Durante una transición, la emisión de eventos sigue reglas de eventos globales.
Secuencia

Activa las entradas conectadas en un orden secuencial específico basado en las condiciones de espera definidas. Siempre que la selección actual cambie, se activa una nueva transición.
- Entradas
- Input1...InputN
- WaitFor (Enum.AnimationNodeWaitFor): Especifica la condición que debe cumplirse antes de que la secuencia avance a la siguiente entrada.
- Terminado (predeterminado): Avanza a la siguiente entrada cuando la entrada actual completa un ciclo. El comportamiento de avance depende de la entrada conectada:
- Clip de reproducción única: Avanza cuando el clip termina.
- Clip en bucle: Avanza después de que se completa un bucle completo.
- Secuencia con bucles infinitos: Avanza después de un ciclo completo a través de todas las entradas.
- Secuencia con bucles infinitos: Avanza después de que se completan todos los bucles.
- Trigger: Activa la siguiente entrada cuando una expresión lógica personalizada se evalúa como verdadera.
- WaitForTrigger (Booleano): Solo disponible cuando WaitFor está configurado en Trigger.
- Propiedades
Propiedad Tipo Descripción BucleCount Número El número de veces que se ciclará a través de toda la secuencia (el valor predeterminado es 1). Un valor de 0 indica un bucle infinito. Una vez alcanzado el conteo, el nodo respeta la configuración de bucle o mantener de la última entrada. DefaultWaitFor Enum.AnimationNodeWaitFor La condición de espera base aplicada a todas las entradas. Cada entrada puede anular esto con su propia propiedad de entrada WaitFor. - Datos de eventos
- Manejo de Eventos: Los eventos de la entrada activa actualmente pasan a través de su peso sin cambios.
- Emisión de Eventos: Pasa solo todos los eventos de la entrada activa actualmente en la secuencia. Durante una transición, la emisión de eventos sigue reglas de eventos globales.
SecuenciaAleatoria

Selecciona y reproduce una de sus entradas conectadas al azar. Cuando la animación actualmente seleccionada complete, el nodo elige al azar otra entrada para reproducir. Asigna a cada entrada un peso específico para influir en la probabilidad de ser elegida. Siempre que la selección actual cambie, se activa una nueva transición.
- Entradas
- Input1...InputN
- Peso (Número): Determina la probabilidad de que esta entrada sea seleccionada; pesos más altos aumentan la posibilidad de selección.
- Propiedades
Propiedad Tipo Descripción BucleCount Número El número de entradas que el nodo reproducirá antes de detenerse. Una vez alcanzado, el nodo respeta la configuración de bucle o mantener de la última entrada. El valor predeterminado es 0 para infinito. Semilla Número Un valor utilizado para inicializar el Generador de Números Aleatorios (RNG), asegurando que la secuencia se mantenga constante entre diferentes clientes. El valor predeterminado es -1 para Semilla aleatoria. - Datos de eventos
- Manejo de Eventos: Los eventos de la entrada activa actualmente pasan a través de su peso sin cambios.
- Emisión de Eventos: Pasa solo todos los eventos de la entrada activa actualmente en la secuencia. Durante una transición, la emisión de eventos sigue reglas de eventos globales.
Sobre

Superpone la pose Sobre a la pose Base. Cuando se combina con un nodo Máscara, las juntas enmascaradas en la pose Sobre revelan completamente la pose Base, creando un efecto de superposición transparente.
- Entradas
- Base: La capa de fondo o inferior, típicamente una animación de cuerpo completo como locomoción o un estado inactivo.
- Sobre: La capa del primer plano o superior que se aplicará sobre la base, como un gesto de mano o una animación de uso de herramienta.
- Propiedades
Propiedad Tipo Descripción Peso Número El peso de mezcla utilizado para atenuar la pose Sobre. El valor predeterminado es 1.0 (anulación total) y no está limitado. - Datos de eventos
- Manejo de Eventos:
- El nodo escucha eventos de ambas entradas Base y Sobre.
- Emisión de Eventos:
- Eventos de Base: Todos los eventos de la entrada Base se pasan a través sin modificar.
- Eventos de Sobre: Los eventos de la entrada Sobre se escalan por la propiedad de Peso.
- Con un Peso de 0.5, los eventos Sobre se propagan a la mitad del peso.
- Con un Peso de 0, se silencian.
Agregar

Agrega la pose Adicional a la pose Base, atenuada por un Peso específico (sin límite).
- Entradas
- Base: La pose de animación primaria.
- Adicional: La pose que se superpondrá a la base.
- Propiedades
Propiedad Tipo Descripción Peso Número Determina la fuerza de la pose adicional aplicada a la base. - Datos de eventos
- Manejo de Eventos: El nodo escucha eventos de ambas entradas Base y Adicional.
- Emisión de Eventos: Todos los eventos de ambas entradas Base y Adicional se pasan a través sin modificar.
Restar

Convierte una animación en una pose aditiva restando una pose base relativa de la pose objetivo (). El resultado se atenúa por un Peso específico (sin límite).
- Entradas
- A: La pose de animación objetivo.
- B: La pose base relativa que se va a restar.
- Propiedades
Propiedad Tipo Descripción Peso Número Determina la fuerza del efecto de resta aplicado al resultado. - Datos de eventos
- Manejo de Eventos: El nodo escucha eventos de ambas Entrada A y Entrada B.
- Emisión de Eventos: Todos los eventos de ambas Entrada A y Entrada B se pasan a través sin modificar.
Mezcla1D

Interpole linealmente entre las dos poses de animación más cercanas a la posición actual de entrada en un solo eje.
- Entradas
- Input1...InputN
- Posición (Número): La coordenada específica para cada entrada subsiguiente en el eje de mezcla.
- Propiedades
Propiedad Tipo Descripción Posición Número El valor activo actual en el eje de mezcla utilizado para muestrear las animaciones. Si Posición está fuera del rango de posiciones de entrada definidas, el nodo extrapola usando las dos entradas más cercanas. Sincronización de Fase Enum.AnimationNodePhaseSync Configura si el tiempo de las entradas hijas debe sincronizarse.
- Sincronizado (predeterminado): Sincronización normalizada. El nodo calcula una "duración virtual" basada en el promedio ponderado de las entradas activas. El paso de tiempo de cada nodo de entrada se ajusta de modo que todas las entradas converjan a la misma fase, manteniendo animaciones de diferentes longitudes en sincronía.
- No sincronizado: Mezcla estándar donde los clips avanzan independientemente a sus propias tasas de reproducción.
- Datos de eventos
- Manejo de Eventos: El nodo escucha eventos de todos los nodos hijos actualmente activos.
- Emisión de Eventos: Solo los eventos de la entrada activa de mayor peso se propagan, escalados por su peso de mezcla. Los eventos de la entrada secundaria se silencian.
Mezcla2D

Mezcla múltiples poses de animación entre sí basándose en dos parámetros de entrada dentro de un espacio de coordenadas 2D. Esto generaliza el nodo Mezcla1D para manejar escenarios complejos, como la mezcla basada tanto en la dirección de movimiento como en la velocidad simultáneamente.
- Entradas
- Input1...InputN
- X (Número): La coordenada X para cada entrada subsiguiente.
- Y (Número): La coordenada Y para cada entrada subsiguiente.
- Propiedades
Propiedad Tipo Descripción Modo de Entrada Enum.AnimationNodeBlend2DInputMode Define el sistema de coordenadas utilizado para evaluar el espacio de mezcla:
- Cartesiano (predeterminado): Usa coordenadas de cuadrícula 2D estándar. X e Y representan la posición actual dentro del espacio de mezcla.
- Polar: Usa valores angulares y de magnitud. X representa la dirección en radianes, mientras que Y representa la magnitud o fuerza del movimiento. La dirección tiene más peso que la magnitud, por lo que las entradas en ángulos similares pero diferentes magnitudes se mezclan de manera más suave que las entradas en diferentes ángulos.
X Número La coordenada X actual (Cartesiano) o dirección en radianes (Polar). Y Número La coordenada Y actual (Cartesiano) o magnitud (Polar). Sincronización de Fase Enum.AnimationNodePhaseSync Configura si el tiempo de las entradas hijas debe sincronizarse.
- Sincronizado (predeterminado): Sincronización normalizada. El nodo calcula una "duración virtual" basada en el promedio ponderado de las entradas activas. El paso de tiempo de cada nodo de entrada se ajusta de modo que todas las entradas converjan a la misma fase, manteniendo animaciones de diferentes longitudes en sincronía.
- No sincronizado: Mezcla estándar donde los clips avanzan independientemente a sus propias tasas de reproducción.
- Datos de eventos
- Manejo de Eventos: El nodo escucha eventos de todos los nodos hijos actualmente activos.
- Emisión de Eventos: Solo los eventos de la entrada activa de mayor peso se propagan, escalados por su peso de mezcla. Los eventos de la entrada secundaria se silencian.
Máscara

Aplica una máscara predefinida a la Pose de entrada. Una máscara se define por un peso por objeto (por ejemplo, articulación) en la jerarquía del rig, permitiendo un control preciso o "desvanecimiento" de la animación.
- Entradas
- Pose: La pose de animación a ser enmascarada.
- Propiedades
Propiedad Tipo Descripción Máscara ObjectValue Un ObjectValue (creado como un hijo directo de la definición de nodo de máscara AnimationNodeDefinition) que define los pesos de la máscara. Puede funcionar de una de dos maneras:
- Directamente: El ObjectValue contiene atributos que mapean los nombres de los objetos del rig a valores de peso específicos.
- Por Referencia: El ObjectValue hace referencia a otra Instance que contiene los atributos de mapeo. Esto permite máscaras compartidas a través de diferentes nodos en el gráfico.
Al crear una máscara, puedes elegir un esquema de rig (HumanoidRigDescription o Selector) para poblar la jerarquía.
- HumanoidRigDescription: Estandariza la máscara para personajes humanoides.
- Selector: Permite al usuario seleccionar cualquier rig específico en el espacio de trabajo para poblar la jerarquía de la máscara.
Invertir Booleano Cuando es verdadero, aplica los valores de peso como 1 - peso. Esto permite reutilizar una máscara inversamente sin crear un nuevo activo. - Datos de eventos
- Manejo de Eventos: El nodo escucha todos los eventos de la entrada Pose.
- Emisión de Eventos: Todos los eventos de la entrada Pose se pasan a través sin modificar.
Velocidad

Modifica la tasa de reproducción de una pose de animación entrante.
- Entradas
- Pose: La pose de animación o subgrafo cuya velocidad de reproducción se modificará.
- Propiedades
Propiedad Tipo Descripción Velocidad Número Un multiplicador aplicado al delta de tiempo (). 0.0 pausa el gráfico, 1.0 es velocidad normal, y 2.0 es el doble de velocidad. - Datos de eventos
- Manejo de Eventos: El nodo escucha eventos de la entrada Pose.
- Emisión de Eventos: Todos los eventos de la entrada Pose se pasan a través sin modificar. Ten en cuenta que, mientras la velocidad de reproducción visual cambia, el tiempo de los eventos emitidos (como marcadores) se escalará en consecuencia con la velocidad de reproducción modificada.
SalidaDelGráfico

Representa la pose final evaluada del gráfico. Este nodo se incluye automáticamente en todos los nuevos gráficos en el Editor de Gráficos de Animación. Su presencia asegura que el gráfico siempre sea válido y produzca consistentemente una pose de animación.
- Entradas
- Pose: Los datos de animación finales procesados que se aplicarán al rig.
- Propiedades
- Ninguna
- Datos de eventos
- Manejo de Eventos: El nodo escucha todos los eventos pasados a través de la entrada conectada final.
- Emisión de Eventos: Este nodo sirve como el punto de salida para el pipeline de animación y no emite señales de regreso al gráfico.
Transiciones
Varios nodos en el Gráfico de Animación (como Seleccionar, SeleccionarPrioritaria, Secuencia, y SecuenciaAleatoria) gestionan cómo se mezclan las animaciones al cambiar entre entradas activas. Para evitar redundancias en la referencia de nodos, estos comportamientos están definidos por grupos de propiedades de transición estandarizadas.
Transición predeterminada

El comportamiento de mezcla base aplicado al nodo siempre que se cambia a una nueva entrada activa.
- DefaultTransitionDuration (número): El tiempo (en segundos) que toma mezclar completamente en la nueva pose.
- DefaultTransitionCurve (Enum.PoseEasingStyle): La función de suavizado aplicada durante la mezcla. Actualmente solo admite Enum.PoseEasingStyle.Linear y Enum.PoseEasingStyle.CubicV2.
Anulación de transición

Propiedades de enlace específicas de entrada que sobresalen la transición predeterminada. Estas se aplican cuando el nodo transiciona a esa entrada específica.
- TransitionOverrideDuration (número): Sobrescribe la duración de transición predeterminada.
- TransitionOverrideCurve (Enum.PoseEasingStyle): Sobrescribe la curva de transición predeterminada. Actualmente solo admite Enum.PoseEasingStyle.Linear y Enum.PoseEasingStyle.CubicV2.
Replicación
Los parámetros del gráfico de animación son locales a cada AnimationTrack y no se replican automáticamente. Esto puede cambiar en futuras actualizaciones, pero el enfoque actualmente recomendado utiliza:
- Cliente → Servidor: Un RemoteEvent para enviar parámetros desde el cliente propietario al servidor a una tasa de tick fija.
- Servidor → Otros Clientes: Atributos de instancia que se replican automáticamente a todos los clientes.
Personajes de jugador
Un script del cliente controla los personajes de los jugadores. Dado que solo el cliente propietario conoce el estado actual del juego (entrada de movimiento, estado del humanoide, etc.), los parámetros deben fluir del cliente propietario al servidor y luego a todos los demás clientes.
Configuración
Bajo StarterCharacterScripts, crea:
- Un LocalScript para la animación del lado del cliente y el control de parámetros.
- Un Script para la replicación del lado del servidor.
- Un RemoteEvent para la comunicación cliente-servidor.
Script del cliente
El cliente propietario controla los parámetros a partir de eventos del juego y los envía al servidor periódicamente. Otros clientes leen atributos replicados desde el script del servidor.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Cargar el gráfico de animación
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Reemplazar con tu ID de gráfico publicado
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- Leer parámetros replicados desde el script del servidor
local animateServer = script.Parent:WaitForChild("AnimateServer")
for attribute, value in animateServer:GetAttributes() do
track:SetParameter(attribute, value)
end
animateServer.AttributeChanged:Connect(function(attribute)
track:SetParameter(attribute, animateServer:GetAttribute(attribute))
end)
return
end
-- Jugador local: controlar parámetros a partir del juego
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- Ejemplo: controlar parámetros desde el estado del humanoide
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- Enviar parámetros al servidor a una tasa de tick fija
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
local TICK_RATE = 1 / 20
local lastSendTime = 0
RunService.Stepped:Connect(function(gameTime)
if gameTime - lastSendTime > TICK_RATE then
lastSendTime = gameTime
replicateEvent:FireServer(params)
end
end)
Script del servidor
Recibe parámetros del cliente propietario, controla el gráfico de animación del lado del servidor y propaga valores como atributos para replicación a otros clientes.
local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Cargar el mismo gráfico de animación en el servidor
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Mismo ID de gráfico que el cliente
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- Recibir parámetros del cliente propietario y replicar a través de atributos
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
replicateEvent.OnServerEvent:Connect(function(player, params)
if Players:GetPlayerFromCharacter(character) ~= player then
return
end
for key, value in params do
track:SetParameter(key, value)
script:SetAttribute(key, value)
end
end)
NPCs
Dado que el servidor controla la animación de NPC, solo se necesita la replicación del servidor al cliente. Controla el gráfico de animación en el servidor, escribe parámetros como atributos en un Script del servidor y léelos en los clientes utilizando el mismo patrón de Instance.AttributeChanged mostrado anteriormente.
Latencia
Otros clientes ven animaciones con un pequeño retraso igual al intervalo de tick (hasta 50 ms a 20 Hz) más la latencia de la red. Puedes reducir el intervalo de tick aumentando la frecuencia (como 1/30), a costa de un mayor tráfico de red. 20 Hz es un valor predeterminado razonable; la mezcla de animaciones es lo suficientemente indulgente como para que los pequeños retrasos sean difíciles de notar.