The Animation Editor is fine, most people just use it wrong
Starting from scratch in Roblox Studio Animation usually means opening the Animation Editor, creating a new animation, and then wrestling with keys until something vaguely resembles a walk cycle. It works if you're patient. The real problem isn't learning the interface, it's understanding how priorities and tracks actually interact once the animation hits the game. Here is the practical sequence I go through every time. Open the Animation Editor window. Click New Animation. You get a blank dummmy with a timeline. Before you do anything else, check the track list on the left side. It will include all the default body part tracks. Delete the ones you do not need immediately, or you are going to accidentally override something later and spend twenty minutes figuring out why the character is flickering. Keyframing is straightforward. Go to frame 0, pose the character, click the keyframe button or press K. Move to a later frame, change the pose, keyframe again. The editor interpolates between the two. That interpolation is where most people's animations look wrong. The default easing is linear, which makes movement feel robotic. Switch the interpolation mode on individual tracks to ease-in-out if you want natural acceleration. Do it for every transform track, not just the root.
Priority is the thing nobody gets right on the first try
AnimationPriority controls what wins when two animations try to play at the same time. Action has the highest priority, Movement is lower, Idle is the lowest of the standard presets. If you export an animation without thinking about this, it might get overridden by the default walk animation even though you wanted it to play over it. Set the priority at the moment you save the animation asset. The default is Action, which is fine for attacks but wrong for most ability animations. I ran into a specific issue last year with a multi-hit combo system. Each hit was its own animation track, but they were all set to Action priority. When hit two triggered during hit one, the engine did not blend them, it cut hit one abruptly and restarted hit two from frame zero. The result looked like the character had a seizure for half a second. The fix was to set all combo animations to Core priority instead and use a cooldown flag in the script so a new hit could not start until the current animation reached sixty percent completion. That gave you natural overlap without the hard cut. Took me about three hours to realize that was the actual problem instead of hunting through rendering issues for a day.
Exporting and applying in a project
Save the animation through the toolbar button. It uploads to Roblox and gets an ID. In your script, load it with LoadAnimation, pass it to an Animator object, then call Play. That is the simple version. The version that actually works in production involves preloading animations so the game does not stutter the first time they trigger. Put a loop in your loading script that plays each animation for one frame, then stops it. Takes about two seconds for a library of twelve moves. Animatables are required for this to function. The object you are animating needs an Animator instance as a child. Without it, LoadAnimation returns nil and you will spend time wondering why nothing happens before you remember this step.
Get the Full Details

Common pitfalls and what actually works around them
Keyframe count matters more than you think. Every extra keyframe adds to the animation data size and increases network traffic if you are replicating it across clients. A clean run cycle can be done in sixteen to twenty-four frames. Anything beyond that without adding new poses is just noise. I keep animations under thirty keys unless there is a specific reason to go further, and even then thirty-five is usually the practical ceiling. Baking transforms into a rig before animating is another step people skip. If your character has any scripted movement applied to the root part while the animation is also driving that same space, the two will fight. Bake the current transform into the animation at frame zero so the keyframe matches what the rig is actually doing. It sounds obvious, but you will spend an hour debugging floating foot behavior if you skip it. The Animation Editor does not support reverse playback natively inside the timeline, so if you need a move to work forward and backward, duplicate the animation, flip the keyframe times manually, and adjust the easing curve direction. It is tedious but reliable. Alternative approaches exist using inverse kinematics plugins, but those introduce their own problems with network replication and are rarely worth the setup cost for standard projects.
If you are building complex state machines with forty or more animations, the AnimationController system starts to show its age. Blend trees are not natively supported in the traditional sense, so you end up scripting your own mixing logic based on velocity and direction. It works but it adds complexity that most tutorials do not cover. For smaller projects with simple move sets, the built-in system is perfectly adequate and faster to iterate with.