Tl;Dr - Choose the “Selected” option when importing animations to a rig from an .fbx with the animation editor. Also make sure you don’t change the name of the MeshPart (ex. Mesh_0, HumanoidRootPart, NPC-0101) that the bones are in, once you’ve already published the animation. The MeshPart and ALL of it’s descendent bones MUST have the same name as when you exported the animation, or the animation will break.
Detailed explanation:
I figured it out! When I import my models in the .fbx format, the animations are baked in. When importing the animations, I’m given a notification that the rig I’m importing it to and the model in the .fbx differ (despite being the exact same model). The notification gives you the choice between the .fbx or the selected rig to determine how the animation system reads the bones, I think. The whole time, I was choosing the .fbx option, since the notification always puts “(reccomended)” next to it. However, when I started choosing the “Selected” option I had no issue.
Additionally, when I import my .fbx the Avatar Importer automatically creates a MeshPart, named Mesh_0 for example. This is the exact same thing as the Mesh in Blender - This is just how the animation importer sees it. The mesh used for the MeshPart is the mesh you import, and the bones of the rig (ex. Root, Pelvis, Spine1) are parented to this Mesh_0. I would then import the animation through the animation editor. When you do this, the editor automatically reads the names of every bone in the animation you are importing, then references them in the rig you are importing the animation to.
As it turns out, it’s NOT important whether or not that initial “Mesh_0” is named the same thing - It’s not used in the animation, the initial mesh is just what the bones are parented to. That is, you can name it was whatever you want so long as you adhere to the following: DO NOT rename the MeshPart after you’ve published the imported animation to Roblox. If you do, when you play the animation, the animator will not see the first piece in the animation, the MeshPart, and skip straight to the Root. Problem is, the MeshPart has no animation, so the animator will apply no animation to the root.
In my case, I had exported the animations on one rig, named “Mesh_0”. Then, when I duplicated it to create a StarterCharacter, I renamed the “Mesh_0” MeshPart to “HumanoidRootPart”. When the Animator then tried to read the instances used in the animation, it didn’t find a Mesh_0.
I solved this by going back and reexporting the animations with the MeshPart named HumanoidRootPart.