Animation Tree | Blueprint-Driven Runtime Animation Editing

Animation Tree Plugin

Animation Tree is a node-based animation system for Roblox created by Crypto (ZDevZ12). I built it because Roblox’s default animator feels clunky and limits creative freedom. With Animation Tree you can visually blend, layer, and sequence your animations at runtime—no extra scripting.


General Overview

Imagine setting up a run-to-walk blend, an upper-body aim overlay, and a one-shot attack all in one graph. Animation Tree turns those ideas into nodes and wires, so you see and edit your animation flow directly. This accelerates your iteration loop, keeps your code cleaner, and empowers both programmers and animators to collaborate smoothly.


Installation & Setup

  1. Select your Character Model in the Explorer.
  2. Open the Plugins tab and click Insert Animation Tree. A new AnimationTree Module appears under Workspace.
  3. Select the AnimationTree instance to open the visual editor.
  4. Publish your AnimationClips and paste each asset ID into the node’s animation_id property.

Basic API Usage

-- Require and initialize
local AnimationTree = require(workspace.AnimationTree)
local tree = AnimationTree.new(characterModel)

– Start the animation graph
tree:start()

– Stop playback
tree:stop()

– Reset all joints to bind pose
tree:reset()

– Change a blend node at runtime
tree:set(“RunWalkBlend”, “blend_value”, 0.5)

– Read back a property
local fade = tree:get(“JumpOneShot”, “fadein_time”)

– Listen for marker events on any node
tree:GetMarkerReachedSignal(“Attack”)
:Connect(function(markerName, param)
print(“Attack marker:”, markerName, param)
end)

Node Attributes Reference

Attribute Type Description
animation_idnumberAsset ID of the AnimationClip
playbackstring"forward", "inverse", or "pingpong"
loopedboolWhether to loop when reaching the end
syncboolKeep playback in sync with parent node
additiveboolUse additive blending mode
fadein_timenumberFade-in duration (seconds)
fadeout_timenumberFade-out duration (seconds)
blend_valuenumberblend factor (0.0–1.0)
autorestartboolAuto-restart OneShot after finishing
autorestart_delaynumberDelay before restarting (seconds)
fireboolTrigger a OneShot node
activeboolEnable or disable OneShot playback

Real-World Examples

  • Run-Walk Transition: Bind your character’s speed variable to the blend_value of a Blend2 node. As speed changes, the node automatically interpolates between walk and run.
  • One-Shot Actions: Use OneShot nodes for shooting, jumping, or gesture animations. Set fire to true in code when the player triggers an action.
  • Additive Layers: Overlay an upper-body aim animation on top of a base locomotion cycle without creating separate clips.
  • Event-Driven Gameplay: Place markers in your animations for footstep sounds, particle bursts, or hit detection, and handle them with GetMarkerReachedSignal().

Why Animation Tree Makes Your Life Easier

  • Faster Iteration: No more juggling :LoadAnimation() calls—see your blend graph in Studio and tweak visually.
  • Cleaner Code: Your Lua scripts just toggle nodes and set parameters; the animation logic lives in the graph.
  • Team Collaboration: Artists can build and adjust the node tree while programmers focus on gameplay logic.
  • Scalability: Complex state machines and blend spaces become maintainable as your project grows.

What’s Next?

:dart: BlendSpace1D node arriving soon!
:world_map: Full BlendSpace2D support planned for v2.0


Cost

Free

Get It Today

Animation Tree


Join the Conversation

Got feedback or ideas? Join my Discord:
Crypto's Lab

Thank you for using Animation Tree—let’s build richer animations together!

146 Likes

This has to be one of the most complicated, yet satisfying ways to make your animations…

7 Likes

It’s not that complicated! You only need a couple of lines of code, once you learn how to use the tree you won’t stop using it!

1 Like

Are there any caveats to this? E.g. breaking replication, poor performance, difficult to integrate into an animation controller, etc.

What happens if you mix this approach with using the typical Roblox way of handling animations?

Also, how are you doing the animation blending?

5 Likes

Every day more I work to optimize the code.
There isn’t one thing right now that I think would hurt performance that much.

There is no replication because it would be a big charge to do it myself because every frame I have to send signals to the server, roblox has limits, you can’t do something like that i believe, I tried it once and roblox gave me a warning for excessive signals. There are other ways to do this but it is not necessary

if you want your animations to be seen on the server and client just run them on the server, If you want them to only be seen on the client, run them on the client.

The module is saved in a line of text, inside it contains a table that is ordered, the nodes that are connected to the output are its children And so on with the other nodes.

Each node has its functionality, so I had to make a recursive function that checks all the children and those children check their children. An interesting fact is that each branch/subbranch It has to end with animations, So I just went through the children of the children until I found animations and i applied the functionality of the parent nodes in this

It’s a bit summarized.

2 Likes

I’m sorry, but I’m not going to use this. I’d much rather wait for ROBLOX to release additive animations.
(The only reason I said this was because I was pinged)

1 Like

This system is not only for additive animations, it has other nodes like diff2 that gives you the difference from one animation to another,Or you can also edit the weight of a body part individually, you don’t have to edit the whole weight of the animation
you can do almost anything with this plugin.

1 Like

Does this work with custom characters? or non-characters as well? like rigging a box and animate it opening and closing.

Yes, this works with anything that has motors6d and a humanoidrootpart

2 Likes

This should definitely be available on default’s Roblox animation. Imagine expanding this even more into animating objects without rigs using only position, and rotation data.

2 Likes

Thanks for the mention, very nice stuff going on here.
I just skimmed through the post but im not seeing anything on if this would just “work”.
Does this modify the motor6ds or does it still use roblox’s animation system in the end?
Does it replicate automatically like default?
I’ll have to mess with this later.

I made my own animator that modifies the cframe of each part individually, so there is much more flexibility than using roblox’s load and play system, currently there is no replication, If you want to play animations and you want everyone to see them just run the script on the server, But if you just want to see them yourself, run them in the client… replication within roblox is great, but i can’t afford to send signals to the server every frame… Maybe look for some way to achieve this like create another animator on the server and send signals only when the client edits the nodes properties, I’ll add this to my to-do list, i Will think about it.

1 Like

Update!

Several big bugs have been fixed, I’ll try to test a plugin before posting it next time lmao
Fixed that when you changed the name of a node, it stopped working.
Fixed Sync button resetting on all nodes when exiting and re-entering the tree
Fixed some errors in the display of the character that caused you to not be able to rotate or move the camera
Now if you play the Tree on the client, the tree will run with RenderStepped, before it ran on server and client with Heartbeat.

Added a new node called “WeightScale”, with which you can edit the weight of a body part individually from the animation
Added “Additive” option in “OneShot” node, now you can play additive animations at any time you need
Added “Sync” option to all nodes with slider bar.
Added a skybox and a grid to the character display (I don’t really like the result but it looks better than before)
Added the :set_weight and :get_weight functions to the Animation Tree to make it easier to use the WeightScale node

The nodes are self-described, play with them and you won’t need to read documentation
The WeightScale node has two built-in buttons (+,-), the add button will add a new space where you can write the body part and its weight, and the subtract button will remove the last space created.

I decided not to add replication, since there are several ways to achieve this and the module is really easy to implement on your own replication system, so if you want to replicate your animations then I recommend you do this:

Place your tree in a place where all clients can see it
Send signals from your client to the server and from the server to other clients
In the signals you must send the configuration that you have changed
Each client must have a tree running with your character, every time they receive a signal from you, They should apply the configuration to their tree

Or you can simply run the tree from the server (which I would recommend this) but if your game is third person or you need speed in the animations I recommend replicating in the previous way

As I said, there are several ways to replicate and each way adapts to the style of your game.
My plugin was not built to replicate, it was built to make it easy to mix cframes, which are the animations.

Thanks to the people who have bought my plugin, please join my discord to help me find bugs and improve the project.

3 Likes

To blend my animations smoothly do i need to tween the value manually or this plugin do it for me?

I work on a game using chickynoid and the way you can replicate animations to other clients are so limited but with this resource, I feel like I could simplify a ton of work since I can directly edit animations with the nodes rather than having to replicate every tiny change.

I am purchasing this.

You simply give the data to the animation tree so that it is updated in the next frame.
I assume when you said tween you meant a fade, so a fade is available in the OneShot node, Otherwise you will have to edit the bar value yourself.

1 Like

I think I’ll add replication, replication is the only big problem I current have, I’ll be talking about it on the discord to find a solution.

No I was saying that, I find it easier to create my own replication systems now with this plugin, even if you added replication it wouldnt do anything for me as my character models are completely client sided, and the server just sends clients the animations currently playing so each client plays them on their copies of the characters.

error that appears when trying to play the one shot node
image

Enter my discord, I need more details