Motion 1.5.1 — Timeline Editor (Animator)


Important Links

Roblox Store: Motion Roblox Store
Discord Development Server: Motion Development

What’s New in v1.5.0

  • Ghost Onions
  • Markers and Connecting Callbacks on Markers hit
MySequence:LinkMarkerAction("Explosion", function()
    -- anything here
end)
  • MGizmos (New Gizmo System)
    v1.5.0 Introduces a completely new gizmo system, that is more reliable, smoother, and better overall.
  • Instance Binding
    Sequences (animations) can now be bound dynamically to instances at runtime.
MySequence:BindInstance(TargetInstance, InstanceMotionID)
MySequence:Play()

This allows a single sequence to be reused across multiple objects without duplication.

  • Editor Enhancements
    • Cleaner timeline interactions
    • Improved track and channel handling
    • Better visual separation of lanes
    • General UX polish across the editor

What is Motion?

Motion isn’t a traditional animation editor.

It’s a timeline based Motion system designed for animating anything over time — parts, cameras, rigs, and properties with direct runtime control.

While most Roblox animation tools focus on character rigs and predefined animation formats, Motion treats animation as data. Every sequence is authored on a real timeline, previewed in Studio, and exported as raw Luau data for high-performance in-game playback.

Roadmap [ +1.5.0 ]

  • IK & constraint-based controls
  • Importing Keyframe Sequences & Motion Sequences
  • Further gizmo improvements
  • String property animation
  • Editor performance optimizations
  • Public documentation & examples

Complete List of shortcuts

to make the process of creating animations within Motion faster, I recommend using the shortcuts via Files > Customize Shortcuts

-- The complete shortcuts for v1.5.0
local Actions = {
        ["Play_Sequence"] = plugin:CreatePluginAction("Motion_PlaySeq", "Play a sequence", "Default: Space", "", true),
        ["Delete_Keyframe"] = plugin:CreatePluginAction("Motion_DeleteKeyFrame", "Delete a Keyframe", "Default: X", "", true),
        ["Create_KeyFrame"] = plugin:CreatePluginAction("Motion_CreateKeyFrame", "Creates a keyframe", "Default: I", "", true),
        ["To_Start"] = plugin:CreatePluginAction("Motion_ToStart", "Return to 0s", "Default: 0", "", true),
        ["Undo"] = plugin:CreatePluginAction("Motion_Undo", "Undo an action via history", "Default: Ctrl+Shift+Z", "", true),
        ["Redo"] = plugin:CreatePluginAction("Motion_Redo", "Redo an action via history", "Default: Ctrl+Shift+Y", "", true),
        ["Insert_Marker"] = plugin:CreatePluginAction("Motion_InsertMarker", "Insert a marker at current time", "Default: M", "", true),
        ["Toggle_OnionSkin"] = plugin:CreatePluginAction("Motion_OnionSkin", "Toggle Onion Skin", "Default: LCtrl + R", "", true),
    }

Motion is completely free at the moment, you can try it out now!


What makes Motion special to you?

  • Runtime engine
  • Curve Editor
  • UI/UX
  • Flexibility
0 voters

Developer API

If you want to control your sequences via script, use the Motion Runtime Engine.

View Full API Documentation

Initialization

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

Playing a Sequence

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

MySequence:Play()

Stopping a Sequence

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

MySequence:Play()

task.wait(2) -- a bit of delay

MySequence:Stop()

Pausing a Sequence

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

MySequence:Play()

task.wait(2)

MySequence:Pause()

Seeking (Rendering value at a specific time in a sequence)

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

MySequence:Seek(3) -- Applies all animations at the third second without playing

Checking if a sequence is completed

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

MySequence:Play()

MySequence.Completed:Connect(function()
    print("Completed!")
end)

Checking if a sequence is stopped

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)

MySequence:Play()

--optionally: stop it to check

MySequence:Stop()

MySequence.Stopped:Connect(function()
    print("Completed!")
end)

Binding an Instance

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)
MySequence:BindInstance(game.player.LocalPlayer.Character, nil) -- NOTE: 2nd parameter can not be set to nil, you must get the ID from the Motion sequence Module and paste it here

-- Also binding must happen before playing the sequence
MySequence:Play()

Linking a callback to a Marker

local Motion = require(game.ReplicatedStorage.Motion.Engine)
local Data = require(game.ReplicatedStorage.MySequence)

local MySequence = Motion.new(Data)
MySequence:LinkMarkerAction("KillPlayer", function() 
    -- logic goes here
end)

--Also linking an action to marker must happen before playing the sequence

MySequence:Play()
Advanced Features & Tips

Director Track

Director track is a special track that is generated automatically every project. Director Track is the track that controls the camera. You can create clips inside unlike normal tracks which are keyframe-based.

The Director Track has two properties fields Field Of View, and Roll, you can create keyframes and animate those normally.

To create a clip:

  1. Select the object you want to act as the camera, and hit the “+” button beside the director track
  2. By clicking on the clip, you can resize it by dragging the edges, and as well moving it by also dragging it.

IMPORTANT: Director track keyframes are relative to the clips, meaning when the runtime engine renders them, they will be rendered in relative time not global time. e.g., clip starts at 5s and ends 10s, and you have a keyframe at 5s, the keyframe is actually handles as if it’s at 1s because the start of the clip is at 1s, and so it will only render when its 5s

  1. The Eye Icon (toggleable) is for when you want to move your camera while animating, because when you play a sequence with director clips your camera is fixed at the object you created the clip with.

Curve Editor

The curve editor let’s you analyze and interact with numeric functions represented on a graph. This makes super amazing and cinematic when it you actually pair bezier curve interpolation along side it.

How to access the curve editor?

To access the curve editor you have two options:

  1. Hovering over View > Graph Editor
  2. Clicking the curved line icon along side the "+ Track+ button on the sidebar
    image

After loading the curve editor, you should see something like this:

Currently it’s empty because we have no real Motion Animation Tracks, So let’s add one.

I added a part as Motion Animation Track and added CFrame as a property and added a couple of keyframes:

Now back to our graph editor, and you will see a line like this:


For me it’s two lines because I animated two channels, X & RY.
Now you can click the handles and move the keyframes as much as you want.

Remember: Time is horizontal and Value is vertical. Meaning if you move the handles right or left, means you are increasing or decreasing the time, but on the other hand if you move the keyframe higher or lower, means you are increasing or decreasing the value of that channel

Now we can pick custom interpolation via Context menu by group selecting all keyframes and right clicking them

I choose Bezier curve interpolation, as linear is basically the lines we’ve just seen.
Once you pick Bezier interpolation, you can control the channel’s curve by the handles when selecting a keyframe


after editing:

Frequently Asked Questions (FAQ)

Q: Is Motion free?
Yes! Motion is completely free to use at this stage.

Q: Can I animate custom properties or only parts and rigs?
Motion can animate nearly any numeric property on any Roblox instance, including parts, cameras, rigs, colors, transparency, and more. Some string properties like .Text are still in progress.

Q: What interpolation methods does Motion support?
All Roblox’s native interpolations and custom ones like Bezier are supported.

Q: Is there a way to trigger events during animations?
Yes, you can add markers to your timeline and link callbacks using LinkMarkerAction.

Q: Can I import existing Roblox KeyframeSequences into Motion?
Importing is planned for an upcoming release, but not supported yet.

32 Likes

Seems cool, im gonna try it out now

Also you might have hit post too soon

2 Likes

oops… i’ll be fixing it right now

1 Like

And the page isn’t available :confused:

hmmmm? i don’t get what’s going on? can you explain?

Well when I open the first link Roblox just tell me it can’t find the page.

sorry, it seems like the banner wasn’t fully migrated to the newest link. It should work now!

1 Like

It indeed works now thanks you and sorry for the late answering.

1 Like

I haven’t mentioned UI but it can also animate UI elements along side rigs, parts and basically anything

this is really nice, but the plugin still have a lotta problems and need to be change:

  1. Can’t scroll with middle mouse unless you drag the scroller
  2. I dont really know if the auto is working but when i move, rotate, size, ect a part, it didn’t do anything.
  3. No importing option
  4. No loading animation API to an existed object
  5. Please add Ghost onion
  6. Everything feels a janky

i would love to use this plugin once you added/fixed them

2 Likes

thank you so much for your feedback! I’ll be working on all of the points you provided, but i don’t quite get point 6. do you mean the workflow is janky or some specific thing that needs to be modified or improved?

This is awesome, gonna peep it soon but does this have moon animator capabilities when it comes to importing animations, i think if this had it’s own form of animation events and what not this could be super awesome.

1 Like

Thank you for your feedback! Regarding the importing logic, currently it is not possible to import normal Roblox Keyframe sequence instances which many plugins like Moon Animator uses and also the Roblox Animation Editor. I will add support to importing keyframe sequences and also optimizing them.

As for the animation events, I’m actually creating Markers, those will act as normal animation events, but there will be a specific track type for events, that lets you plug in events and even custom logic without ever leaving the editor.

Sounds awesome, and of course my man! i can see this being SUPER useful later on down the line, especially if a form of addon support / an api is added to use along side people who have more niche things (dialogue, screenFX, etc)

1 Like

Thank you for your awesome suggestions @bloodntonic. And I plan on releasing all the suggestions you suggested really soon.

1 Like

Clicking the links to the model leads to a 404 page.

I had to create a new link. It should be working normally now.

Works now, this looks very interesting so I’ll be using this!

1 Like

Introducing Motion 1.5.0:

I know I didn’t release any updates since v1–but I added a lot of features so it made sense to call it v1.5

What’s new?

  1. Ghost onions as @baconcoolboysun suggested.
  2. Markers and Event Binding via MySequence:LinkMarkerAction() as @bloodntonic suggested
  3. Completely New Gizmos [ MGizmos ], giving you better controls and overall a better developer experience
  4. Binding via MySequence:BindInstance(). This let’s you play any sequence on any object which wasn’t possible before… e.x( playing a UI sequence )
  5. Improved DX, added icons for each track type and cleaned the layout
  6. Complete Support with all tween service easing styles and directions via Context Menu
  7. Track Actions such as deleting tracks or disabling them via Context Menu
  8. Fixed Auto-keying and now it should work as expected
  9. Added one more timeline-flow button (Rewind/Reverse Playback)
  10. Support for R15 Characters.

and yet with all of this, there’s more to come, like Addons support suggested by @bloodntonic, and Importing logic (which I’m working on right now) suggested by both @bloodntonic and @baconcoolboysun.

Credits

Easings.net helped me with the mathematical formulas of the tween service easing styles.
and obviously a lot of credits goes to the people who gave me feedbacks–I mentioned them a lot… can’t do it again…

Notes

Ghost onions has a shortcut (Ctrl + R) to enable it you have to add the shortcut yourself.
Marker’s shortcut is (M) and you have to do the same steps to enable them

    local Actions = {
        ["Play_Sequence"] = plugin:CreatePluginAction("Motion_PlaySeq", "Play a sequence", "Default: Space", "", true),
        ["Delete_Keyframe"] = plugin:CreatePluginAction("Motion_DeleteKeyFrame", "Delete a Keyframe", "Default: X", "", true),
        ["Create_KeyFrame"] = plugin:CreatePluginAction("Motion_CreateKeyFrame", "Creates a keyframe", "Default: I", "", true),
        ["To_Start"] = plugin:CreatePluginAction("Motion_ToStart", "Return to 0s", "Default: 0", "", true),
        ["Undo"] = plugin:CreatePluginAction("Motion_Undo", "Undo an action via history", "Default: Ctrl+Shift+Z", "", true),
        ["Redo"] = plugin:CreatePluginAction("Motion_Redo", "Redo an action via history", "Default: Ctrl+Shift+Y", "", true),
        ["Insert_Marker"] = plugin:CreatePluginAction("Motion_InsertMarker", "Insert a marker at current time", "Default: M", "", true),
        ["Toggle_OnionSkin"] = plugin:CreatePluginAction("Motion_OnionSkin", "Toggle Onion Skin", "Default: LCtrl + R", "", true),
    }

Lastly: I can proudly say that Motion 1.5 is stable and can be used normally.

4 Likes

this is awesome famalam, cant wait to see how far this goes if it has continued support :heart:

1 Like