Skip to content
ClaudeUnreal
GitHub

Automate a cutscene

What you’ll build: /Game/Tutorials/LS_Flythrough — a 5-second Level Sequence at 30 fps where a Cine Camera flies from eye level to an overhead look-down while a HeroSubject cube rotates 360°, then plays it back in the Sequencer.

Time: ~90 minutes · Prerequisites: Tutorials 1 and 2 recommended. An empty level open.

ping

Try this prompt:

Spawn a CineCameraActor named HeroCam at location (-500, 0, 200). Then spawn a cube named HeroSubject at the world origin.

What Claude does

CineCameraActor is not in spawn_actor’s fixed enum, so Claude routes through spawn_actor_by_class with actor_class=CineCameraActor and actor_name=HeroCam. Then the cube is a two-call flow (spawn_actor type=StaticMeshActor + set_actor_component_property to assign /Engine/BasicShapes/Cube.Cube), the same pattern you saw in Tutorial 1.

Verify

find_actors_by_name HeroCam
find_actors_by_name HeroSubject

Expected: one HeroCam (class CineCameraActor) at (-500, 0, 200) and one HeroSubject (class StaticMeshActor) at the origin.

Try this prompt:

Create a Level Sequence named LS_Flythrough under /Game/Tutorials at 30 fps. Set its length to 5 seconds.

What Claude does

Two calls:

  1. create_level_sequence with name=LS_Flythrough, path=/Game/Tutorials, fps=30.
  2. set_sequence_length with sequence_path=/Game/Tutorials/LS_Flythrough, length_seconds=5.

Length and fps are set separately — create_level_sequence accepts fps inline but not length, and set_sequence_length works in seconds (the tool handles the frames conversion internally).

Verify

get_sequence_info sequence_path:/Game/Tutorials/LS_Flythrough

Expected: length_seconds: 5, display_rate_fps: 30, empty tracks and bindings.

Step 3 — Bind the camera and add a camera cut track

Section titled “Step 3 — Bind the camera and add a camera cut track”

Try this prompt:

Add HeroCam to LS_Flythrough as a possessable, then add a camera cut track pointing at the HeroCam binding.

What Claude does

Two calls:

  1. add_actor_to_sequence with sequence_path=/Game/Tutorials/LS_Flythrough, actor_name=HeroCam — returns a binding GUID and binding_name=HeroCam.
  2. add_camera_cut_track with sequence_path=..., binding_name=HeroCam — creates the camera cut track and a default section pointing at the HeroCam binding.

Verify

get_sequence_info sequence_path:/Game/Tutorials/LS_Flythrough

Expected: one binding (HeroCam) and one master-level camera cut track.

Now the meat of the tutorial. The camera needs a Transform track, and the Transform track’s six channels (Location X/Y/Z + Rotation X/Y/Z, indices 0–5) each hold their own keyframes. add_keyframes_batch writes one channel at a time.

Try this prompt:

On the HeroCam binding, add a Transform track. Set keyframes at frame 0 matching the camera’s starting transform (-500, 0, 200) with zero rotation, and at frame 150 at location (0, 0, 300) with pitch=-90 so it looks straight down.

What Claude does

  1. add_transform_track with sequence_path=/Game/Tutorials/LS_Flythrough, binding_name=HeroCam.
  2. Six add_keyframes_batch calls, one per channel. Using sequence_name=LS_Flythrough, track_name=Transform, actor_name=HeroCam:
    • Channel 0 (Loc.X): [{frame: 0, value: -500}, {frame: 150, value: 0}]
    • Channel 1 (Loc.Y): [{frame: 0, value: 0}, {frame: 150, value: 0}]
    • Channel 2 (Loc.Z): [{frame: 0, value: 200}, {frame: 150, value: 300}]
    • Channel 3 (Rot.X / Roll): [{frame: 0, value: 0}, {frame: 150, value: 0}]
    • Channel 4 (Rot.Y / Pitch): [{frame: 0, value: 0}, {frame: 150, value: -90}]
    • Channel 5 (Rot.Z / Yaw): [{frame: 0, value: 0}, {frame: 150, value: 0}]

Verify

get_sequence_info sequence_path:/Game/Tutorials/LS_Flythrough

Expected: the HeroCam binding now has a Transform track with keyframes at frames 0 and 150 on each of the six channels.

Try this prompt:

Add HeroSubject to the sequence. Add a Transform track and animate its yaw from 0 at frame 0 to 360 at frame 150.

What Claude does

  1. add_actor_to_sequence with actor_name=HeroSubject.
  2. add_transform_track on the new binding.
  3. A single add_keyframes_batch call on channel 5 (Rot.Z / Yaw) of the subject’s Transform track: [{frame: 0, value: 0}, {frame: 150, value: 360}]. The other five channels are left with no keyframes, which freezes them at the actor’s current values.

Verify

get_sequence_info sequence_path:/Game/Tutorials/LS_Flythrough

Expected: two bindings (HeroCam, HeroSubject) each with a Transform track.

Try this prompt:

Open LS_Flythrough in the Sequencer and play it from the start.

What Claude does

  1. open_level_sequence with sequence_path=/Game/Tutorials/LS_Flythrough — docks the Sequencer panel.
  2. play_sequence — starts playback from the current position.

You should see the viewport flip to the camera view, fly from ground level up to overhead, while the cube spins 360°.

If the overhead shot felt too steep, adjust a single keyframe without redefining the whole track.

Try this prompt:

Raise the camera’s end Z to 400 and soften the pitch to -70 degrees by tweaking the existing keyframes.

What Claude does

Two set_keyframe_value calls against the HeroCam binding’s Transform track:

  1. sequence_path=..., track_index=0, binding_name=HeroCam, channel_index=2 (Loc.Z), keyframe_index=1, value=400.
  2. Same but channel_index=4 (Rot.Y / Pitch), value=-70.

Play the sequence again — the flythrough now ends higher with a gentler downward angle. No keyframes were re-created, so the start pose and timing are untouched.

Try this prompt:

Save LS_Flythrough and save the current level.

What Claude does

save_asset on /Game/Tutorials/LS_Flythrough, followed by save_level.

  • Sequencer workflow — binding → track → keyframes, always in that order. The binding connects a level actor to the sequence; the track declares what’s animated; the keyframes give it values over time.
  • add_keyframes_batch operates on one channel at a time (indices 0–5 for Loc + Rot). Batch multiple frames on one channel in a single call — but multiple channels still means multiple calls.
  • Frame numbers are the wire currency. Seconds-to-frames conversion happens in your head or Claude’s prompt: frame = seconds × fps.
  • set_keyframe_value for targeted pose tweaks without redefining whole tracks — cheap to iterate once the keyframe skeleton is in place.
  • get_sequence_info is the primary debugger — inspect bindings and tracks after every mutation.

Next: explore the full Sequencer reference or the Camera reference for deeper control.