Cutscenes

Tracks of clips on a time axis - the camera moves, a character walks over, a line is said. Like Unity's Timeline, no code.

The timeline dock under the 3D view, previewing a camera shot
The Showcase crystal's cutscene: two camera shots, a flash and a sound, two lines. The 3D view shows the shot at the playhead.

Make one

  1. Select the object the cutscene belongs to - the crystal - and Add Behaviour ▸ Cutscene.
  2. Begins: OnTalk plays it when the player talks to the object (walks into it, with On Walk In); OnEnterMap the moment the map is entered; Manual only from code. Once plays it once per save; If and Then are flags to gate it and to set when it ends.
  3. Open timeline…. The dock appears under the 3D view.

The dock

The timeline dock: tracks on the left, clips on the lanes, the picked clip's arguments on the right
Tracks left, lanes middle, the picked clip's arguments right. The red line is the playhead; the dashed one the end.
DoResult
+ Track…A row: object, hero, camera, dialogue, screen, audio or game
Double-click a laneA clip there (the track's first kind)
Right-click a laneEvery kind of clip the track takes
Drag a clipMove it; its right edge changes the length
Click a clipIts arguments on the right
Drag the rulerScrub - the 3D view previews
SpacePlay / pause the preview
Delete, Ctrl+DRemove, duplicate the picked clip
🔊Mute a track

Every edit autosaves and is one Ctrl+Z step, like anything on the map.

A first scene, step by step

  1. Camera track ▸ a camera clip. Fly the 3D view to where the shot should stand, then ← view on Position and on Looks at. Length 2 s: the camera glides there from wherever it is.
  2. Object track for the fox (pick it as the track's target) ▸ a move clip. ← selection or pick… a spot on the ground for To. A character walks there with its walking animation; a model glides.
  3. Dialogue track ▸ a say clip with the line. It holds the playhead until the player dismisses it, so put it after the moves, not under them.
  4. Screen track ▸ a flash on the beat; audio ▸ a sound.
  5. Camera track ▸ follow hero at the end, so the camera comes back.
  6. Play in OpenFF in the dock's bar: the game starts on this map with the cutscene playing. B skips it.
The cutscene in the game: a low shot and a line
The first shot and its line, in the game.
The second shot from above
The second shot. The hero stands still while it plays and can still advance the lines.
Two rules of thumb. A say with hold pauses every track - camera moves go between lines, or untick hold. And ease is smooth unless you want a mechanical linear.

What the clips are

Object and hero tracks: move, turn (to a yaw or toward @hero / an object), motion (a pose by index), show / hide, fade, scale, glTF clip. Camera: camera, follow hero, shake, zoom. Dialogue: say, ask (yes/no, flags either way). Screen: fade out, fade in, flash. Audio: sound, music, stop music. Game: flags, wait, warp, battle, give item, signal (for code). Every argument is in the reference.

It is a file

The timeline is data in the scene file, so it can be written or generated by hand:

{ "target": "Crystal", "behaviour": "Cutscene", "fields": {
  "Begins": "OnTalk", "Once": true,
  "Timeline": { "tracks": [
    { "name": "Camera", "kind": "camera", "clips": [
      { "type": "camera", "start": 0, "length": 2.5,
        "args": { "position": { "x": 20, "y": 17, "z": -16 }, "target": { "x": 0, "y": 8, "z": 4 } } },
      { "type": "follow", "start": 7.5, "length": 0, "args": {} } ] },
    { "name": "Dialogue", "kind": "dialogue", "clips": [
      { "type": "say", "start": 2.6, "length": 1.4,
        "args": { "text": "The crystal wakes at your touch,\nand the shrine holds its breath." } } ] }
  ] } } }