How Custom Characters Actually Work in Roblox
Custom Character Roblox is something that comes up constantly on these forums, usually from people who don't realize how fragile the whole pipeline actually is. Let me just explain the system, then the parts that break it. At its core, Roblox characters are built from a base rig — either the R6 skeleton with six body parts or the R15 rig with fifteen joints and far more precise spacing. When you create a custom character, you're essentially replacing the defaultmesh that makes up the body while keeping that underlying skeleton intact so animations still play correctly. The mesh goes into a SkinnedMesh or MeshPart object, gets weighted to the rig's bones, and then the whole thing is uploaded as an asset or placed directly in a tool or avatar item. The most common mistake I see is people trying to modify the skeleton itself instead of just swapping the mesh. You can do that, but the second you move a bone position by even a fraction of a stud, every animation that assumes the default rest pose starts sliding around like it's on ice. I spent three days debugging a client's RPG character where the sword arm kept clipping through the torso during attack animations. The fix was simple — turn off RootMotion on the animations and bake them back to the rig instead of running them at runtime. That cut the runtime animation overhead in half and fixed the clipping issue entirely.
Custom Character Roblox Asset Pipeline
Here's what the process looks like if you're doing this properly. You start with the default R15 rig in Blender, remove the default mesh, and build your custom geometry around it. Key things that nobody warns you about: Bone weights matter more than geometry. A clean mesh with poor weight painting will look broken in every animated state. If you're new to this, use the pose library in Blender and check every major animation frame — idle, walk, run, jump, attack. Weight errors show up in the worst poses first. A lot of people skip this step because the mesh looks fine in rest pose and assume everything is fine. It's not. Export as an FBX file with "baked animation" turned off. You want the mesh only, not a baked pose. Set the scale to centimeters and make sure the Forward axis is set to minus Z and the Up axis is Y. Roblox's import pipeline is inconsistent if you don't match these settings, and you'll end up with a character that's rotated 90 degrees on import.
Once imported into Roblox Studio, parent your mesh under a new Humanoid and make sure the rig hierarchy is preserved. Every part needs to be named exactly as the default rig — UpperTorso, LowerTorso, RightUpperArm, and so on. If you rename even one part, animations targeting those bone names will silently break. The humanoid won't error out. It will just stop animating certain limbs and you'll be left staring at a character that walks fine but has no arm movement. For a downloadable solution, most people here just use the default Roblox rig and swap the MeshId of each body part. That's valid and it's the fastest path, but it's also the most limited. You're stuck with the default proportions unless you manually rescale every single part, which introduces its own set of problems I'll get to in a moment.
Get the Full Details

Proportion Scaling and the Clipping Problem
This is where custom characters fall apart for most people. When you scale a body part up — say you want a character with broader shoulders or longer legs — the other parts don't scale with it, and the joints don't reposition. The hip joint stays in the same spot, the elbow stays anchored to the upper arm's transform, and collisions start happening everywhere. I worked on a project last year where someone wanted a taller character for a fighting game. They scaled the torso and legs to 1.4x. The result was a character whose feet sank into the ground during the idle animation because the foot IK wasn't recalculated for the new height. The workaround was writing a small LocalScript that listened to the Humanoid.Running event and adjusted the root part position based on the character's total height divided by the default height ratio. It added about 80 lines of code and introduced some floating jitter on uneven terrain, but it was the only thing that kept the feet planted correctly across all animation states. Scaling is also why custom characters struggle with the default physics system. The mass and collision groups of each body part change when you scale them, and the Humanoid.WalkSpeed and JumpPower values are tuned for the default scale. A 1.3x scaled character will feel sluggish even if you bump walk speed up, because the internal velocity calculations are still referencing the default proportions.
Animation Sharing and Compatibility
One thing people don't understand is that Roblox animations are bone-driven, not mesh-driven. An animation made for a default R15 rig will play on a custom character without modification — as long as the bone names match and the proportions haven't shifted dramatically. This is both the biggest advantage and the biggest trap. The advantage is massive. The entire Roblox animation library works with custom rigs. You can take any animation from the toolbox and drop it onto your custom character. The trap is that it looks wrong if your proportions are off. A wide-shouldered character with a default walk animation will have arms that swing at the wrong angle because the animation still assumes shoulder joints at the default position. The fix is either to reweight the animation targets or accept that it's going to look slightly off and move on. There's also the issue of animation loading order. If your custom character uses multiple animation tracks — a walk cycle, an idle cycle, an attack — you need to set the priority levels correctly. Default priority is Action, movement animations are Movement, and abilities should be Action or higher. If two animations compete at the same priority, whichever loaded last gets to play and the other one stops mid-frame. I've seen this cause characters to freeze in a half-raised fist for the entire duration of an ability animation.
When Custom Characters Fail Completely
I should be honest about the scenarios where this approach just doesn't work. If you need a non-humanoid shape — something with wings, a tail, extra limbs, or a completely different bone structure — the standard Roblox rig system breaks down. You'd need to create a custom rig from scratch, which means writing your own animation data, rebuilding collision shapes, and essentially building a replacement for the Humanoid class. That's not a weekend project. It's a full systems rebuild. Another hard limit is the 200MB asset cap. If you're working with high-poly models baked into a single mesh, you'll hit this fast. Retopology is required for anything over roughly 50,000 triangles per body section if you want it to run at a stable frame rate on mobile devices. Roblox caps mobile rendering at lower triangle counts, and a character that runs fine on PC will tank to 20 fps on a phone. If you're trying to build something beyond what the R15 system supports, the alternative is using MeshPart collections grouped under a custom rig with scripts handling the animation logic directly. It's more work upfront, but it gives you control over the skeleton, proportions, and rendering pipeline without fighting against the built-in Humanoid constraints.

The asset ID for the default R15 rig is 912762368. You can drop that into a test place, strip the default mesh, and build from there. It's the starting point for everything.