Component Setup
I have a manager-style component that manages multiple sub-components, keeping references to them in an array of pointers. This array is exposed to the editor, allowing me to view and toggle properties of the sub-components directly through the manager.
The Problem
When I keyframe a property from the manager component’s array in the Details Panel, Sequencer creates the track bound to the manager component instead of the actual sub-component that owns the property. This results in a broken track - the property value in the array gets animated, but it doesn’t affect the actual sub-component. If I bind the same property directly from the sub-component itself in the Details Panel, Sequencer correctly creates the track on that sub-component and everything works as expected. This happens with any property I try to keyframe through the manager component.
Current Limitations
Even with setter functions or PostEditChangeChainProperty implementations that properly sync values during interactive editing, it doesn’t work if I add it to a Level Sequence. Sequencer appears to bypass these mechanisms, directly setting property values through its evaluation system without respecting the relationship between the manager’s array and the actual sub-components (I guess).
What I Expected
I expected Unreal to recognize the hierarchy when keyframing - that a property displayed through the manager component’s array actually belongs to a specific sub-component and should create the track there. Is there a built-in solution for this kind of component relationship, or a recommended workaround? Would implementing custom tracks and sections even solve this binding redirection issue, or is this a fundamental limitation of how Sequencer handles property binding?
[Attachment Removed]
Steps to Reproduce
Initial Setup
- Create a custom component class (this is your ManagerComponent) inheriting from UPrimitiveComponent (haven’t tried with other ones)
- Add an array to ManagerComponent that holds pointers to child components, exposed to the editor
- Create a second custom component class, this will be your ChildComponent. Inherit from the same class as the parent (UPrimitiveComponent , haven’t tried something different).
- Add a property to ChildComponent, make sure to make it keyable
- Create an Actor containing:
- One ManagerComponent instance
- As many as ChildComponent instances you want (as children of the manager component)
- Populate the ManagerComponent’s array with references to the child component instances
Binding from Manager Array (Broken Behavior)
- Place the Actor in a level
- Open or create a Level Sequence
- Add the Actor to the Level Sequence
- Select the Actor in the viewport or World Outliner
- In the Details Panel, expand the ManagerComponent
- Expand the child component pointer array
- Navigate to one of the array elements (child component reference)
- Locate the exposed property within that array element
- Add the property to Sequencer
- Observe the Sequencer hierarchy tree
Result: The track is created under ManagerComponent (or placed incorrectly in the hierarchy), not under the actual ChildComponent instance. It’s red indicating a broken reference.
Binding from Child Directly (Expected Behavior)
- Using the same Actor and Level Sequence from above
- Select the Actor in the viewport or World Outliner
- In the Details Panel, directly expand one of the ChildComponent instances (not through the manager’s array)
- Locate the same animatable property on the child component
- Add the property to Sequencer
- Observe the Sequencer hierarchy tree
Result: The track is correctly created under the ChildComponent in the hierarchy. You can Edit/Toggle the property as you like to test how it behaves and if it is working. The property behaves/animates correctly on the child component.
[Attachment Removed]
I’ve uploaded a video reproducing the issue when I was creating the question, but apparently I can’t find it here. Let me know if you’re not able to see the video, so I would try uploading it again.
[Attachment Removed]
Hello!
> I expected Unreal to recognize the hierarchy when keyframing […] is this a fundamental limitation of how Sequencer handles property binding?
Yep, it is a limitation of how Sequencer handles property bindings, and a limitation that, I would argue, is done on purpose actually. Sequencer doesn’t try to “redirect” objects when you add new tracks. If you keyframe property path “Foo.Bar” on object “OBJ_01”, then Sequencer will try to find “OBJ_01” and then resolve the “Foo.Bar” property path on it. If the property path happens to be “Foo.SomeReference[1].Parent.Bar” then that’s the property path that Sequencer will follow. This avoids many problems and allows handling a few use-cases too.
For example, is “SomeReference[1]” an object that always exists in the level? If we “rebound” the track to that object, and that object was called “THAT_REF_03”, then we would indeed create an object binding to it. But if it was dynamically created (perhaps by “OBJ_01”) and it didn’t have a guaranteed fixed name, then on the next run it may be called “THAT_REF_05” and our object binding fails to resolve… even though “OBJ_01.Foo.SomeReference[1]” points to the correct dynamically created object.
So yeah, we respect what the user is doing -- if they key something through a given “starting point”, we will retrace their steps, so to speak, when we resolve that property path again.
That said, I’m not sure why the track ends up being red and unresolved. It should still be able to resolve that property path, unless somehow that array of components is populated too late or something. There is also the fact that keying and animating things in arrays was rather buggy -- we fixed a few bugs related to that in 5.7 so it may be worth trying again in that version?
[Attachment Removed]
Hey Ludovic, I was testing this in UE 5.6.1, and after getting access to 5.7.2, most of the issue appears to be resolved. However, I’m still seeing a problem when keyframing USTRUCT properties.
For example, consider this hierarchy:
- Actor
- RootComponent
- ComponentManager (custom primitive component)
- ChildComponent_01 (custom primitive component)
- ChildComponent_02
Each ChildComponent contains a USTRUCT with properties exposed to Sequencer (UPROPERTY(Interp)), and those components are also referenced in an array inside the ComponentManager.
When I keyframe the struct properties via the array reference in the manager, the values do not animate during playback, even though the sequence track itself remains valid.
[Attachment Removed]
This is a zipped project with the a generic setup of the issue. My question is, is this keyframing of the properties (using the structure I previously described with the USTRUCT) breaking by design?
[Attachment Removed]
Are you talking about the property tracks bound to the “MyComponentsParameters” elements? Somehow those property tracks are invalid… if you hover your mouse cursor over them, you can see the full property path in the tooltip. This one for instance just says “TestInt”, and there’s no “TestInt” property on the C_Manager component, so the track shows up red:
[Image Removed]
If I create a new track for the TestInt property on the second element of the array, notice how the tooltip shows the full property path: “MyComponentsParameters[1].TestInt”.
[Image Removed]
How did you create those original tracks?
[Attachment Removed]
I created these keyframes using the Details panel. Steps to reproduce:
- Open the Level
- Open the Sequence
- Selected the BP_TestActor
- Selected the C_Manager component on the details panel
- Still on the details panel, under the “Setup” section. You can use the “PopulateComponents” button I’ve put there.
- After populating the components, you have two arrays. One array is a direct reference to the child components, “My Components”. The Second array, “My Components Parameters”, is a direct reference to the UStructs that are inside the child components.
- If you keyframe any of the properties (using the diamond on the side of the property in the details panel) inside the first array (My Components > Index [0] > Setup > …) it will work ok.
- The issue: if you try to keyframe the properties inside the second array (My Components Parameters > Index [0] > …) it will not work. The tracks will be red as you you’ve seem before.
[Attachment Removed]
Hello, sorry for the delays.
It looks like this is a bug with that “diamond button” on the Details View to add keyframes… when I do it that way, I indeed get a red track because the created binding is incorrect: it creates a binding to, say, “bTestBool” or “TestInt”, instead of to (in this case) “MyComponentsParameters[0].bTestBool” and so on. This is ironic since the display name of the track does show this! On the other hand, if I add a property track directly inside Sequencer, it works correctly. I click on the “+” button on the “C_Manager” track, and go down in the menu to find “My Component Parameters > My Component Parameters [0] > Test Bool” for instance. That adds a correct track with the correct property path.
I’ll file a bug and we’ll look into fixing it possibly for 5.8.
[Attachment Removed]
Thanks for the support Ludovic! Looking forward to 5.8 
[Attachment Removed]