Control Rig Component imports no bones for skeleton

My goal is to procedurally spawn transform controls for all bones in a skeletal mesh determined at runtime and drive the transforms for those controls externally at runtime. I currently only need “static” manipulation of the skeleton, no animation.

I’m currently trying to achieve this using a Control Rig and an Actor blueprint with a Skeletal Mesh component and a Control Rig component.

Initial attempt:

  1. Create a control rig.

  2. In My Blueprint, add a new graph.

  3. Add the Construction Event node.

  4. Add the Import Skeleton node and connect its Execute pin to the Execute pin of the Construction Event node.

  5. From the Items array output pin of Import Skeleton, get the number of elements from the Num node.

  6. Connect the Num output pin of the Num node to the Value input pin of the To String node.

  7. Create a Concat node with the following input pins and values for debugging:

  • A: "Imported skeleton with " (quotation marks added for clarity, not included in actual input)

  • B: Result ouput from the To String node (the size of the Items array from Import Skeleton)

  • C: " bones" (quotation marks added for clarity, not included in actual input)

  1. Create a Print node with the following inputs:
  • Prefix: "[DEBUG] " (quotation marks added for clarity, not included in actual input)

  • Value: Result output from the Concat node

  • Enabled: true

  1. As an initial test, manually set the Preview Mesh in the Preview Scene Settings with a valid skeletal mesh asset. Observe the output log and see the skeleton is correctly imported.

LogRigVM: Display: Instruction[8] 'DISPATCH_RigVMDispatch_Print::Prefix:FString,Value:FString,Enabled:bool,ScreenDuration:float,ScreenColor:FLinearColor': 'VM[0008] [DEBUG] Imported skeleton with 19 bones'

  1. Reset the Preview Mesh so there is no skeletal mesh asset.

  2. Create an Actor Blueprint.

  3. Add a Skeletal Mesh component (child of the default scene root).

  4. Set the skeletal mesh asset of the Skeletal Mesh component to a valid asset.

  5. Add a Control Rig component (child of the default scene root; sibling of Skeletal Mesh component).

  6. Set the control rig class to the control rig created earlier.

  7. Add the On Pre Initialize event for the Control Rig component to the Event Graph from the Details panel.

  8. Add the Add Mapped Skeletal Mesh node with the following inputs:

  • Target: Component output pin from the On Pre Initialize event node

  • Skeletal Mesh Component: the Skeletal Mesh Component added earlier

  1. Observe the output log and see the skeleton is not imported.

LogRigVM: Display: VM[0008] [DEBUG] Imported skeleton with 0 bones

  1. Enter PIE. Observe the output log and see the skeleton is not imported.

LogRigVM: Display: VM[0008] [DEBUG] Imported skeleton with 0 bones

Additional attempts

  1. The target UE version is 5.3.2, but I tried 5.2.1 and 5.4.2 using the same steps and still couldn’t get this to work.

  2. Using Add Mapped Skeletal Mesh Bone Array with a Mapped Bone array populated using the bone names from the Skeletal Mesh component’s Skinned Mesh component (using a combination of Get Num Bones, a for loop, and Get Bone Name) in the Control Rig component’s On Pre Initialize event also results in the skeleton not imported.

  3. Delete the Actor Blueprint. Create an Animation Blueprint from any skeletal mesh. Add a Control Rig node. Set the control rig class to the control rig created earlier. Connect the Control Rig node to the Output Pose node. Observe the output log and see the skeleton is imported correctly. However, I need to be able to change the skeletal mesh asset at runtime, and spawn and drive the transform controls procedurally at runtime. From what I understand, this means I won’t be able to expose the controls as variables/pins to set their transforms externally as seen in the Virtual Puppeteering course.

  4. Perhaps Control Rig is only mean to be used together with an Animation Blueprint? Add a Transform array as a variable in the previously created debug control rig. In the Forwards Solve graph, use this array to set the transform of the controls in Global Space (I do this in a Branch, checking the number of items in the array against the current iteration over the rig controls). Create an Actor Blueprint with a Skeletal Mesh component as the default root component. Get all the bone (world) transforms from the Skeletal Mesh and store in an array. Create a public pure const function that returns this array. Create an Animation Blueprint. In the Event Graph, add the Event Blueprint Initialize Animation node, get the owning actor, cast it to the previously created Actor Blueprint and store in variable. In the AnimGraph, call the function from the Actor Blueprint and plug in the results into the array input on the Control Rig node. This might seem like the path to take, but it feels very convoluted and brittle compared to just setting and getting control transforms via the Control Rig Component (if it would work as per the documentation).

How can I procedurally spawn transform controls for all bones in a skeletal mesh determined at runtime and drive the transforms for those controls externally at runtime? Am I barking up the wrong tree? Any hints would be appreciated.

I can somewhat get this working by combining a Control Rig, an Animation Blueprint, and an Actor Blueprint, but this approach doesn’t feel like the cleanest and most direct solution.

The Animation Blueprint successfully maps the skeleton to the Control Rig. However, the challenge is procedurally manipulating the transforms of the rig controls.

I managed to achieve this by creating a Transform array variable in the Control Rig and exposing it as a pin in the Animation Blueprint. The Actor Blueprint, which handles gameplay-based changes, maintains a separate Transform array based on the Skeletal Mesh and exposes a function that returns this array. The Animation Blueprint then uses this to set the values for the Control Rig.

I’m trying to dynamically modify skeletal meshes in the level based on gameplay, and currently have no need for animation. Poseable Mesh Component could be an option, but I’d prefer to use Control Rig to future-proof my project.

Any advice or alternative suggestions would be greatly appreciated!