We’ve noticed that the sequencer will not invalidate its object bindings for bound objects that stream in via world partition. This has created really tight race conditions especially on level instantiation that are difficult to debug. We found it by trying to control the tick interval of a sequence, but doing that puts it into a linker group that ran just a little faster than the rest and the sequencer stopped working entirely. This is because it was already racing with streaming before and this just pushed it early enough to fail.
One could argue that all the objects must be streamed in before you try to play a sequence, but it doesn’t even throw a warning that it can’t find a bound object. In my personal opinion, it would be best to both warn if a bound object can’t be found (via locator in my case) and invalidate object bindings when dependent objects stream in so it can hook in mid-play. Sure you may trade off some other bugs with certain events not firing, but at least for smaller looping transform sequences they won’t just fail, and it will still give the user an idea of what went wrong.
Steps to Reproduce
Create a level sequencer actor in a level that modified the transform of a static mesh in the level. Have that static mesh be streamable. Note that the bindings for the sequence are not invalidated when the object does stream in, so if the sequence is started just a frame before, then it will fail to modify the transform.
This is a sensitive issue to get right because handling it in the way you suggest quickly introduces performance issues since it requires polling every frame for objects to be available. In addition it is also undesirable with some workflows for it to be an error at all (since this situation can occur by design in some contexts).
That said, I think you’re probably right that we should throw a warning that is suppressible for those objects where we want to be lenient towards it not being resolved.
As for the race-condition itself, this is something we recommend either handling in gameplay (ie, ensure the datalayer or level instance is active before starting the sequence), or use a data layer track in the sequence itself to guarantee that the objects that you need are streamed in.