You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -27,12 +27,12 @@ Animation graphs is currently in Studio Beta. To enable, navigate to **File** >
27
27
28
28
To begin building logic for an animatable character, access the Animation Graph editor via the Avatar tab in the Studio ribbon. The following steps demonstrate how to initialize a rig and construct a basic node network using default walking and waving animations.
29
29
30
-
For a deeper dive into practical applications, you can explore the Animation Graph Reference File, which contains both foundational and complex implementation examples.
30
+
For a deeper dive into practical applications, you can explore the [Animation Graph Reference File](https://www.roblox.com/games/92493993350916/Animation-Graph-Editor-Simple-Demo), which contains both foundational and complex implementation examples.
31
31
32
32
To create your own animation graph, similar to the basic example provided in the reference, use the following steps:
33
33
34
34
1. In Studio, add an animatable rig by navigating to the Avatar tab and selecting **Character** > **My Avatar**.
35
-
2. Open the Animation Graph Editor by navigating to **Avatar**> **Anim Graph**.
35
+
2. Open the Animation Graph Editor by navigating to **Graph Editor**in Studio's **Avatar** tab.
36
36
37
37
<imgsrc="../assets/animation/graph-editor/Anim-Graph-Ribbon.png"width="60%"alt="Animation Graph Editor indicated in Studio's toolbar" />
38
38
@@ -127,40 +127,11 @@ For all nodes and [transitions](#transitions), the following rules apply by defa
127
127
- Nodes without custom event logic pass all events through unchanged; nodes that blend or select between inputs may scale the weight or block events from non-primary inputs (see per-node Event section).
128
128
- Marker events that reach the top of the graph can be observed via `Class.AnimationTrack:GetMarkerReachedSignal`.
129
129
130
-
### Transitions
131
-
132
-
Several nodes in the Animation Graph (such as **Select**, **Priority Select**, **Sequence**, and **Random Sequence**) manage how animations blend when switching between active inputs. To prevent redundancy in the node reference, these behaviors are defined by standardized transition property groups.
The baseline blending behavior applied to the node whenever it switches to a new active input.
141
-
<ul>
142
-
<li>**DefaultTransitionDuration** (Number): The time (in seconds) it takes to fully blend into the new pose.</li>
143
-
<li>**DefaultTransitionCurve** (`Enum.PoseEasingStyle`): The easing function applied during the blend. Currently only supports `Enum.PoseEasingStyle.Linear` and `Enum.PoseEasingStyle.CubicV2`.</li>
Input-specific link properties that supersede the Default Transition. These are applied when the node transitions <em>to</em> that specific input.
152
-
<ul>
153
-
<li>**TransitionOverrideDuration** (Number): Overrides the default transition duration.</li>
154
-
<li>**TransitionOverrideCurve** (`Enum.PoseEasingStyle`): Overrides the default transition curve. Currently only supports `Enum.PoseEasingStyle.Linear` and `Enum.PoseEasingStyle.CubicV2`</li>
A reference to an `Class.AnimationClip` asset. This serves as a leaf node in the graph, generating the raw animation data that is fed into other nodes for blending, selection, or modification.
134
+
A reference to an `Class.AnimationClip` asset. This serves as a leaf node in the graph, generating the raw animation data that feeds into other nodes for blending, selection, or modification.
164
135
165
136
<dl>
166
137
<dt>**Inputs**</dt>
@@ -232,7 +203,7 @@ A reference to an `Class.AnimationClip` asset. This serves as a leaf node in the
Evaluates a list of connected inputs from top to bottom and plays the first one whose condition evaluates to true. This allows for hierarchical animation selection based on specific logic. Whenever the current selection changes, it triggers a new [transition](#transitions).
274
245
@@ -313,7 +284,7 @@ Evaluates a list of connected inputs from top to bottom and plays the first one
Activates connected inputs in a specific sequential order based on defined wait conditions. Whenever the current selection changes, it triggers a new [transition](#transitions).
319
290
@@ -362,9 +333,9 @@ Activates connected inputs in a specific sequential order based on defined wait
Selects and plays one of its connected inputs at random. When the currently selected animation completes, the node randomly picks another input to play. Each input can be assigned a specific weight to influence the probability of it being chosen. Whenever the current selection changes, it triggers a new [transition](#transitions).
338
+
Selects and plays one of its connected inputs at random. When the currently selected animation completes, the node randomly picks another input to play. Assign each input a specific weight to influence the probability of it being chosen. Whenever the current selection changes, it triggers a new [transition](#transitions).
368
339
369
340
<dl>
370
341
<dt>**Inputs**</dt>
@@ -404,7 +375,7 @@ Selects and plays one of its connected inputs at random. When the currently sele
Layers the **Over** pose on top of the Base pose. When combined with a Mask node, masked-out joints in the **Over** pose reveal the **Base** pose entirely, creating a transparent overlay effect.
410
381
@@ -446,7 +417,7 @@ Layers the **Over** pose on top of the Base pose. When combined with a Mask node
Converts an animation into an additive pose by subtracting a relative base pose from the target pose ($A - B$). The result is attenuated by a specific **Weight** (unclamped).
489
460
@@ -520,7 +491,7 @@ Converts an animation into an additive pose by subtracting a relative base pose
Blends multiple animation poses together based on two input parameters within a 2D coordinate space. This generalizes the Blend1D node to handle complex scenarios, such as blending based on both movement direction and speed simultaneously.
574
545
@@ -633,7 +604,7 @@ Blends multiple animation poses together based on two input parameters within a
Applies a predefined mask to the input Pose. A mask is defined by a weight per object (e.g. joint) in the rig hierarchy, allowing for precise control or "feathering" of the animation.
639
610
@@ -685,7 +656,7 @@ Applies a predefined mask to the input Pose. A mask is defined by a weight per o
Represents the final evaluated pose of the graph. This node is automatically included in all new graphs in the Animation Graph Editor. Its presence ensures that the graph is always valid and consistently produces an animation pose.
727
698
@@ -740,3 +711,146 @@ Represents the final evaluated pose of the graph. This node is automatically inc
740
711
-**Event Emission:** This node serves as the exit point for the animation pipeline and does not emit signals back into the graph.
741
712
</dd>
742
713
</dl>
714
+
715
+
## Transitions
716
+
717
+
Several nodes in the Animation Graph (such as **Select**, **Priority Select**, **Sequence**, and **Random Sequence**) manage how animations blend when switching between active inputs. To prevent redundancy in the node reference, these behaviors are defined by standardized transition property groups.
The baseline blending behavior applied to the node whenever it switches to a new active input.
724
+
725
+
-**DefaultTransitionDuration** (number): The time (in seconds) it takes to fully blend into the new pose.
726
+
-**DefaultTransitionCurve** (`Enum.PoseEasingStyle`): The easing function applied during the blend. Currently only supports `Enum.PoseEasingStyle.Linear` and `Enum.PoseEasingStyle.CubicV2`.
Input-specific link properties that supersede the default transition. These are applied when the node transitions **to** that specific input.
733
+
734
+
-**TransitionOverrideDuration** (number): Overrides the default transition duration.
735
+
-**TransitionOverrideCurve** (`Enum.PoseEasingStyle`): Overrides the default transition curve. Currently only supports `Enum.PoseEasingStyle.Linear` and `Enum.PoseEasingStyle.CubicV2`
736
+
737
+
## Replication
738
+
739
+
Animation graph parameters are local to each `Class.AnimationTrack` and are not automatically replicated. This may change in future updates, but the currently recommended approach uses:
740
+
741
+
-**Client → Server**: A `Class.RemoteEvent` to send parameters from the owning client to the server at a fixed tick rate.
742
+
-**Server → Other Clients**: Instance **attributes** which automatically replicate to all clients.
743
+
744
+
### Player characters
745
+
746
+
A client script drives player characters. Since only the owning client knows the current gameplay state (movement input, humanoid state, etc.), parameters must flow from the owning client to the server and then to all other clients.
747
+
748
+
<h4>Setup</h4>
749
+
750
+
Under `Class.StarterCharacterScripts`, create:
751
+
752
+
- A `Class.LocalScript` for client-side animation and parameter driving.
753
+
- A `Class.Script` for server-side replication.
754
+
- A `Class.RemoteEvent` for client-to-server communication.
755
+
756
+
<h4>Client script</h4>
757
+
758
+
The owning client drives parameters from gameplay events and sends them to the server periodically. Other clients read replicated attributes from the server script instead.
Receives parameters from the owning client, drives the server-side animation graph, and propagates values as attributes for replication to other clients.
Since the server owns NPC animation, only server-to-client replication is needed. Drive the animation graph on the server, write parameters as attributes on a server Script, and read them on clients using the same `Class.Instance.AttributeChanged` pattern shown above.
853
+
854
+
### Latency
855
+
856
+
Other clients see animations with a small delay equal to the tick interval (up to 50 ms at 20 Hz) plus network latency. You can reduce the tick interval by increasing the frequency (such as 1/30), at the cost of higher network traffic. 20 Hz is a reasonable default; animation blending is forgiving enough that small delays are hard to notice.
0 commit comments