there are many ways to do it.
organizing the time flow for what you are programming is a great way.
it depends on your project.
As for things you can use. i’d avoid using JUST timers. They are fine if you need something quick. but can break once you have many things in sequence. (i do love timers)
I do use timers on the sample code below.
i’d use Delegates. and a careful study of the flow.
i’ll have one class that controls the flow, and then notify through delegates what’s happening.
if it needs to wait for something to do something else asynchronously (loading or a ui animation or X), then you’ll need this system to subscribe to the other thing’s delegate.
i’d avoid timers to coordinate these sort of things.
here’s an example. i’ve made a foss plugin to deal with “story” steps. when i change from one step to the other, i allow to optionally fade in/out, during which i also load stuff.
take a look, it might give you a hint.
i have a manager actor, that hosts the ui and world stuff. that listen to the Fade delegate and notifies the ui.
then the ui does its thing.
though these are the base classes in the plugins. in my game i subclass these and fill them out.