Blender FPS/Character Item Animation — Zero-Duplication Viewmodel/Item Pipeline

You may want to look at this tutorial first:

The pipeline

We have a viewmodel/character with an Animator under either an AnimationController or Humanoid playing the animations. The item itself does not have an Animator or any other animation system and remains under the viewmodel/character’s model.

The goal is simple: one Animator drives everything.

Item animations are merged into the character/viewmodel’s animation, allowing items to be freely swapped, attached, and detached without duplicating Animators or animation logic.

This gives us:

  • Zero animation duplication
  • Swappable items
  • Attachable/detachable items
  • One animation system
  • Full control over item placement
  • Character/viewmodel animations remain reusable

The item is treated as part of the animated rig when attached, rather than as a separate animated system.


So now assume we have a rig


Now we need its Roblox equivalent positioned in the exact position where we exported it

The 0, 3.003, 0 in my case

Now you can safely attach the item
In my example, it will be a gun model from my game:


I do suggest using RigidConstraint over welds or motor6d since it allows attaching items to a bone in more complex rigs. I usually create a “Grip” bone on the right hand that is used as an anchor, but here we don’t have it, so instead we can create an attachment or use an already existing one in all R15 rigs named “RightGripAttachment” under the right hand.

We will not create a grip bone in this specific tutorial, but I will explain why it may be valid here:

A dedicated Grip bone can be useful when the hand is more complex, for example, when it has separate palm and finger bones. Instead of attaching the item directly to the main hand bone, the Grip bone acts as a dedicated anchor point for held items.

Because the Grip bone has its own transform relative to the hand, you can move and rotate the attached item by simply changing the grip bone’s offset. This makes it much easier to control exactly where the item is held without having to modify the item’s own position every time.

For example, if the weapon needs to sit slightly deeper into the palm or be rotated by a few degrees, you can simply adjust the Grip bone’s transform. The item will follow that offset automatically.

This is particularly useful for rigs with detailed hands because the main hand bone may represent the entire hand, while the actual point where an object should be held is somewhere inside the palm.

In other words, the Grip bone gives you a dedicated transform specifically for item attachment instead of treating the hand bone itself as the grip point.

For this tutorial, however, we can simply use the existing RightGripAttachment provided by the standard R15 rig, so creating a dedicated Grip bone would be unnecessary.

Note that RigidConstraint accepts both Bone and Attachment.


So now it’s important:
Under our item, we create an Attachment under the “Root” part (in my case, “Frame”) and set RigidConstraint.Attachment 1 to it

After we positioned our item properly, you must select this newly created attachment, and then with Ctrl held in Explorer, select the attachment we target under the right hand and run this in the command bar:

local selection = game:GetService("Selection"):Get()::{Attachment} selection[1].WorldCFrame=selection[2].WorldCFrame

Or alternatively, manually copy the WorldCFrame value from the RightHand attachment to the newly created one under the item.
After that we can set RigidConstraint.Attachment0 to the RightHand attachment safely.

Done; now the Attachment0 property controls whether the item is attached to the hand or not
Now temporarily create an AnimationController under the item’s model (this will allow us to export the rig and is temporary)
Now we can export the item using the https://create.roblox.com/store/asset/16708835782/Blender-Animations-ultimate-edition plugin
Go to the rigging tab with the item selected and MAKE SURE Center Rig to Origin for Export is disabled
Center Rig to Origin for Export disabled

After that, Export Rig and save it somewhere
After that, select Clean Meta Parts and delete the temporary AnimationController

Now go to your Blender file with a character/viewmodel rig and import the item rig



As we can see, the position is perfectly matched
Now generate armature


You can rig bones all you want or color, but this is not a tutorial for that (for such a tutorial, look at the post I sent above)
We want to select this generated armature and attach it to the bone or RightHand object
With the armature selected, go into constraints iConstraints tab and add a Child Of constraint

There are multiple ways to parent this, but to be sure, we will parent it under rig’s Armature
So set the target to the armature of the rig (viewmodel/character)


DO NOT WORRY THAT ITEM MAY DISAPPEAR; it is intended, and we will fix it right now
Now select a bone (RightHand in my case but could be something like Grip in yours)
RightHand Target->Bone
and now press Set Inverse
Set Inverse

Now when you try animating the rig, the item will follow

The downside is that you have to be switching between item and character armature, but you can fix it:

Select character armature and item armature in Object Mode (with shift held); after that, enter Pose Mode, and you have them both usable
So now try animating them, and let’s move into a proper export + merging pipeline
(Make sure auto keying is enabled for easier animating.)
Auto keying is enabled
(You probably want Parent transformation mode btw)

So here is an animation, for example (very basic)

So now you have to export rig animation and item animation separately
Export Target Rig
Export Target Item
Bake Export Button (Copy clipboard method)

In the Roblox plugin under the Player tab
Import from clipboard Button (roblox plugin)

Ctrl+V the text and save the animation to the rig.

Now open this animation using Roblox’s Clip Editor
Clip Editor Button


Verify that it is correct and then press 3 dots (…) → Optimize Keyframes
3 dots (...)
Optimize Keyframes
And just press “ok”, don’t change anything
This will heavily reduce empty frames and optimize your animation for zero loss of quality
Now make sure to save changes
Save

Now once again, temporary create AnimationController under item and Animator like this:
Explorer with Hierarchy
And now export item animation


Repeat the same optimization steps as with the rig.


So now under both rig and item, we should see this hierarchy:
KeyframeSequence in the explorer

You need to install the AnimationCombiner plugin in order to merge these animations.

Now select both of these KeyframeSequence(s) and press the combine button

New merged KeyframeSequence
Done, this is the animation you can save to Roblox and play under character.
Bro you forgot to remove the AnimationController under the item 100%

Scripting explanation & setup

For the animation to play properly, you want to once again attach the item to the hand using RigidConstraint and parent it under the character.


After that, you may safely play animation, and it will work just fine
Just be sure your item does not have Animator and you are using Rig’s Animator instead.

To remove an item, you have to set RigidConstraint’s Attachment0 property to nil and unparent the item.
This will stop item from being played.
And then do whatever:

local rig = script.Parent
local Animator = rig.Humanoid.Animator


local animation = Instance.new("Animation")
animation.AnimationId="Animation Id Here"

local track = Animator:LoadAnimation(animation)
track.Looped=true
track:Play()

That pretty much all the tutorial
Cut ze fluff :raised_fist:

The New Luau Order Ministry of Education 2026©™
- Sincirely, The Grand Optimizer (@yarik_superpro)

3 Likes