Animationsgraph-Editor

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Der Animationsgraph-Editor ist ein visuelles, nodenbasiertes Tool, das technischen Künstlern und Animatoren ermöglicht, komplexe Animationslogik direkt innerhalb von Roblox Studio zu erstellen. Durch die Bereitstellung einer optimierten Benutzeroberfläche zur Erstellung von Verhaltensmustern wie Blend Trees entfernt es die herkömmliche Abhängigkeit von manuellem Skripting für die Charakterbewegung.

Dieses System funktioniert in Verbindung mit Ihrem bestehenden Animations-Workflow:

  • Animations-Editor: Verwenden Sie weiterhin den Animations-Editor als Ihr primäres Tool zum Erstellen einzelner Clips und zum Feinabstimmen von Keyframes und Kurven.
  • Animationsgraph-Editor: Nutzen Sie diesen neuen Arbeitsbereich, um diese Clips in einem Logikbaum zu organisieren, um anspruchsvolle Spielverhalten zu steuern.

Entwickelt, um die Zusammenarbeit zu verbessern, ermöglicht das visuelle Diagramm Entwicklern eine schnelle Inspektion, das Debugging und ein besseres Verständnis der von Animatoren erstellten Logik. Während sich Künstler auf die Verfeinerung interaktiver Bewegungen konzentrieren, können Entwickler weiterhin programmatisch auf die Animationsgraphknoten zugreifen, um direkte Kontrolle über gemischte Animationen und Zustände zu haben.

Erstellen eines Graphs


Um die Logik für einen animierbaren Charakter zu erstellen, greifen Sie über die Registerkarte Avatar im Studio-Band auf den Animationsgraph-Editor zu. Die folgenden Schritte zeigen, wie Sie ein Rig initialisieren und ein grundlegendes Knotennetzwerk unter Verwendung von Standard-Animations- und Wellenanimationen erstellen.

Für einen tieferen Einblick in praktische Anwendungen können Sie die Animationsgraph-Referenzdatei erkunden, die sowohl grundlegende als auch komplexe Implementierungsbeispiele enthält.

Um Ihren eigenen Animationsgraph zu erstellen, ähnlich dem einfaches Beispiel in der Referenz, befolgen Sie die folgenden Schritte:

  1. Fügen Sie im Studio ein animierbares Rig hinzu, indem Sie zur Avatar-Registerkarte navigieren und CharakterMein Avatar auswählen.

    Charaktertaste, die in der Werkzeugleiste von Studio hervorgehoben ist.
  2. Öffnen Sie den Animationsgraph-Editor, indem Sie zur Graph-Editor-Option in der Avatar-Registerkarte navigieren.

    Animationsgraph-Editor, der in der Werkzeugleiste von Studio angezeigt wird.
  3. Wählen Sie das animierbare Rig im 3D-Viewport aus und wählen Sie Graph erstellen.

  4. Klicken Sie im Graph-Editor mit der rechten Maustaste und wählen Sie Clip.

    Liste von Knoten im Kontextmenü
  5. Setzen Sie in dem neuen Clip-Knoten die Animations-ID.

    1. Wählen Sie das Dropdown-Menü Animations-ID.

    2. Um eine spezifische Animations-Asset-ID zu übermitteln, klicken Sie auf Importieren.

      Ein Feld im Animationsimportmodul, um die Animations-ID hinzuzufügen, wird angezeigt.
    3. Fügen Sie im Feld Animations-ID die Standard-Walk-Animation hinzu: 507777826.

    4. Wählen Sie Importieren.

  6. Fügen Sie einen weiteren Clip-Knoten hinzu, indem Sie die Schritte 4-5 mithilfe der Standard-Wave-Animation 507770239 wiederholen.

    Zwei Clip-Knoten mit einer ausgefüllten Animations-ID
  7. Klicken Sie im Graph-Editor mit der rechten Maustaste und wählen Sie Hinzufügen.

    Knoten hinzufügen
  8. Verbinden Sie die Clip-Knoten mit dem Add-Knoten, indem Sie den oberen rechten Ausgangsverbinder zum entsprechenden Port ziehen:

    1. Verbinden Sie den Clip-Knoten mit der Gehen-Animation mit dem Basis-Port.
    2. Verbinden Sie den Clip-Knoten mit der Wellenanimation mit dem Additive-Port.
    Beide Clip-Knoten, die mit dem Add-Knoten verbunden sind.
  9. Vom Add-Knoten verbinden Sie den oberen rechten Ausgangsverbinder mit dem Graph-Ausgabe-Pose-Port.

    Alle Knoten, die mit einem finalen Ausgabeknoten verbunden sind.
  10. (Optional) Weisen Sie Ihrer Speed-Variablen einen Parameter zu.

    1. Klicken und ziehen Sie den grünen Speed-Port in einen leeren Bereich. Ein neuer Parameter-Knoten wird angezeigt.

      Klicken und Ziehen des Verbinders vom Speed-Port des Clip-Knotens.
    2. Nutzen Sie im oberen linken Bereich des Graph-Editors das Parameter-Fenster, um Parameter schnell in Ihren Knoten zu ändern. Sie können auch programmgesteuert darauf zugreifen.

      Parameter-Fenster, Parameter-Knoten und Clip-Knoten, die gemeinsame Werte anzeigen.
  11. Testen Sie die Animation, indem Sie auf den Play-Button drücken.

    Das Play-Button-Symbol zum Vorschauen von Animationen.
  12. Versuchen Sie, verschiedene Gewichte, Geschwindigkeiten, Wiedergabemodi und andere Animationen zu testen. Für weitere Informationen zu einzelnen Knoten siehe die Knotenreferenz.

API-Integration

Die Erstellung und Bereitstellung eines Animationsgraphen erfolgt gemäß dem Standard-Animationspipeline von Roblox. Nachdem Sie ein Rig im Animationsgraph-Editor ausgewählt haben, wird ein neues AnimationGraphDefinition-Asset erstellt. Dieses Asset dient als Container für Ihre Knoten, Verbindungen und Parameter. Sobald Ihre Logik abgeschlossen ist, veröffentlichen Sie den Graph, um eine Standard-Asset-ID zu erhalten.

In Ihren Skripten interagieren Sie mit diesen Graphen, indem Sie sie auf ein Animator laden, wie Sie es mit einer herkömmlichen Animation tun würden. Um die interne Logik des Graphen zu steuern, verwenden Sie AnimationTrack:SetParameter(), um Echtzeitwerte - wie Bewegungsgeschwindigkeiten oder Zustandsbooleans - direkt in die Variablen des Graphen zu übergeben.


local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- Ihre veröffentlichte Graph-ID
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- Dynamische Parameteraktualisierungen über RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)

Knotenreferenz

Jeder Animationsgraphknoten fungiert als Logikgitter oder Datenquelle, die Animationsdaten verarbeitet, bevor sie das Charakter-Rig erreicht. Dieser Abschnitt bietet eine technische Aufschlüsselung der funktionalen Blöcke innerhalb des Animationsgraph-Editors. Alle Knoten geben derzeit eine Animationspose aus.

Jeder Knotenteil enthält:

  • Definition – Eine Zusammenfassung des Zwecks und der Rolle des Knotens innerhalb des Graphen.
  • Eingaben – Die Datenströme, die in den Knoten gelangen. Mehrere Eingaben werden als Input1, Input2, ..., InputN dargestellt.
  • Eigenschaften der Eingaben – Einstellungen, die direkt an eine bestimmte Eingabe gebunden sind (eine Idle-Eingabe, die einer Position von 0,5 auf einem Blend1D-Knoten zugewiesen ist).
  • Ereignisdaten – Ereignisse, die von dem Knoten ausgegeben oder konsumiert werden, um interne Graphlogik oder externe Luau-Skripte auszulösen. Dieses Verhalten kann sich im Verlauf der Beta-Entwicklung ändern.

Globale Ereignisregeln

Für alle Knoten und Transitions gelten standardmäßig die folgenden Regeln:

  • Ereignisse propagieren sich von ihrem Quellknoten durch den Graphen nach oben. Jedes Ereignis trägt ein Gewicht, das den Einfluss seiner Quelle im finalen Mix darstellt. Wenn das Gewicht zu irgendeinem Zeitpunkt auf null sinkt, wird das Ereignis stummgeschaltet.
  • Knoten ohne benutzerdefinierte Ereignislogik geben alle Ereignisse unverändert weiter; Knoten, die zwischen Eingaben mischen oder auswählen, können das Gewicht skalieren oder Ereignisse von nicht-priorisierten Eingaben blockieren (siehe Knotenspezifische Ereignisse).
  • Markerereignisse, die den oberen Teil des Graphen erreichen, können über AnimationTrack:GetMarkerReachedSignal() beobachtet werden.

Clip

Clip-Knoten

Eine Referenz zu einem AnimationClip-Asset. Dies dient als Blattknoten im Graph, der die Rohanimationsdaten generiert, die in andere Knoten für das Mischen, die Auswahl oder die Modifikation einfließen.

Eingaben
  • Keine
Eigenschaften
EigenschaftTypBeschreibung
ClipAsset-IDDas Animations-Asset, das abgespielt werden soll (z. B. rbxassetid://12345).
PlayModeEnum.AnimationNodePlayMode

Definiert das Verhalten des Clips, sobald er das Ende seiner Dauer erreicht.

  • Schleifen (Standard): Startet automatisch von vorne, sobald der Clip endet.
  • PingPong: Spielt von Anfang bis Ende und spielt dann sofort rückwärts von Ende zu Anfang.
  • Einmal und Halten: Spielt einmal und behält die finale Pose nach Abschluss bei.
  • Einmal und Zurücksetzen: Spielt einmal und springt nach Abschluss sofort zurück zur ursprünglichen Startpose.
RückwärtsBooleanSteuert die Richtung der Wiedergabe.
GeschwindigkeitNumberEin Multiplikator für die Wiedergabegeschwindigkeit. 0.0 pausiert den Graph, 1.0 ist normale Geschwindigkeit und 2.0 ist doppelte Geschwindigkeit.
TrimBooleanLegt fest, ob die Dauer des Clips verkürzt werden soll.
TrimStartNumberDer absolute Zeitstempel (in Sekunden), an dem die Wiedergabe beginnen soll.
TrimEndNumberDer absolute Zeitstempel (in Sekunden), an dem die Wiedergabe enden soll.
Ereignisdaten
  • Ereignisbehandlung: Keine. Dies ist ein Blattknoten ohne Kinder.
  • Ereignisausgabe: Liest benutzerdefinierte Marker aus dem Animationsclip (z. B. "Footstep", "WeaponSwing") und gibt sie als benannte Ereignisse genau zu dem Zeitpunkt aus, an dem sie auftreten. Wenn der Clip verkürzt wird, werden nur Marker innerhalb des definierten [TrimStart, TrimEnd]-Intervalls (einschließlich) ausgegeben.

Select

Select-Knoten

Wählt zwischen beliebig vielen Eingaben über die Auswahl-Eigenschaft. Wann immer die aktuelle Auswahl gewechselt wird, löst dies eine neue Transition aus.

Eingaben
  • Input1...InputN
Eigenschaften
EigenschaftTypBeschreibung
AuswahlStringDie eindeutige ID der zu wählenden Eingabe, die mit dem Namen der Eingabeverbindung übereinstimmt (z. B. "Walk").
Ereignisdaten
  • Ereignisbehandlung: Ereignisse von der aktuell ausgewählten Eingabe werden unverändert weitergegeben.
  • Ereignisausgabe: Gibt nur alle Ereignisse von der aktuell ausgewählten Eingabe aus. Während einer Transition folgt die Ereignisausgabe den globalen Ereignisregeln.

PrioritySelect

PrioritySelect-Knoten

Bewertet eine Liste verbundener Eingaben von oben nach unten und spielt die erste, deren Bedingung sich als wahr evaluiert. Dies ermöglicht eine hierarchische Animationsauswahl basierend auf spezifischer Logik. Wann immer die aktuelle Auswahl gewechselt wird, löst dies eine neue Transition aus.

Eingaben
  • Input1...InputN
    • Trigger (Boolean): Eine logische Bedingung, die erfüllt sein muss, damit diese Eingabe aktiviert wird. In aktuellen Versionen ist diese an einen booleschen Parameter angeschlossen.
    • Unterbrechbar (Enum.AnimationNodeInterruptible): Definiert die Regel, wann diese aktive Animation von einer höherpriorisierten Eingabe unterbrochen werden kann.
      • Immer (Standard): Die Eingabe kann jederzeit von einer höherpriorisierten Bedingung unterbrochen werden.
      • Fertig: Die aktuelle Animation muss ihre Wiedergabe beenden, bevor eine höherpriorisierte Eingabe übernehmen kann.
      • Trigger: Die Eingabe ist nur unterbrechbar, wenn der InterruptibleTrigger auf wahr gesetzt ist.
    • InterruptibleTrigger (Boolean): Nur verfügbar, wenn Unterbrechbar auf Trigger gesetzt ist. Die Eingabe kann unterbrochen werden, wenn dieser spezifische Ausdruck wahr ist.
Eigenschaften
EigenschaftTypBeschreibung
DefaultInterruptibleEnum.AnimationNodeInterruptibleDie grundlegende Unterbrechungsregel, die auf alle Eingaben angewendet wird. Jede Eingabe kann dies mit ihrer eigenen Unterbrechbar-Eigenschaft überschreiben.
DefaultInterruptibleTriggerBooleanDer grundlegende Triggerwert, der verwendet wird, wenn der aufgelöste Modus einer Eingabe Unterbrechbar ist. Jede Eingabe kann dies mit ihrer eigenen InterruptibleTrigger-Eigenschaft überschreiben.
Ereignisdaten
  • Ereignisbehandlung: Ereignisse von der aktuell ausgewählten Eingabe werden unverändert weitergegeben.
  • Ereignisausgabe: Gibt nur alle Ereignisse von der aktuell ausgewählten Eingabe aus. Während einer Transition folgt die Ereignisausgabe den globalen Ereignisregeln.

Sequence

Sequence-Knoten

Aktiviert verbundene Eingaben in einer bestimmten Reihenfolge basierend auf definierten Wartebedingungen. Wann immer die aktuelle Auswahl gewechselt wird, löst dies eine neue Transition aus.

Eingaben
  • Input1...InputN
    • WaitFor (Enum.AnimationNodeWaitFor): Gibt die Bedingung an, die erfüllt sein muss, bevor die Sequenz zur nächsten Eingabe übergeht.
      • Fertig (Standard): Geht zur nächsten Eingabe über, wenn die aktuelle Eingabe einen Zyklus abgeschlossen hat. Das Vorwärtsverhalten hängt von der angeschlossenen Eingabe ab:
        • Einmal abgespielter Clip: Geht über, wenn der Clip endet.
        • Looping-Clip: Geht über, nachdem ein kompletter Loop abgeschlossen ist.
        • Sequenz mit unendlichen Schleifen: Geht über, nachdem ein voller Zyklus durch alle Eingaben abgeschlossen ist.
        • Sequenz mit unendlichen Schleifen: Geht über, nachdem alle Schleifen abgeschlossen sind.
      • Trigger: Aktiviert die nächste Eingabe, wenn ein benutzerdefinierter logischer Ausdruck wahr wird.
    • WaitForTrigger (Boolean): Nur verfügbar, wenn WaitFor auf Trigger gesetzt ist.
Eigenschaften
EigenschaftTypBeschreibung
LoopCountNumberAnzahl der Durchläufe durch die gesamte Sequenz (Standardwert ist 1). Ein Wert von 0 bedeutet, dass es sich um eine unendliche Schleife handelt. Sobald die Anzahl erreicht ist, respektiert der Knoten die Schleifen- oder Halteleiseneinstellung der letzten Eingabe.
DefaultWaitForEnum.AnimationNodeWaitForDie grundlegende Wartebedingung, die auf alle Eingaben angewendet wird. Jede Eingabe kann dies mit ihrer eigenen WaitFor-Eigenschaft überschreiben.
Ereignisdaten
  • Ereignisbehandlung: Ereignisse von der aktuell aktiven Eingabe werden unverändert weitergegeben.
  • Ereignisausgabe: Gibt nur alle Ereignisse von der aktuell aktiven Eingabe in der Sequenz aus. Während einer Transition folgt die Ereignisausgabe den globalen Ereignisregeln.

RandomSequence

Random Sequence-Knoten

Wählt zufällig eine der angeschlossenen Eingaben aus und spielt sie ab. Wenn die aktuell ausgewählte Animation abgeschlossen ist, wählt der Knoten zufällig eine andere Eingabe zum Abspielen aus. Weisen Sie jeder Eingabe ein spezifisches Gewicht zu, um die Wahrscheinlichkeit ihrer Auswahl zu beeinflussen. Wann immer die aktuelle Auswahl gewechselt wird, löst dies eine neue Transition aus.

Eingaben
  • Input1...InputN
    • Weight (Number): Bestimmt die Wahrscheinlichkeit, dass diese Eingabe ausgewählt wird; höhere Gewichte erhöhen die Auswahrscheinlichkeit.
Eigenschaften
EigenschaftTypBeschreibung
PlayCountNumberDie Anzahl der Eingaben, die der Knoten durchspielen wird, bevor er stoppt. Ein einmal erreichtes Maß respektiert die Schleifen- oder Halteleiseneinstellung der letzten Eingabe. Standard ist 0 für unendlich.
SeedNumberEin Wert, der verwendet wird, um den Zufallszahlengenerator (RNG) zu initialisieren und sicherzustellen, dass die Sequenz konsistent über verschiedene Clients bleibt. Standardwert ist -1 für einen zufälligen Seed.
Ereignisdaten
  • Ereignisbehandlung: Ereignisse von der aktuell aktiven Eingabe werden unverändert weitergegeben.
  • Ereignisausgabe: Gibt nur alle Ereignisse von der aktuell aktiven Eingabe in der Sequenz aus. Während einer Transition folgt die Ereignisausgabe den globalen Ereignisregeln.

Over

Over-Knoten

Überlagert die Over-Pose auf die Basis-Pose. In Kombination mit einem Maskenknoten können maskierte Gelenke in der Over-Pose die Basis-Pose vollständig enthüllen und so einen transparenten Überlagerungseffekt erzeugen.

Eingaben
  • Basis: Die Hintergrund- oder unterste Ebene, typischerweise eine Ganzkörperanimation wie Fortbewegung oder einen Idle-Zustand.
  • Über: Die Vordergrund- oder oberste Ebene, die über die Basis angewendet werden soll, wie eine Handgeste oder eine Toolnutzung-Animation.
Eigenschaften
EigenschaftTypBeschreibung
GewichtNumberDas Mischgewicht, das verwendet wird, um die Over-Pose abzuschwächen. Standard ist 1.0 (vollständige Überlagerung) und ist nicht begrenzt.
Ereignisdaten
  • Ereignisbehandlung:
    • Der Knoten hört auf Ereignisse von sowohl der Basis- als auch der Über-Eingabe.
  • Ereignisausgabe:
    • Basis-Ereignisse: Alle Ereignisse von der Basiseingabe werden unverändert weitergegeben.
    • Über-Ereignisse: Ereignisse von der Über-Eingabe werden durch die Gewichtungseigenschaft skaliert.
      • Bei Gewicht 0.5 propagieren Über-Ereignisse mit halbem Gewicht.
      • Bei Gewicht 0 sind sie stummgeschaltet.

Add

Add-Knoten

Fügt die Additive-Pose zur Basis-Pose hinzu, abgeschwächt um ein bestimmtes Gewicht (nicht begrenzt).

Eingaben
  • Basis: Die primäre Animationspose.
  • Additiv: Die Pose, die auf die Basis angewendet werden soll.
Eigenschaften
EigenschaftTypBeschreibung
GewichtNumberBestimmt die Stärke der additive Pose, die auf die Basis angewendet wird.
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf Ereignisse von sowohl der Basis- als auch der Additive-Eingabe.
  • Ereignisausgabe: Alle Ereignisse von sowohl der Basis- als auch der Additive Eingabe werden unverändert weitergegeben.

Subtract

Subtract-Knoten

Konvertiert eine Animation in eine additive Pose, indem eine relative Basispose von der Zielpose subtrahiert wird (ABA - B). Das Ergebnis wird um ein spezifisches Gewicht (nicht begrenzt) abgeschwächt.

Eingaben
  • A: Die Zielanimationspose.
  • B: Die relative Basispose, die abgezogen werden soll.
Eigenschaften
EigenschaftTypBeschreibung
GewichtNumberBestimmt die Stärke des Subtraktionseffekts, der auf das Ergebnis angewendet wird.
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf Ereignisse von sowohl Input A als auch Input B.
  • Ereignisausgabe: Alle Ereignisse von sowohl Input A als auch Input B werden unverändert weitergegeben.

Blend1D

Blend1D-Knoten

Interpoliert linear zwischen den beiden Animationsposen, die der aktuellen Eingabeposition entlang einer einzigen Achse am nächsten sind.

Eingaben
  • Input1...InputN
    • Position (Number): Die spezifische Koordinate für jede nachfolgende Eingabe auf der Mischachse.
Eigenschaften
EigenschaftTypBeschreibung
PositionNumberDer aktuell aktive Wert auf der Mischachse, der verwendet wird, um die Animationen abzutasten. Wenn die Position außerhalb des definierten Bereichs der Eingabepositionen liegt, extrapoliert der Knoten anhand der zwei nächstgelegenen Eingaben.
PhaseSyncEnum.AnimationNodePhaseSync

Konfiguriert, ob die Zeitabstände der Kindereingaben synchronisiert werden sollen.

  • Synchronisiert (Standard): Normalisierte Synchronisation. Der Knoten berechnet eine „virtuelle Dauer“ basierend auf dem gewichteten Durchschnitt aktiver Eingaben. Die Zeitstufen jedes Eingabeknotens werden angepasst, damit alle Kinder zur gleichen Phase konvergieren, sodass Animationen unterschiedlicher Längen synchron bleiben.
  • Nicht synchronisiert: Standardmischung, bei der Clips unabhängig voneinander in ihren eigenen Wiedergabegeschwindigkeiten voranschreiten.
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf Ereignisse von allen aktuell aktiven Kindknoten.
  • Ereignisausgabe: Nur Ereignisse von der aktivsten Eingabe mit dem höchsten Gewicht werden weitergegeben, skaliert durch ihr Mischgewicht. Ereignisse von der sekundären Eingabe sind stummgeschaltet.

Blend2D

Blend2D-Knoten

Mischt mehrere Animationsposen basierend auf zwei Eingabeparametern innerhalb eines 2D-Koordinatenraums. Dies generalisiert den Blend1D-Knoten, um komplexe Szenarien zu behandeln, wie das Mischen basierend auf sowohl Bewegungsrichtung als auch Geschwindigkeit gleichzeitig.

Eingaben
  • Input1...InputN
    • X (Number): Die X-Koordinate für jede nachfolgende Eingabe.
    • Y (Number): Die Y-Koordinate für jede nachfolgende Eingabe.
Eigenschaften
EigenschaftTypBeschreibung
InputModeEnum.AnimationNodeBlend2DInputMode

Definiert das Koordinatensystem, das zur Bewertung des Mischbereichs verwendet wird:

  • Karthesisch (Standard): Verwendet standardisierte 2D-Gitterkoordinaten. X und Y repräsentieren die aktuelle Position innerhalb des Mischraums.
  • Polar: Verwendet Winkel- und Magnitudenwerte. X repräsentiert die Richtung in Bogenmaß, während Y die Magnitude oder Stärke der Bewegung darstellt. Die Richtung wird stärker gewichtet als die Magnitude, sodass Eingaben bei ähnlichen Winkeln, aber unterschiedlichen Magnituden glatter gemischt werden als Eingaben bei unterschiedlichen Winkeln.
XNumberDie aktuelle X-Koordinate (karthesisch) oder Richtung in Bogenmaß (polar).
YNumberDie aktuelle Y-Koordinate (karthesisch) oder Magnitude (polar).
PhaseSyncEnum.AnimationNodePhaseSync

Konfiguriert, ob die Zeitabstände der Kindereingaben synchronisiert werden sollen.

  • Synchronisiert (Standard): Normalisierte Synchronisation. Der Knoten berechnet eine „virtuelle Dauer“ basierend auf dem gewichteten Durchschnitt aktiver Eingaben. Die Zeitstufen jedes Eingabeknotens werden angepasst, damit alle Kinder zur gleichen Phase konvergieren, sodass Animationen unterschiedlicher Längen synchron bleiben.
  • Nicht synchronisiert: Standardmischung, bei der Clips unabhängig voneinander in ihren eigenen Wiedergabegeschwindigkeiten voranschreiten.
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf Ereignisse von allen aktuell aktiven Kindknoten.
  • Ereignisausgabe: Nur Ereignisse von der aktivsten Eingabe mit dem höchsten Gewicht werden weitergegeben, skaliert durch ihr Mischgewicht. Ereignisse von der sekundären Eingabe sind stummgeschaltet.

Mask

Masken-Knoten

Wendet eine vordefinierte Maske auf die Eingabepose an. Eine Maske wird durch ein Gewicht pro Objekt (z. B. Gelenk) in der Rig-Hierarchie definiert, was eine präzise Kontrolle oder "Verblassung" der Animation ermöglicht.

Eingaben
  • Pose: Die Animationspose, die maskiert werden soll.
Eigenschaften
EigenschaftTypBeschreibung
MaskeObjectValue

Ein ObjectValue (erstellt als direktes Kind der Masken AnimationNodeDefinition), das die Maskengewichte definiert. Es kann auf zwei Arten funktionieren:

  • Direkt: Der ObjectValue enthält Attribute, die Rig-Objektnamen spezifischen Gewichtswerten zuordnen.
  • Referenz: Der ObjectValue verweist auf eine andere Instance, die die Zuordnungsattribute enthält. Dies ermöglicht die gemeinsame Nutzung von Masken über verschiedene Knoten im Graph.

Bei der Erstellung einer Maske können Sie ein Rig-Schema (HumanoidRigDescription oder Picker) auswählen, um die Hierarchie auszufüllen.

  • HumanoidRigDescription: Standardisiert die Maske für humanoide Charaktere.
  • Picker: Ermöglicht dem Benutzer die Auswahl eines bestimmten Rigs im Arbeitsbereich, um die Maskenhierarchie zu füllen.
InvertierenBooleanWenn wahr, werden die Gewichtwerte als 1 - Gewicht angewendet. Dadurch kann eine Maske umgekehrt wiederverwendet werden, ohne ein neues Asset zu erstellen.
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf alle Ereignisse von der Eingabe Pose.
  • Ereignisausgabe: Alle Ereignisse von der Eingabe Pose werden unverändert weitergegeben.

Speed

Speed-Knoten

Modifiziert die Wiedergabegeschwindigkeit einer eingehenden Animationspose.

Eingaben
  • Pose: Die Animationspose oder der Untergraph, dessen Wiedergabegeschwindigkeit geändert werden soll.
Eigenschaften
EigenschaftTypBeschreibung
SpeedNumberEin Multiplikator, der auf den Zeitdelta (dtdt) angewendet wird. 0.0 pausiert den Graph, 1.0 ist normale Geschwindigkeit und 2.0 ist doppelte Geschwindigkeit.
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf Ereignisse von der Eingabe Pose.
  • Ereignisausgabe: Alle Ereignisse von der Eingabe Pose werden unverändert weitergegeben. Beachten Sie, dass, obwohl die visuelle Wiedergabegeschwindigkeit geändert wird, die Zeitpunkte der ausgegebenen Ereignisse (wie Marker) entsprechend mit der geänderten Wiedergabegeschwindigkeit skaliert werden.

GraphOutput

GraphOutput-Knoten

Stellt die endgültige bewertete Pose des Graphen dar. Dieser Knoten ist automatisch in allen neuen Graphen im Animationsgraph-Editor enthalten. Seine Präsenz stellt sicher, dass der Graph immer gültig ist und konsistent eine Animationspose erzeugt.

Eingaben
  • Pose: Die final verarbeiteten Animationsdaten, die auf das Rig angewendet werden sollen.
Eigenschaften
  • Keine
Ereignisdaten
  • Ereignisbehandlung: Der Knoten hört auf alle Ereignisse, die durch die zuletzt verbundene Eingabe weitergegeben werden.
  • Ereignisausgabe: Dieser Knoten dient als Austrittspunkt für die Animationspipeline und gibt keine Signale zurück in den Graphen aus.

Transitionen

Mehrere Knoten im Animationsgraph (wie Select, Priority Select, Sequence und Random Sequence) verwalten, wie Animationen gemischt werden, wenn zwischen aktiven Eingaben gewechselt wird. Um Redundanz in der Knotenreferenz zu vermeiden, werden diese Verhaltensweisen durch standardisierte Gruppen von Übergangseigenschaften definiert.

Standardübergang

Standardübergang

Das zugrunde liegende Mischverhalten, das auf den Knoten angewendet wird, wann immer er zu einer neuen aktiven Eingabe wechselt.

Übergangsüberschreibung

Übergangsüberschreibung

Eingabespezifische Linkeigenschaften, die den Standardübergang überschreiben. Diese werden angewendet, wenn der Knoten zu dieser spezifischen Eingabe wechselt.

Replikation

Animationsgraphparameter sind lokal für jede AnimationTrack und werden nicht automatisch repliziert. Dies kann sich in zukünftigen Updates ändern, aber der derzeit empfohlene Ansatz verwendet:

  • Client → Server: Ein RemoteEvent, um Parameter vom besitzenden Client zum Server mit einer festen Tickrate zu senden.
  • Server → Andere Clients: Instanz Attribute, die automatisch an alle Clients repliziert werden.

Spielercharaktere

Ein Client-Skript steuert die Spielercharaktere. Da nur der besitzende Client den aktuellen Gameplay-Zustand (Bewegungseingabe, humanoider Zustand usw.) kennt, müssen Parameter vom besitzenden Client zum Server und dann zu allen anderen Clients fließen.

Setup

Erstellen Sie unter StarterCharacterScripts:

  • Ein LocalScript für animation-clientseitige und parametersteuernde Skripte.
  • Ein Script für serverseitige Replikation.
  • Ein RemoteEvent für die Client-zu-Server-Kommunikation.

Client-Skript

Der besitzende Client steuert Parameter von Gameplay-Ereignissen und sendet diese periodisch an den Server. Andere Clients lesen replizierte Attribute vom Server-Skript.


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
-- Lade den Animationsgraphen
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Ersetzen Sie durch Ihre veröffentlichte Graph-ID
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- Lese replizierte Parameter vom Server-Skript
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
-- Lokaler Spieler: steuere Parameter von Gameplay
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- Beispiel: steuere Parameter vom humanoiden Zustand
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- Sende Parameter an den Server mit fester Tickrate
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)

Server-Skript

Empfängt Parameter vom besitzenden Client, steuert den serverseitigen Animationsgraphen und propagiert Werte als Attribute zur Replikation an andere Clients.


local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Lade denselben Animationsgraphen auf dem Server
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Dieselbe Graph-ID wie beim Client
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- Empfange Parameter vom besitzenden Client und repliziere sie über Attribute
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

Da der Server die Animation von NPCs steuert, ist nur eine Server-zu-Client-Replikation erforderlich. Steuern Sie den Animationsgraphen auf dem Server, schreiben Sie die Parameter als Attribute in ein Server-Skript und lesen Sie sie auf Clients mit demselben Muster Instance.AttributeChanged, das oben gezeigt wurde.

Latenz

Andere Clients sehen Animationen mit einer kleinen Verzögerung, die dem Tick-Intervall (bis zu 50 ms bei 20 Hz) zuzüglich der Netzwerk-Latenz entspricht. Sie können das Tick-Intervall verringern, indem Sie die Frequenz erhöhen (z. B. 1/30), was jedoch zu höherem Netzwerkverkehr führt. 20 Hz ist ein vernünftiger Standard, da das Mischen von Animationen ausreichend flexibel ist, dass kleine Verzögerungen schwer zu bemerken sind.

©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.