L'Editor del Grafico delle Animazioni è uno strumento visivo basato su nodi che consente a artisti tecnici e animatori di costruire logiche di animazione complesse direttamente all'interno di Roblox Studio. Offrendo un'interfaccia semplificata per creare comportamenti come gli alberi di fusione, rimuove la tradizionale dipendenza dalla scrittura manuale di script per il movimento dei personaggi.
Questo sistema funziona in tandem con il tuo flusso di lavoro di animazione esistente:
- Editor delle Animazioni: Continua a utilizzare l'Editor delle Animazioni come tuo strumento principale per la creazione di clip individuali e per l'affinamento di fotogrammi chiave e curve.
- Editor del Grafico delle Animazioni: Usa questo nuovo spazio di lavoro per prendere quelle clip e organizzarle in un albero logico per guidare comportamenti di gioco sofisticati.
Progettato per migliorare la collaborazione, il grafo visivo consente agli sviluppatori di ispezionare rapidamente, eseguire il debug e comprendere la logica creata dagli animatori. Mentre gli artisti si concentrano sull'affinamento del movimento interattivo, gli sviluppatori possono comunque accedere ai nodi del grafo delle animazioni programmaticamente per un controllo diretto sulle animazioni e sugli stati mescolati.
Costruire un grafo
Per iniziare a costruire la logica per un personaggio animabile, accedi all'editor del grafo delle animazioni tramite la scheda Avatar nel nastro di Studio. I seguenti passaggi dimostrano come inizializzare un rig e costruire una rete di nodi di base utilizzando le animazioni di camminata e saluto predefinite.
Per un approfondimento sulle applicazioni pratiche, puoi esplorare il File di Riferimento del Grafo delle Animazioni, che contiene sia esempi fondamentali che complessi di implementazione.
Per creare il tuo grafo delle animazioni, simile all'esempio di base fornito nel riferimento, segui i seguenti passaggi:
In Studio, aggiungi un rig animabile navigando nella scheda Avatar e selezionando Personaggio ⟩ Il mio Avatar.

Apri l'Editor del Grafico delle Animazioni navigando in Editor dei Grafo nella scheda Avatar.

Seleziona il rig animabile nella finestra di visualizzazione 3D e seleziona Crea Grafo.
Nell'Editor del Grafo, fai clic con il tasto destro e seleziona Clip.

Nel nuovo nodo Clip, imposta l'ID dell'Animazione.
Seleziona il menu a discesa ID Animazione.
Per inviare un ID asset di animazione specifico, fai clic su Importa.

Nel campo ID Animazione, aggiungi l'animazione predefinita di Camminata: 507777826.
Seleziona Importa.
Aggiungi un altro nodo clip ripetendo i passaggi 4-5 utilizzando l'animazione predefinita della Wave: 507770239.

Nell'Editor del Grafo, fai clic con il tasto destro e seleziona Aggiungi.

Collega i nodi Clip al nodo Aggiungi trascinando il connettore di output in alto a destra verso la porta appropriata:
- Collega il nodo Clip con l'animazione di Camminata alla porta Base.
- Collega il nodo Clip con l'animazione di Saluto alla porta Additiva.

Dal nodo Aggiungi, collega il connettore di output in alto a destra alla porta di Output del Grafo Pose.

(Facoltativo) Assegna un parametro alla tua variabile Speed.
Fai clic e trascina la porta Speed verde in un'area vuota. Viene visualizzato un nuovo nodo di parametro.

In alto a sinistra dell'editor del grafo, utilizza il pannello dei parametri per modificare rapidamente i parametri nei tuoi nodi. Puoi anche accedere a questo programmaticamente.

Testa l'animazione premendo il pulsante di riproduzione.

Prova a testare vari pesi, velocità, modalità di riproduzione e altre animazioni. Per ulteriori informazioni sui nodi individuali, consulta il riferimento ai nodi.
Integrazione API
Creare e distribuire un Grafo delle Animazioni segue il normale pipeline delle animazioni di Roblox. Dopo aver selezionato un rig nell'Editor del Grafico delle Animazioni, viene creato un nuovo asset AnimationGraphDefinition. Questo asset funge da contenitore per i tuoi nodi, connessioni e parametri. Una volta finalizzata la tua logica, pubblichi il grafo per ricevere un ID Asset standard.
Nei tuoi script, interagisci con questi grafi caricandoli su un Animator come faresti con un'animazione tradizionale. Per guidare la logica interna del grafo, utilizza AnimationTrack:SetParameter() per passare valori in tempo reale—come la velocità di movimento o booleani di stato—direttamente nelle variabili del grafo.
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- Il tuo ID del Grafo Pubblicato
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- Aggiornamenti dinamici dei parametri tramite RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)
Riferimento ai nodi
Ogni nodo del grafo delle animazioni funge da porta logica o sorgente di dati che elabora i dati di animazione prima che raggiungano il rig del personaggio. Questa sezione fornisce un'analisi tecnica dei blocchi funzionali all'interno dell'Editor del Grafico delle Animazioni. Tutti i nodi attualmente forniscono una posa di animazione.
Ogni sezione di nodo include:
- Definizione – Un riassunto dello scopo del nodo e del suo ruolo all'interno del grafo.
- Input – I flussi di dati che entrano nel nodo. Gli input multipli sono rappresentati come Input1, Input2, ..., InputN.
- Proprietà di Input – Impostazioni legate direttamente a un input specifico (un input di Idle assegnato a una Posizione di 0.5 su un nodo Blend1D).
- Dati Evento – Eventi emessi o consumati dal nodo per attivare la logica interna del grafo o script Luau esterni. Questo comportamento potrebbe cambiare nel corso dello sviluppo beta.
Regole degli eventi globali
Per tutti i nodi e le transizioni, le seguenti regole si applicano per impostazione predefinita:
- Gli eventi si propagano verso l'alto dal loro nodo sorgente attraverso il grafo. Ciascun evento porta un peso che rappresenta l'influenza della sorgente nella fusione finale. Se il peso raggiunge zero in qualsiasi momento, l'evento viene silenziato.
- I nodi senza logica di evento personalizzata passano tutti gli eventi attraverso senza modifiche; i nodi che mescolano o selezionano tra input possono ridimensionare il peso o bloccare eventi provenienti da input non primari (vedi sezione Evento per nodo).
- Gli eventi marker che raggiungono la parte superiore del grafo possono essere osservati tramite AnimationTrack:GetMarkerReachedSignal().
Clip

Un riferimento a un asset di AnimationClip. Questo funge da nodo foglia nel grafo, generando i dati di animazione grezzi che vengono inviati ad altri nodi per la fusione, selezione o modifica.
- Input
- Nessuno
- Proprietà
Proprietà Tipo Descrizione Clip ID Asset L'asset di animazione da riprodurre (es. rbxassetid://12345). PlayMode Enum.AnimationNodePlayMode Definisce il comportamento del clip una volta raggiunta la fine della sua durata.
- Ciclo (predefinito): Riavvia automaticamente dall'inizio una volta che il clip è terminato.
- PingPong: Riproduce da inizio a fine, poi riproduce immediatamente in reverse da fine a inizio.
- UnaVoltaETrattieni: Riproduce una volta e mantiene la posa finale al termine.
- UnaVoltaEReset: Riproduce una volta e torna alla posa iniziale al termine.
Reverse Booleano Controlla la direzione della riproduzione. Speed Numero Un moltiplicatore per la velocità di riproduzione. 0.0 pausa il grafo, 1.0 è la velocità normale e 2.0 è il doppio della velocità. Trim Booleano Attiva o disattiva se la durata del clip deve essere troncata. TrimStart Numero Il timestamp assoluto (in secondi) in cui deve iniziare la riproduzione. TrimEnd Numero Il timestamp assoluto (in secondi) in cui deve terminare la riproduzione. - Dati Evento
- Gestione Evento: Nessuno. Questo è un nodo foglia senza figli.
- Emissione Evento: Legge marcatori personalizzati incorporati nel clip di animazione (es. "Footstep", "WeaponSwing") e li emette come eventi denominati al fotogramma preciso in cui si verificano. Se il clip è troncato, solo i marcatori all'interno dell'intervallo definito [TrimStart, TrimEnd] (inclusivo) vengono emessi.
Select

Seleziona tra un numero qualsiasi di input tramite la proprietà di Selezione. Ogni volta che la selezione attuale cambia, attiva una nuova transizione.
- Input
- Input1...InputN
- Proprietà
Proprietà Tipo Descrizione Selezione Stringa L'ID unico dell'input da selezionare, corrispondente al nome della connessione di input (es. "Walk"). - Dati Evento
- Gestione Evento: Gli eventi provenienti dall'input attualmente selezionato passano attraverso con il loro peso invariato.
- Emissione Evento: Passa attraverso tutti gli eventi provenienti solo dall'input attualmente selezionato. Durante una transizione, l'emissione degli eventi segue le regole globali degli eventi.
PrioritySelect

Valuta un elenco di input collegati dall'alto verso il basso e riproduce il primo il cui stato è vero. Questo consente una selezione gerarchica delle animazioni basata su logiche specifiche. Ogni volta che la selezione attuale cambia, attiva una nuova transizione.
- Input
- Input1...InputN
- Attiva (Booleano): Una condizione logica che deve essere vera affinché questo input si attivi. Nelle versioni attuali, questo è collegato a un parametro booleano.
- Interrompibile (Enum.AnimationNodeInterruptible): Definisce la regola per quando questa animazione attiva può essere interrotta da un input a priorità superiore.
- Sempre (predefinito): L'input può essere interrotto in qualsiasi momento da una condizione a priorità superiore.
- Finito: L'animazione corrente deve completare la sua riproduzione prima che un input a priorità superiore possa prendere il sopravvento.
- Attiva: L'input è interrotto solo quando l'InterruptibleTrigger è impostato su vero.
- InterruptibleTrigger (Booleano): Disponibile solo se Interrompibile è impostato su Attiva. L'input può essere interrotto quando questa specifica espressione è vera.
- Proprietà
Proprietà Tipo Descrizione DefaultInterruptible Enum.AnimationNodeInterruptible La regola di interruzione di base applicata a tutti gli input. Ogni input può sovrascrivere questa con la propria Interrompibile proprietà di input. DefaultInterruptibleTrigger Booleano Il valore di attivazione di base utilizzato quando la modalità Interrompibile risolta di un input è Attiva. Ogni input può sovrascrivere questa con la propria InterruptibleTrigger proprietà di input. - Dati Evento
- Gestione Evento: Gli eventi provenienti dall'input attualmente selezionato passano attraverso con il loro peso invariato.
- Emissione Evento: Passa attraverso tutti gli eventi provenienti solo dall'input attualmente selezionato. Durante una transizione, l'emissione degli eventi segue le regole globali degli eventi.
Sequence

Attiva gli input collegati in un ordine specifico in base a condizioni di attesa definite. Ogni volta che la selezione attuale cambia, attiva una nuova transizione.
- Input
- Input1...InputN
- WaitFor (Enum.AnimationNodeWaitFor): Specifica la condizione che deve essere soddisfatta prima che la sequenza avanzi all'input successivo.
- Finito (predefinito): Avanza all'input successivo quando l'input corrente completa un ciclo. Il comportamento di avanzamento dipende dall'input collegato:
- Clip riproduci-una-volta: Avanza quando il clip termina.
- Clip in ciclo: Avanza dopo che un ciclo completo è terminato.
- Sequenza con cicli infiniti: Avanza dopo un ciclo completo attraverso tutti gli input.
- Sequenza con cicli infiniti: Avanza dopo che tutti i cicli sono completati.
- Attiva: Attiva l'input successivo quando un'espressione logica personalizzata risulta vera.
- WaitForTrigger (Booleano): Disponibile solo quando WaitFor è impostato su Attiva.
- Proprietà
Proprietà Tipo Descrizione LoopCount Numero Il numero di volte da ciclare attraverso l'intera sequenza (predefinito è 1). Un valore di 0 indica un ciclo infinito. Una volta raggiunto il conteggio, il nodo rispetta l'impostazione di ciclo o di mantenimento dell'input finale. DefaultWaitFor Enum.AnimationNodeWaitFor La condizione di attesa di base applicata a tutti gli input. Ogni input può sovrascrivere questa con la propria WaitFor proprietà di input. - Dati Evento
- Gestione Evento: Gli eventi provenienti dall'input attualmente attivo passano attraverso con il loro peso invariato.
- Emissione Evento: Passa attraverso tutti gli eventi provenienti solo dall'input attualmente attivo nella sequenza. Durante una transizione, l'emissione degli eventi segue le regole globali degli eventi.
RandomSequence

Seleziona e riproduce uno dei suoi input collegati a caso. Quando l'animazione attualmente selezionata è completata, il nodo sceglie casualmente un altro input da riprodurre. Assegna a ciascun input un peso specifico per influenzare la probabilità di selezione. Ogni volta che la selezione attuale cambia, attiva una nuova transizione.
- Input
- Input1...InputN
- Peso (Numero): Determina la probabilità che questo input venga selezionato; pesi più alti aumentano la possibilità di selezione.
- Proprietà
Proprietà Tipo Descrizione PlayCount Numero Il numero di input che il nodo riprodurrà prima di fermarsi. Una volta raggiunto, il nodo rispetta l'impostazione di ciclo o di mantenimento dell'input finale. Predefinito è 0 per infinito Seed Numero Un valore utilizzato per inizializzare il Generatore di Numeri Casuali (RNG), garantendo che la sequenza rimanga coerente tra i diversi client. Predefinito è -1 per Seed casuale. - Dati Evento
- Gestione Evento: Gli eventi provenienti dall'input attualmente attivo passano attraverso con il loro peso invariato.
- Emissione Evento: Passa attraverso tutti gli eventi provenienti solo dall'input attualmente attivo nella sequenza. Durante una transizione, l'emissione degli eventi segue le regole globali degli eventi.
Over

Sovrappone la posa Over sulla posa Base. Quando combinato con un nodo Maschera, le articolazioni esclusa nella posa Over rivelano completamente la posa Base, creando un effetto di sovrapposizione trasparente.
- Input
- Base: Lo sfondo o lo strato inferiore, tipicamente un'animazione a corpo intero come locomozione o uno stato di inattività.
- Over: Lo strato anteriore o superiore da applicare sulla base, come un gesto della mano o un'animazione di utilizzo di uno strumento.
- Proprietà
Proprietà Tipo Descrizione Peso Numero Il peso di miscelazione utilizzato per attenuare la posa Over. Predefinito è 1.0 (override completo) e non è limitato. - Dati Evento
- Gestione Evento:
- Il nodo ascolta gli eventi provenienti sia dagli input Base che Over.
- Emissione Evento:
- Eventi Base: Tutti gli eventi provenienti dall'input Base vengono passati attraverso senza modifiche.
- Eventi Over: Gli eventi provenienti dall'input Over sono scalati dalla proprietà Peso.
- A Peso 0.5, gli eventi Over si propagano a metà peso
- A Peso 0, sono silenziati.
Add

Aggiunge la posa Additiva alla posa Base, attenuata da un Peso specifico (non limitato).
- Input
- Base: La posa di animazione principale.
- Additiva: La posa da sovrapporre alla base.
- Proprietà
Proprietà Tipo Descrizione Peso Numero Determina la forza della posa additiva applicata alla base. - Dati Evento
- Gestione Evento: Il nodo ascolta gli eventi provenienti sia dagli input Base che Additiva.
- Emissione Evento: Tutti gli eventi provenienti sia dagli input Base che Additiva vengono passati attraverso senza modifiche.
Subtract

Converte un'animazione in una posa additiva sottraendo una posa base relativa dalla posa target (). Il risultato è attenuato da un Peso specifico (non limitato).
- Input
- A: La posa di animazione target.
- B: La posa base relativa da sottrarre.
- Proprietà
Proprietà Tipo Descrizione Peso Numero Determina la forza dell'effetto di sottrazione applicato al risultato. - Dati Evento
- Gestione Evento: Il nodo ascolta gli eventi provenienti sia da Input A che da Input B.
- Emissione Evento: Tutti gli eventi provenienti sia da Input A che da Input B vengono passati attraverso senza modifiche.
Blend1D

Interpolazione lineare tra le due pose di animazione più vicine alla posizione di input corrente su un singolo asse.
- Input
- Input1...InputN
- Posizione (Numero): La coordinata specifica per ciascun input successivo sull'asse di fusione.
- Proprietà
Proprietà Tipo Descrizione Posizione Numero Il valore attivo corrente sull'asse di fusione utilizzato per campionare le animazioni. Se Posizione è al di fuori dell'intervallo delle posizioni di input definite, il nodo esegue un'estrapolazione utilizzando i due input più vicini. PhaseSync Enum.AnimationNodePhaseSync Configura se il tempo degli input figli deve essere sincronizzato.
- Sincronizzato (predefinito): Sincronizzazione normalizzata. Il nodo calcola una "durata virtuale" basata sulla media ponderata degli input attivi. Ogni passo temporale del nodo di input viene regolato in modo che tutti i figli convergano alla stessa fase, mantenendo le animazioni di lunghezze diverse in sincronia.
- Non sincronizzato: Fusione standard in cui i clip avanzano indipendentemente secondo i loro tassi di riproduzione.
- Dati Evento
- Gestione Evento: Il nodo ascolta gli eventi provenienti da tutti i nodi figli attualmente attivi.
- Emissione Evento: Solo gli eventi provenienti dall'input attivamente più alto si propagano, scalati dal suo peso di fusione. Gli eventi dall'input secondario sono silenziati.
Blend2D

Mescola più pose di animazione insieme in base a due parametri di input all'interno di uno spazio coordinato 2D. Questo generalizza il nodo Blend1D per gestire scenari complessi, come la fusione basata sia sulla direzione di movimento che sulla velocità simultaneamente.
- Input
- Input1...InputN
- X (Numero): La coordinata X per ciascun input successivo.
- Y (Numero): La coordinata Y per ciascun input successivo.
- Proprietà
Proprietà Tipo Descrizione InputMode Enum.AnimationNodeBlend2DInputMode Definisce il sistema di coordinate utilizzato per valutare lo spazio di fusione:
- Cartesiano (predefinito): Usa coordinate standard 2D. X e Y rappresentano la posizione corrente all'interno dello spazio di fusione.
- Polare: Usa valori angolari e di grandezza. X rappresenta la direzione in radianti, mentre Y rappresenta la grandezza o la forza del movimento. La direzione ha un peso maggiore della grandezza, così gli input a angoli simili ma grandezze diverse si fondono in modo più fluido rispetto a input a angoli diversi.
X Numero La coordinata X corrente (Cartesiano) o Direzione in radianti (Polare). Y Numero La coordinata Y corrente (Cartesiano) o Grandezza (Polare). PhaseSync Enum.AnimationNodePhaseSync Configura se il tempo degli input figli deve essere sincronizzato.
- Sincronizzato (predefinito): Sincronizzazione normalizzata. Il nodo calcola una "durata virtuale" basata sulla media ponderata degli input attivi. Ogni passo temporale del nodo di input viene regolato in modo che tutti i figli convergano alla stessa fase, mantenendo le animazioni di lunghezze diverse in sincronia.
- Non sincronizzato: Fusione standard in cui i clip avanzano indipendentemente secondo i loro tassi di riproduzione.
- Dati Evento
- Gestione Evento: Il nodo ascolta gli eventi provenienti da tutti i nodi figli attualmente attivi.
- Emissione Evento: Solo gli eventi provenienti dall'input attivamente più alto si propagano, scalati dal suo peso di fusione. Gli eventi dall'input secondario sono silenziati.
Mask

Applica una maschera predefinita alla posa di input. Una maschera è definita da un peso per oggetto (es. articolazione) nella gerarchia del rig, consentendo un controllo preciso o "sfumatura" dell'animazione.
- Input
- Pose: La posa di animazione da mascherare.
- Proprietà
Proprietà Tipo Descrizione Mask ObjectValue Un ObjectValue (creato come figlio diretto della definizione del nodo di Maschera) che definisce i pesi della maschera. Può funzionare in uno di due modi:
- Direttamente: Il ObjectValue stesso contiene attributi che mappano i nomi degli oggetti del rig a valori di peso specifici.
- Per Riferimento: Il ObjectValue fa riferimento a un'altra Instance che contiene gli attributi di mapping. Questo consente di condividere maschere tra diversi nodi nel grafo.
Quando crei una maschera, puoi scegliere uno schema di rig (HumanoidRigDescription o Picker) per popolare la gerarchia.
- HumanoidRigDescription: Standardizza la maschera per personaggi umanoidi.
- Picker: Consente all'utente di selezionare un rig specifico nello spazio di lavoro per popolare la gerarchia della maschera.
Invert Booleano Quando vero, applica valori di peso come 1 - peso. Questo consente di riutilizzare una maschera in modo inverso senza creare un nuovo asset. - Dati Evento
- Gestione Evento: Il nodo ascolta tutti gli eventi provenienti dall'input Pose.
- Emissione Evento: Tutti gli eventi provenienti dall'input Pose vengono passati attraverso senza modifiche.
Speed

Modifica la velocità di riproduzione di una posa di animazione in arrivo.
- Input
- Pose: La posa di animazione o sottografo la cui velocità di riproduzione sarà modificata.
- Proprietà
Proprietà Tipo Descrizione Speed Numero Un moltiplicatore applicato al delta di tempo (). 0.0 pausa il grafo, 1.0 è la velocità normale, e 2.0 è il doppio della velocità. - Dati Evento
- Gestione Evento: Il nodo ascolta gli eventi provenienti dall'input Pose.
- Emissione Evento: Tutti gli eventi provenienti dall'input Pose vengono passati attraverso senza modifiche. Nota che mentre la velocità di riproduzione visiva cambia, il tempo degli eventi emessi (come i marcatori) si scalerà di conseguenza con la velocità di riproduzione modificata.
GraphOutput

Rappresenta la posa finale valutata del grafo. Questo nodo è automaticamente incluso in tutti i nuovi grafi nell'Editor del Grafico delle Animazioni. La sua presenza garantisce che il grafo sia sempre valido e produca costantemente una posa di animazione.
- Input
- Pose: I dati di animazione finali elaborati da applicare al rig.
- Proprietà
- Nessuno
- Dati Evento
- Gestione Evento: Il nodo ascolta tutti gli eventi passati attraverso l'input finale connesso.
- Emissione Evento: Questo nodo funge da punto di uscita per la pipeline di animazione e non emette segnali di ritorno nel grafo.
Transizioni
Diversi nodi nel Grafo delle Animazioni (come Select, Priority Select, Sequence e Random Sequence) gestiscono come le animazioni si fondono quando si passa tra gli input attivi. Per prevenire ridondanze nel riferimento ai nodi, questi comportamenti sono definiti da gruppi di proprietà di transizione standardizzati.
Transizione predefinita

Il comportamento di fusione di base applicato al nodo ogni volta che passa a un nuovo input attivo.
- DefaultTransitionDuration (numero): Il tempo (in secondi) necessario per fondere completamente nella nuova posa.
- DefaultTransitionCurve (Enum.PoseEasingStyle): La funzione di easing applicata durante la fusione. Attualmente supporta solo Enum.PoseEasingStyle.Linear e Enum.PoseEasingStyle.CubicV2.
Sovrascrittura della transizione

Proprietà di collegamento specifiche per input che sovrascrivono la transizione predefinita. Queste vengono applicate quando il nodo transita verso quello specifico input.
- TransitionOverrideDuration (numero): Sovrascrive la durata della transizione predefinita.
- TransitionOverrideCurve (Enum.PoseEasingStyle): Sovrascrive la curva di transizione predefinita. Attualmente supporta solo Enum.PoseEasingStyle.Linear e Enum.PoseEasingStyle.CubicV2
Replicazione
I parametri del grafo delle animazioni sono locali a ciascun AnimationTrack e non vengono replicati automaticamente. Questo potrebbe cambiare in futuri aggiornamenti, ma l'approccio attualmente raccomandato utilizza:
- Client → Server: Un RemoteEvent per inviare parametri dal client proprietario al server a un ritmo fisso.
- Server → Altri Client: Attributi delle istanze che si replicano automaticamente a tutti i client.
Personaggi dei giocatori
Uno script client guida i personaggi dei giocatori. Poiché solo il client proprietario conosce l'attuale stato di gioco (input di movimento, stato umanoide, ecc.), i parametri devono fluire dal client proprietario al server e poi a tutti gli altri client.
Impostazioni
Sotto StarterCharacterScripts, crea:
- Un LocalScript per animazioni client-side e gestione dei parametri.
- Un Script per replicazione server-side.
- Un RemoteEvent per comunicazioni client-server.
Script client
Il client proprietario gestisce i parametri dagli eventi di gioco e li invia al server periodicamente. Gli altri client leggono gli attributi replicati dallo script del server.
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
-- Carica il grafo delle animazioni
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Sostituisci con il tuo ID del grafo pubblicato
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- Leggi i parametri replicati dallo script del server
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
-- Giocatore locale: gestire i parametri dagli eventi di gioco
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- Esempio: guidare i parametri dallo stato umanoide
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- Invia i parametri al server a un ritmo fisso
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 server
Riceve parametri dal client proprietario, gestisce il grafo delle animazioni server-side e propaga valori come attributi per la replicazione ad altri client.
local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Carica lo stesso grafo delle animazioni sul server
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Stesso ID del grafo del client
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- Ricevi parametri dal client proprietario e replicali tramite attributi
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)
NPC
Poiché il server possiede l'animazione degli NPC, è necessaria solo la replicazione dal server al client. Gestisci il grafo delle animazioni sul server, scrivi i parametri come attributi su uno Script del server e leggili sui client utilizzando lo stesso pattern Instance.AttributeChanged mostrato sopra.
Latency
Altri client vedono animazioni con un piccolo ritardo equivalente all'intervallo di tick (fino a 50 ms a 20 Hz) più la latenza di rete. Puoi ridurre l'intervallo di tick aumentando la frequenza (ad esempio 1/30), a costo di un traffico di rete più elevato. 20 Hz è un valore predefinito ragionevole; la fusione delle animazioni è abbastanza indulgente da rendere difficili da notare piccoli ritardi.