So I asked AIs Gemini and GPT (they’re actually VIs, not AIs) and they’re confused. They have so much trouble with how Level Sequences work (poor documentation).
Then I came across this video:
And though I adore this guy, I don’t think he fully understands what’s actually happening because his explanation doesn’t allow for most cases.
So, does anyone know how to play a level sequence from any location WITHOUT having to spawn an actor in?
If I want a customer ↔ vendor interaction to play, for example, or a nuclear sub to execute an emergency blow, I want it to be able be played ANYWHERE.
Also, I am aware of ATTACHING and ADDITIVE/RELATIVE tracks, but these still require a “source of truth”. I suppose my goal is to manipulate that source of truth (parent transform).
So, does anyone know how to play a level sequence from any location WITHOUT having to spawn an actor in?
If you mean without having a Level Sequence Player - No. You need the Sequence Player because the Level Sequence Asset is just a bunch of keyed data points (key frames) of parameters. You need something to actually change those parameters of the corresponding objects - the Level Sequence Player. You can however place a Level Sequence Actor in your level in the editor instead of creating it runtime. Not sure if there is any benefit in creating it with the level and searching for it later vs creating it on demand.
The “customer ↔ vendor interactions” usually are going to be character animations, not level sequence. You can play those in blueprints and trigger them from anywhere.
Try to manipulate your variable “source of truth” with its own animations and animation controllers and layer your level sequence on top of it.
Note that I’m making some very big assumptions about what you are making and I might be waaaay off. Let me know what exactly you are trying to animate and what do you have at that point. I suspect it goes beyond a “cut scene” so the Level Sequence might not be the best tool.
I don’t think you understand where I’m coming from.
In the Level Sequence you can Spawn (using a spawn actor track) an actor in. The video example uses a spawn and the problem with this is that my current setup uses actors already in the level. Not only that, but he spawns at World Origin. So when he applies the transform, it’s with relation to 0,0, and that’s not useful in all conditions.
With regard to the customer ↔ vendor interactions, my system is dynamic. Objects are being transferred between actors, so Level Sequences are required to get the interactions just right. I need to stress that I’m pretty advanced at this stuff already. The documentation is the issue.
Yes, I can manipulate the variable, but that would require another actor to act as the parent transform. I’m doing this already (again, if I have vendor ↔ customer, emergency blow, tennis points played on different courts, etc.), but I wondered if there was a way to directly tell the Sequencer: “Play all of these transforms for this actor starting relative their current local transform without needing a parent transform (source of truth).”
Unreal Engine’s Level Sequences are a highly practical method for handling complex events involving multiple objects, such as cutscenes.
First, I will mention the two basic object types within a Level Sequence: Spawnable and Possessable.
Spawnable objects have a orange lightning bolt icon next to them. These objects are spawned when the sequence starts (though not always, which I will explain later).
Possessable objects, on the other hand, possess an object if it already exists in the world. In this case, it appears gray. However, if the object does not exist in the world, it appears red.
Tip: You can assign tags to Actors by right-clicking them on the level sequence. This is important and will be useful later on.
Next is how Level Sequences are handled on the Blueprint side. We spawn it by calling Create Level Sequence Player. This node returns two types of objects:
Level Sequence Actor: As you can tell by it being an Actor, this provides the connection between the Level Sequence and the world (handling locations, bindings, etc.).
Level Sequence Player: This is used for settings related to playing the Level Sequence, such as play speed, stopping, pausing, and resuming.
There are two critical operations you can perform within the Level Sequence Actor:
Overriding the origin point of the Level Sequence.
Binding the Actors you already have in your world to the Actors required by the Level Sequence. Thanks to this, instead of using random Actors or spawning new ones, the Level Sequence uses the Actors you already possess—changing their locations, playing animations on them, etc.
For this process, you need to use the Add Binding by Tag node (there are other binding functions available as well). During this operation, you specify a tag, and the Level Sequence uses the Actor you passed as a parameter in place of the Actor with the matching tag inside the sequence. Similarly, you can detach the Actor you sent from the Level Sequence by using Remove Binding.
Binding and Unbinding can be done either before the Level Sequence starts or while it is actively playing.
If Possessable Actors inside a Level Sequence do not exist in the level and do not have a binding assigned to them, they simply won’t be played/animated within the sequence. However, the rest of the sequence will continue to run. Therefore, if a Possessable Actor has no counterpart in the level, you can introduce or remove that Actor from the Level Sequence by binding and unbinding it.
Spawnable Actors inside a Level Sequence will not spawn a new Actor if they already have a binding. However, this binding must be established before the Level Sequence starts. Otherwise, every time this Actor is left without a binding, the Level Sequence will spawn a new Actor to replace it.
I hope this solves your issue. If there is anything you didn’t understand or want to ask about, I’d be happy to help!
So we’re on the same page, Transform = Translation + Rotation + Scale.
@dZh0 First, I need to say that I appreciate your time. Second, Binding is not the issue for me. I’m already binding. The issue is dynamically playing a TRANSFORM based on an actor’s CURRENT TRANSFORM without a set PARENT TRANSFORM. Binding swaps out objects. Also, your video is only relevant for 5.5+ (it still doesn’t address dynamic transformation without a set reference point), and I’m on 5.3. No way you would have known that!
(To be extra clear, I want a sequence of transforms to be played on an actor NO MATTER ITS CURRENT TRANSFORM. Not on DIFFERENT ACTORS, but on the SAME ACTOR, just with a DIFFERENT START TRANSFORM. But the moment you key an actor in, the Level Sequence seems to commit to only that actor’s initial transform, and it won’t overwrite it. I even tried not adding any keys in, but the Sequencer automatically uses the actor’s current transform. I’m sure there’s a way to overwrite this!)
@E_Hamza_MB , although your information is correct and well-written, it is completely irrelevant to my issue. I’m not sure you fully read my post or understand what I’m trying to do.
This will not work because it transforms the LEVEL SEQUENCE ACTOR not the actors in it. The original video I posted in my original post used this exact same technique.
Level Sequence Actors default at 0,0,0 World Transform. If the actors in it are not also at 0,0,0, then when you do a transform, it’s going to be a relative transformation.
So BP_Cookie_Monster at 0,0,0 → (Instanced Data Transform) → 0,0,0 + IDT + New Transform
But BP_Cookie_Monster at 6,6,6 → (Instanced Data Transform) → 6,6,6 + IDT + New Transform
This seems okay but you have to set everything with relation to World Origin first. If you don’t, then you risk losing spatial relatives. Hard to explain unless you try it yourself.
(Your and Matt’s method COULD be correct, but there’s a step that’s missing.)
When I tried doing this with rotations a few days ago, transforms started getting out of control. You bring up an interesting issue for me now, which is “what exactly is being transformed?” I deduced it was the Level Actor (the Root Component?), but for me to predictably use this, I need to understand what the Transform Origin actually is, since you demonstrated that it isn’t the Actor.
Is it the Local “0” of all of the track actors? Is it the averaged “0” of all of the track actor’s locations? Moving one object is one thing, but moving multiple objects with respect to one another was when I started having issues. I can’t find documentation of this, so I don’t trust it. Yet, anyway.
I haven’t tested it extensively but I think it just transforms all tracked actors in addition to the tracks. What you see when you play the Level Sequence in the Sequencer (in editor) is what you get if you have no Override Instance Data set or if you have your default transform. (one located at 0, 0, 0)
If you want to make an object move as handled by a character for example, move the character at 0, 0, 0 with no rotation and 1 scale. Make your level sequence and from that point on you can just change Transform Origin Actor to any similar character in the scene and the animation should match.
If you already have it in arbitrary position you’ll have to do a bit of math and set a Transform Origin to the relative transform between the original and the new transform.
The “Make_Relative_Transform” node is a clever idea. I usually use that node for converting Local Transforms to World when actors are attached to each other.
I won’t be doing this with the Level Sequence because it’s just too finicky and I’m far too deep in development to introduce new concepts, but this thread certainly may help others.
At any given time (e.g. a trigger box), override that note actor reference giving it another transform (example, vendor’s transform) before calling the play sequence node.
In my test, the noteorigin is on the left side of the screen, marked by the gizmo, and the target note is on the right side just waiting for the trigger to start the code above.
The sequence recorded in the left side (green) plays in the right side of the screen (red).
to make it procedural, the note actor becomes an “editable variable” for each vendor. Also, in theory, if you attach the noteorigin actor to your player, the sequence should follow without the need to override it (I haven’t tested this way).
If you want the vendors to be part of the level sequence, the same technique applies. Add a vendor NPC to the level sequence, attach it to the parent note, than call the same override node (Get Sequence Binding) before calling play. The override is called per actor inside the sequence. This is the trick used in RPG games, when the player can be customized, and the cutscenes always show the custom player (hair, skin, clothes, weapons, etc.), or the cutscene uses the player as possessable, grabbing whatever player BP appears in the area.
This method seems to require the NOTE to be bound to a specific Character. But what if I want ANY character? How will it know what to bind to if it is already parented to a specific Actor/Character? (I don’t think “Set Binding” will work if, in the Outliner, it’s parenting a specific asset.)
Why is this different/more special, functionally, than placing an Actor object into the world and attaching the binds to that instead of the Note?
Welcome back. I’ll try to answer your questions, here’s a clear rundown of how notes work in the current workflow and how they relate to Level Sequences.
This method seems to require the NOTE to be bound to a specific Character. But what if I want ANY character? How will it know what to bind to if it is already parented to a specific Actor/Character? (I don’t think “Set Binding” will work if, in the Outliner, it’s parenting a specific asset.)
A Note (found in the Place Actors panel or created as a Blueprint Actor) acts as the transform parent for a Level Sequence. It doesn’t bind itself to the actors inside the sequence; instead, the actors are parented to the note (using an Attach track shown below) only to register their relative transforms, and it can be set as spawnable or possessable under that sequence. Because of that, swapping the Note - or using a Note with a different transform - changes the world‑space context in which the sequence plays AND everything parented to it:
In your case, each vendor might have its own note file at different transforms, so you might want to use actor tag and get all actors of class with tag. If the vendor is part of the level sequence, you call override NPC BP and you can have the same intro animation playing with different vendors. For multiple overrides, you have to call per actor like this:
In this example, I’m replacing the note as NoteOrigin and the NPCDude of Pawn class as My character because Get Sequence Binding only allows an actor per node.
Audio can be overridden the same way. If each vendor has a unique voice line for the intro, you can swap that out per Note without touching the animation itself.
Also remember: a Level Sequence doesn’t have to be a full cinematic. It can be as simple as a camera cut. So interacting with a vendor might trigger a close‑up, a short greeting animation, or even just a quick camera zoom‑in, whatever fits your design. The Note simply ensures the sequence plays in the correct place and orientation.
Why is this different/more special, functionally, than placing an Actor object into the world and attaching the binds to that instead of the Note?
Note seems to be the native, hidden secret of level sequences, I can’t say why or how, but I now Sequences were a major upgrade from the legacy Matine (tied to a level) to turn cinematics into interchangeable assets. In my tests, that was the only way to do reuse LS at different transforms.