Tutorial

How to animate a pet in Roblox (idle, walk, fly)

Rig a pet, make idle, walk and fly loops, import and publish them, then play them from a script with AnimationController and Animator. Luau example included.

Updated 7 min readBy the Proppo team

On this page

Quick answer

To animate a Roblox pet, rig it with bones, make looping idle, walk or fly clips at 30 fps, and import the FBX into Studio with Rig Type set to Custom. Publish each clip from the Animation Editor with the account that owns the game, then play it through the Animator inside the pet's AnimationController from a script.

Key takeaways

  • Pets animate through an AnimationController with an Animator inside it, not through a Humanoid.
  • A Roblox rig needs its root bone at 0, 0, 0 with no weights, and each vertex can have at most 4 bone influences.
  • Animate loops at 30 fps, the Animation Editor's default, and make the last pose match the first so the loop doesn't jump.
  • Publish every clip with the account or group that owns the game, or it won't play in the live experience.
  • Most pets need only two loops, an Idle and a walk or fly; a script switches between them based on the pet's speed.

A pet that breathes, wags its tail and flaps its wings feels alive in a way a floating statue never does. Getting there in Roblox takes a rig, a few looping clips, the publish step and a short script that picks the right clip. This guide covers that path for non-humanoid pets (four legs, wings, fins), with a Luau example. Studio details are as of October 2026.

How does pet animation work in Roblox?

A pet model gets an AnimationController with an Animator inside it. You publish each clip as an animation asset, load it through the Animator and play the resulting track from a script, as Roblox's Use animations guide describes for rigs without a Humanoid.

Player characters animate through a Humanoid. Pets usually don't have one. Instead, a model gets an AnimationController with an Animator inside it. You publish each clip as an animation asset, load it through the Animator into an AnimationTrack, and play, stop or speed up that track from a script.

The clip moves either Bone objects inside a skinned MeshPart (one mesh that bends) or parts joined by Motor6D joints. For AI-generated or sculpted pets, a skinned single mesh is the usual choice.

Step 1: Rig the pet with bones and weights

Rigging happens in a 3D tool such as Blender or Maya. You add a skeleton and paint how strongly each bone pulls on each vertex. Roblox's modeling specifications set a few hard rules:

  • The root bone sits at 0, 0, 0 and has no influences.
  • All bones are frozen: scale 1, 1, 1 and rotation 0, 0, 0.
  • A vertex can be influenced by at most 4 bones.
  • Every bone should have weighted vertices. The importer drops unweighted bones unless you turn on Keep Zero Influence Bones.

Pick the skeleton from the body plan: spine, legs, neck and tail for a four-legged pet, two or three bones per wing for a flyer, a bendy spine and fins for a fish. Keep chains short; every bone is one more thing to animate.

Step 2: Make the idle, walk and fly loops

Open the Animation Editor from the Avatar tab, select the rig and pose it on the timeline. Animations run at 30 frames per second by default. If you animate in Blender instead, bake the clips at 30 fps too. Most pets need only a few loops:

  • Idle

    What moves
    Breathing, slow tail or wing sway
    Tips
    Plays most of the time, so keep it calm. Two to four seconds is plenty.
  • Walk

    What moves
    Legs in a cycle, body bob per step
    Tips
    Animate one speed; the script scales it.
  • Fly

    What moves
    Wing flaps, body rising and dipping
    Tips
    Played slower, it can double as a hover idle.
  • Hatch or celebrate

    What moves
    A one-off jump or spin
    Tips
    Not looped.

Turn on Looping in the editor's playback controls. Looping does not blend the last keyframe back into the first, so copy the first keyframes to the end of the clip. Otherwise the pet twitches once per loop.

Step 3: Import the rig and its animations

Export the rigged pet as FBX and bring it in with File > Import. Set Rig Type to Custom. Studio adds the bones under the MeshPart and an AnimationController on the model. Since an August 2026 Studio update, animation data in the file is also saved automatically to AnimSaves in ServerStorage, so you no longer need a second import from the Animation Editor.

Clips in separate files go through the Animation Editor's importer (From File), which since early 2026 reads glTF as well as FBX and imports every clip in a file. Imported clips stay local until you publish them.

Step 4: Publish the animations

Open a clip in the Animation Editor, then set its priority with ⋯ > Set Animation Priority: Idle for the idle, Movement for walk and fly. A higher-priority track overrides a lower one on the bones they share, so the walk takes over while the idle keeps playing underneath. Then choose ⋯ > Publish to Roblox, give it a title and, if a group owns your game, pick the group as the creator. Copy the asset ID you get back.

Step 5: Play them from a script

Put this Script inside the pet model and paste your two asset IDs. It loops the idle, measures how fast the pet moves each frame, and plays the walk or fly loop while it is moving, sped up or slowed down to match.

Lua
-- Script inside the pet model (server side, so every player sees it)
local RunService = game:GetService("RunService")

local pet = script.Parent
local root = pet.PrimaryPart or pet:FindFirstChildWhichIsA("BasePart", true)
local controller = pet:FindFirstChildWhichIsA("AnimationController", true)
local animator = controller:FindFirstChildOfClass("Animator")
if not animator then
	animator = Instance.new("Animator")
	animator.Parent = controller
end

local function loadLoop(id, priority)
	local animation = Instance.new("Animation")
	animation.AnimationId = id
	local track = animator:LoadAnimation(animation)
	track.Looped = true
	track.Priority = priority
	return track
end

local idle = loadLoop("rbxassetid://0000000000", Enum.AnimationPriority.Idle) -- your Idle
local move = loadLoop("rbxassetid://0000000000", Enum.AnimationPriority.Movement) -- your Walk or Fly
idle:Play()

local MOVING = 1 -- studs per second that count as moving
local CLIP_SPEED = 10 -- speed the walk cycle was animated for
local lastPosition = root.Position
local moving = false

RunService.Heartbeat:Connect(function(dt)
	local speed = (root.Position - lastPosition).Magnitude / dt
	lastPosition = root.Position
	if speed > MOVING and not moving then
		moving = true
		move:Play(0.2)
	elseif speed <= MOVING and moving then
		moving = false
		move:Stop(0.3)
	end
	if moving then
		move:AdjustSpeed(math.clamp(speed / CLIP_SPEED, 0.5, 2))
	end
end)

Load each animation once and reuse the track. For a model outside a player's character, load and play the animations from a server Script so everyone sees them. If your game moves pets on each player's device instead, as many large pet games do, run the same logic in a LocalScript; then only that player sees those tracks.

Can you skip rigging and animating a pet by hand?

Yes, with an auto-rigger that knows non-humanoid bodies. It builds the skeleton and the first loops for you; you still import and publish the clips yourself.

Steps 1 and 2 are where most of the hours go. Proppo's rig (10 credits) builds the skeleton from a body template, weights the mesh within Roblox's 4-influence rule and adds two seamless clips, an Idle and a move loop, each 2 seconds at 30 fps:

TemplateMove clip
Four legsDogs, cats, dragons — spine, legs, tailWalk
Two legsStanding pets and charactersWalk
FishSpine + fin chains, swim loopSwim
Bird / flyerWing chains + body bobFlap
Snake / wormOne long spine chain, slither loopWiggle
Jelly / squidTentacle chains, soft wobbleSwim
Simple bounceRoot + body, idle bob + bounce (eggs, props, items)Bounce

Auto-detect picks a template from the shape. Flyers get the Bird / flyer template with a Flap loop.

Bat Ray with the auto-rig's Swim loop.

The clips come inside the FBX, so you still import and publish them yourself (steps 3 to 5), since animations must be owned by you or your group anyway. Extra clips such as a hatch jump are still hand work. The full pipeline is in our AI pet guide.

Why doesn't my Roblox pet animation play right?

The usual causes are ownership, equal priorities, a loop whose last pose doesn't match the first, too many bone influences, or a walk cycle that doesn't match the pet's speed.

Nothing plays in a live game

Check the owner of the animation (see step 4) and that the AnimationId is the published asset, not a local save.

The walk never shows

Both tracks probably have the same priority. Set the walk or fly clip to Movement and the idle to Idle.

The pet twitches once per loop

The last keyframe doesn't match the first. Copy the first pose to the end of the clip.

The mesh tears or stretches

Some vertices have more than 4 influences. Limit and normalize the weights in your 3D tool, then re-import.

The pet slides along the ground

The walk cycle doesn't match the pet's speed. Change CLIP_SPEED in the script to the speed the clip was made for.

Frequently asked questions

Does a Roblox pet need a Humanoid to be animated?
No. Non-humanoid models use an AnimationController with an Animator inside it. Studio adds the AnimationController when you import a rigged model with Rig Type set to Custom; you can also create both from a script.
What frame rate should Roblox animations use?
Roblox's Animation Editor works at 30 frames per second by default, so animate or bake your clips at 30 fps. For loops, make the last keyframe match the first.
Why does my pet animation play in Studio but not in the game?
Usually ownership. An experience plays animations owned by the same user or group as the experience, unless the owner grants it access on the animation's Permissions page in the Creator Dashboard. Publish the clip with the account or group that owns the game.
Can I animate a pet without rigging it?
Yes. Scripted motion (bobbing, tilting, hopping) works on any model and is common for pets that follow players. For body movement such as walking legs or flapping wings you need a rig, either bones in one skinned mesh or separate parts joined with Motor6D joints.

Get a pet that already moves

Describe a pet or upload a drawing. Proppo makes the model, sizes it for Roblox and rigs it with an Idle and a move loop at 30 fps.

60 free credits when you confirm your email. No card needed.

All guides