Visulie ─ A Novel, All-Purpose Animation, Data, and Effects Suite

I wouldn’t say it will never support bone rigs, but Visulie isn’t meant for your standard Motor6D or bone-rigged animation (you can use the default animation editor or Moon Animator for that). Visulie was designed around the premise that it should be used for atomic effects (effects that can last on their own) or to animate rigs without the use of physical components.

Essentially, Visulie is data-oriented, and the default Roblox animation is more physically oriented.

1 Like

Visulie 6.1.1

This is a new version! Please update your data and renderer!


Bug Fixes

  • Non-animatable instance classes are now flagged.

Features

  • You can now animate the “Camera”, Folder, and configuration instances (possible camera animation in the future? Planned, but not guaranteed).
  • New “LoadType” for animations. Read more below.

Changes

  • Slight changes to the internal signal soft disconnection behavior.
  • Loading/creating animations now restricts to one root instance, instead of many. This is a breaking change! Please read below.

:warning: VERY IMPORTANT! PLEASE READ!

In the previous Visulie versions, animations could have many “root” instances, meaning you could create/load animations with many top-level instances. For example, your animation layout may have looked like this:

Model
  └ Part1
      └ ParticleEmitter1
Part1
  └ ParticleEmitter2
Part2
  └ ParticleEmitter2

Notice how there are multiple different root instances (Model, Part1, Part2). When we want to load this animation, we have to write:

local NewAnimation = Visulie.loadAnimation(data, origin, {Model, Part1, Part2})

… which is long.

The new system restricts you to one root instance. In the case that some of your animations use multiple root instances, the version handler will add a folder to encapsulate everything together. The resulting updated hierarchy would look something like this (using the example from above):

Folder --> the version handler will add this
  └ Model
      └ Part1
          └ ParticleEmitter1
  └ Part1
      └ ParticleEmitter2
  └ Part2
      └ ParticleEmitter2

If you use loadAnimation, make sure to alter the code to reflect this change.

Why this change?

Loading animations was previously very verbose.

local NewAnimation = Visulie.loadAnimation(data, origin, {Model, Part1, Part2})

is much more cumbersome to write than:

local NewAnimation = Visulie.loadAnimation(data, origin, Root)

You’d have to get every single dependency, make sure they’re all named correctly, and hope for the best. The more common convention for animators is to provide a single dependent instance, and thus having multiple dependent instances breaks this convention.

There were also many implementation issues that I’ve run into when trying to design for multiple instances, and that “feature” (if you can even call it that) was becoming hard to maintain.


Load Types

This is a new feature added in Visulie V6. Essentially, it reduces the bulk of your animations by optimizing them in different ways. You can edit the load type on the bottom of the selection panel:

There are three possible load types:

Atomic - The same thing as before: it saves everything.

Dynamic - Saves all methods, attributes, tags, but only saves properties that have more than one keyframe.

Pose - Saves only CFrame values on BaseParts and Models. Does not save methods, attributes, or tags.

Note that the “Dynamic” and “Pose” load types cannot be used with .new(). When loading the animation back into the editor, you must provide a rig to load into.

Here’s an example use case. Look at this simple animation:

The serialized data has 1192 lines of code! This happens because we are saving literally everything, even the properties that aren’t being animated.

Since we only care about the limbs moving, we can set the loadType to “Pose”, which only saves CFrames from BaseParts and Models. When we serialize the animation now, we end up with only 269 lines (almost a 5x reduction)!

Using a bit of code, the shortened version plays exactly the same in-game!

local walkAnimation = require(script.Parent.Walk)
local Visulie = require(script.Parent.Visulie)

local Model = script.Parent.Beetle

local Walk = require(script.Parent.Visulie).loadAnimation(walkAnimation, CFrame.new(0, 5, 0), Model)
Walk.Loops = true
Walk:Resume()

To load an animation with loadType equal to “Pose” or “Dynamic”, select the animation module, then select the required rig:

2 Likes

Visulie 6.1.2

Bug fixes

  • Fixed keyframes at the end of the animation not showing up in the editor to rounding errors.
  • Fixed CFrame related keyframes being overridden

Hey! does this work with UI? also is robux a payment option, i currently only have that on me right now.

Yes, to both questions! You can animate UI pretty easily. Here’s a quick demo:

PM me and we can make arrangements for you to buy with robux.

1 Like

Hey, How exactly do you play the animation, cause im playing it on my uibutton and nothings happening though it does print in the playonce function when i added it.

Do you have a repo file? It should play if you set it up correctly.

I dont understand how to use the thing on the UI, Like what do the parameters mean in terms of UI properties, cause it doesnt have an origin or whatever

A proper documentation would help alot

If you mean instantiating the animation with .new, origin can be anything. Origin is there to place the objects with 3D properties somewhere. But since you’re animating UI, you can just set origin to any CFrame value, and it will work.

I can show you the snippet of code for your specific use case if you tell me what you want to do.

Just a simple increase size and change color on hover on a prexisting textbutton, not new

You can use .loadAnimation().

local ButtonAnimation = Visulie.loadAnimation(
    yourAnimationModule,
    CFrame.identity, —> could be any CFrame value 
    YourButton
}

ButtonAnimation:Resume()

Is it an issue that I cannot undo an accidental delete of an instance I’m animating?

Happened and was wondering if this was mentioned before.

Yes, unfortunately that’s the behavior… for now.

It’s extremely difficult to work on any undo feature. My only advice here is to periodically export your animation and load a previous save when you make a mistake.

I am planning to work on features that can alleviate cases like these, though.

2 Likes

Do you know about reflection service? If you don’t you should look into it.

Thanks for the suggestion!

Yes, I’ve looked into it.

Unfortunately, the service doesn’t really help me out (which is a bummer). Manual filtering of properties and instances are still required since similar properties (like CFrame and Position) still show up. Only CFrame is allowed for BaseParts, and only Position is allowed for GuiObjects.

Maybe in the future when Roblox adds a feature to filter duplicate properties out, it would prove to be of use.

1 Like

Visulie 6.1.3

Adjustments

  • Custom signal behavior is now immediate instead of deferred (but the plugin still requires deferred signaling for RBXScriptSignals).
  • Removed rounded corners for slightly more viewport space.

Bug fixes

  • Fixed bug where loading dynamic rigs with descendants not in data throws and error.
1 Like

Mister Visulie, Is there any other way to contact you to discuss payments?, Since Roblox Deleted PM’s

Honestly I’m not too sure. I guess replying here would be fine, too.

1 Like

Would you like to create a Discord? I feel like it would make communication much easier.

1 Like

Good suggestion!. I’ll consider making one if demand is higher.

2 Likes