I am building a few actor blueprints (containing animated instances) that are animated using “Event Tick” to drive the animations. I would like to implement a system where I can choose to drive the animations using either 1) “Event Tick” or 2) current time from a Level Sequence.
Here are my questions…
When I create an event track in the Level Sequence, it brings up the Sequence Director. How do I use the Sequence Director to trigger events in all of my blueprint actors in the scene?
What do I need to implement inside each of my actor blueprints in order for them to be affected by the Sequence Director? Is this best done with an event dispatcher or an interface?
How do I pass the current time of the Level Sequence into each of the actor blueprints?
Can it be done in such a way so that when I scrub the sequence timeline, the actor blueprints update in editor?
Hey @dbkdavid, I’ll try my best to answer it as I recently stumbled upon a similar problem myself. The way I solved it is with an interface.
Create an interface with a function TickSequencer(float InDeltaTime), make sure to mark this function CallInEditor=True for the metadata
Create a float variable LastTickTime in your sequence director
Create an event or function in your sequence director TickSequencer(object*)
calculate the DeltaTime = GetCurrentTime().QualifiedFrameTimeToSeconds() - LastTickTime
call the interface function object*→TickSequence(DeltaTime)
set LastTickTime = GetCurrentTime().QualifiedFrameTimeToSeconds()
Create a repeater track on the component or actor you want this interface function to be called on and bind the TickSequence function from your director
Add and implement the interface function on your actor or component
This will tick in editor and in game, although note that probably not everything is supported to update from unreal. I for example could not correctly set the time of a TimelineComponent in the actor and I can imagine nested referenced actors might also behave strangely and should have their own repeater track with interface implementation. But basic type and data driven action like setting material params, rotations and translations worked.
Lastly if you want to pass the sequencer time, then pass GetCurrenTime directly into the interface function instead of doing the 2, 3.1 and 3.3