This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Dialogue System

How to author and play back branching dialogue in GS_Play — dialogue databases, node types, conditions, effects, and the runtime sequencer.

The Dialogue System is the authoring and runtime core of GS_Cinematics. Dialogue content is stored in .dialoguedb assets (DialogueDatabase), which contain named actors and a collection of DialogueSequence records. Each sequence is a graph of polymorphic nodes. At runtime, GS_DialogueManagerComponent manages the database and maps performer names to entities in the level, while DialogueSequencerComponent drives playback — walking the graph, evaluating conditions on branches, executing effects, and emitting events that UI and other systems consume.

For architecture details, component properties, and extending the system in C++, see the Framework API reference.

Dialogue Manager component in the O3DE Inspector

 

Contents


Dialogue Database

Dialogue Authoring Pattern Graph

Breakdown

A dialogue sequence is authored in the node editor, stored in a .dialoguedb asset, and driven at runtime by the Dialogue Manager and Sequencer:

LayerWhat It Means
DialogueDatabaseStores named actors and sequences. Loaded at runtime by the Dialogue Manager.
DialogueSequenceA directed node graph. The Sequencer walks from startNodeId through Text, Selection, Effects, and Performance nodes.
ConditionsPolymorphic evaluators on branches. Failed conditions skip that branch automatically.
EffectsPolymorphic actions at EffectsNodeData nodes — set records, toggle entities.
PerformersNamed actor anchors in the level. Resolved from database actor names via DialoguePerformerMarkerComponent.

Conditions, effects, and performances are discovered automatically at startup — custom types from any gem appear in the editor without modifying GS_Cinematics.

E Indicates extensible classes and methods.

Patterns - Complete list of system patterns used in GS_Play.

DialogueDatabase Asset

Dialogue Database asset in the O3DE Editor

The DialogueDatabase is a .dialoguedb asset authored in the O3DE node editor. It is the single source of truth for all dialogue content in a project section.

Asset ContentsPurpose
ActorsNamed character definitions with portrait and metadata.
SequencesNamed DialogueSequence records, each a graph of nodes.

Load a database at runtime by calling ChangeDialogueDatabase on DialogueManagerRequestBus. The manager resolves performer names from the database against DialoguePerformerMarkerComponent entities placed in the current level.


Node Types

Each sequence is a directed graph of DialogueNodeData nodes. The sequencer walks the graph starting from startNodeId and advances through the nodes in order.

Node TypeWhat It Does
TextNodeDataDisplays a speaker line. Supports LocalizedStringId for localization.
SelectionNodeDataPresents the player with a list of choices. Branches based on selection.
RandomNodeDataSelects a random outgoing branch.
EffectsNodeDataExecutes one or more DialogueEffect objects without advancing to a text node.
PerformanceNodeDataTriggers a DialoguePerformance action and waits for OnPerformanceComplete before continuing.

Conditions

Conditions are polymorphic objects attached to sequence branches. The sequencer evaluates all conditions on a branch before following it. Branches whose conditions fail are skipped.

Condition TypeWhat It Evaluates
Boolean_DialogueConditionA base boolean comparison.
Record_DialogueConditionChecks a game record via the RecordKeeper system. Extends Boolean_DialogueCondition.

Effects

Effects are polymorphic objects executed when the sequencer reaches an EffectsNodeData node. Effects can also be reversed.

Effect TypeWhat It Does
SetRecords_DialogueEffectSets one or more game records via the RecordKeeper system.
ToggleEntitiesActive_DialogueEffectToggles one or more entities active or inactive.

Performances

Performances are polymorphic objects executed when the sequencer reaches a PerformanceNodeData node. A performance can be blocking — the sequencer pauses and waits for OnPerformanceComplete before advancing — or non-blocking, where dialogue continues immediately after the performance fires.

Like conditions and effects, performance types are discovered automatically at startup via the type registry. Custom performance types from any gem appear in the editor without modifying GS_Cinematics.

Performance TypeWhat It Does
MoveTo_DialoguePerformanceSmoothly moves a named performer to a CinematicStageMarkerComponent position. Fires MoveTo_PerformanceNotificationBus — a companion component on the performer entity responds and moves it, then signals completion.
PathTo_DialoguePerformanceNavigates a named performer to a marker using the scene navmesh. Uses RecastNavigation pathfinding through the world geometry rather than a direct interpolation.
RepositionPerformer_DialoguePerformanceInstantly teleports a performer to a marker. Non-blocking — dialogue advances without waiting.

Runtime Playback

GS_DialogueManagerComponent

The Dialogue Manager is the top-level manager for all dialogue. It holds the active DialogueDatabase, maps performer names to level entities via DialoguePerformerMarkerComponent, and is the entry point for starting sequences by name.

BusMethodWhat It Does
DialogueManagerRequestBusStartDialogueSequenceByNameStarts a named sequence from the active database.
DialogueManagerRequestBusChangeDialogueDatabaseLoads a different DialogueDatabase asset.
DialogueManagerRequestBusRegisterPerformerMarkerRegisters a performer entity by name for the current level.
DialogueManagerRequestBusGetPerformerReturns the entity for a named performer.

DialogueSequencerComponent

The Dialogue Sequencer drives sequence playback. It walks the node graph, evaluates conditions, executes effects, triggers performances, and emits notifications when text lines begin and when the sequence completes. It is typically placed on a dedicated sequencer entity in the level alongside DialogueUIBridgeComponent.

BusMethod / EventPurpose
DialogueSequencerRequestBusStartDialogueBySequenceBegins playback of a given sequence object.
DialogueSequencerNotificationBusOnDialogueTextBeginFires when a TextNodeData begins — carries speaker and text data.
DialogueSequencerNotificationBusOnDialogueSequenceCompleteFires when the sequence reaches its end node.

Localization

Text nodes store speaker lines as LocalizedStringId references rather than raw strings. A LocalizedStringId holds a key and a default fallback text. At runtime, the sequencer calls Resolve() on each LocalizedStringId, which looks up the key in the active LocalizedStringTable and returns the localized string for the current locale. If no table is loaded or the key is not found, the default text is returned.

To use localization, load a LocalizedStringTable asset through your project’s initialization flow before any dialogue plays.


ScriptCanvas Usage

Starting a Dialogue Sequence

Reacting to Sequence States

Listen on DialogueSequencerNotificationBus to receive speaker and text data as each line begins:


Quick Reference

NeedBusMethod / Event
Start a sequence by nameDialogueManagerRequestBusStartDialogueSequenceByName
Load a different databaseDialogueManagerRequestBusChangeDialogueDatabase
Register a performer in the levelDialogueManagerRequestBusRegisterPerformerMarker
Get a performer entityDialogueManagerRequestBusGetPerformer
Start a sequence object directlyDialogueSequencerRequestBusStartDialogueBySequence
React to a text line startingDialogueSequencerNotificationBusOnDialogueTextBegin
React to sequence completionDialogueSequencerNotificationBusOnDialogueSequenceComplete

Glossary

TermMeaning
DialogueDatabaseA .dialoguedb asset containing actors and dialogue sequences
DialogueSequenceA graph of nodes that defines a single dialogue conversation
DialogueNodeDataA polymorphic node in the sequence graph (Text, Selection, Random, Effects, Performance)
DialogueConditionA polymorphic evaluator attached to branches that gates progression
DialogueEffectA polymorphic action executed at EffectsNodeData nodes (e.g., setting records)
DialoguePerformanceA polymorphic action executed at PerformanceNodeData nodes — moves, paths, or repositions performers. Can be blocking or non-blocking
PerformerA named actor entity in the level mapped from the database via DialoguePerformerMarkerComponent

For full definitions, see the Glossary.


See Also

For the full API, component properties, and C++ extension guide:

For related systems:


Get GS_Cinematics

GS_Cinematics — Explore this gem on the product page and add it to your project.

1 - Dialogue UI

How to display dialogue text, player choices, and typewriter effects in GS_Play — screen-space and world-space UI components and the bridge that connects them to the sequencer.

The Dialogue UI layer is the display side of the GS_Cinematics system. It receives events from DialogueSequencerComponent through DialogueUIBridgeComponent and routes them to the correct UI implementation — screen-space for HUD-style dialogue or world-space for speech bubbles above actors. Player choices are handled by selection components, and the TypewriterComponent reveals text character-by-character. BabbleComponent optionally plays per-character audio babble to give speakers a voice.

For architecture details, component properties, and extending the system in C++, see the Framework API reference.

DialogueUIComponent canvas in the O3DE UI Editor

 

Contents


Component Overview

ComponentSpacePurpose
DialogueUIComponentScreenDisplays the current speaker line on the HUD.
WorldDialogueUIComponentWorldDisplays speech bubbles positioned above actors in 3D space.
DialogueUISelectionComponentScreenRenders player choice options on the HUD.
WorldDialogueUISelectionComponentWorldRenders player choice options in 3D world space.
DialogueUIBridgeComponentRoutes sequencer events to UI and player input back to sequencer.
TypewriterComponentReveals text one character at a time with configurable timing.
BabbleComponentPlays per-character audio babble for the active speaker.

DialogueUIBridgeComponent

The Bridge component is the central connector between the sequencer and the UI. Place it on the same entity as DialogueSequencerComponent. It listens for OnDialogueTextBegin and OnDialogueSequenceComplete from the sequencer and forwards those events to whatever UI components are registered with it. It also receives player selection events from the selection UI and forwards them back to the sequencer.

This design keeps the sequencer and the display fully decoupled — swapping in a new UI implementation only requires registering it with the Bridge.

BusMethodWhat It Does
DialogueUIBridgeRequestBusRunDialogueSends a text line to the registered dialogue UI.
DialogueUIBridgeRequestBusRunSelectionSends selection options to the registered selection UI.
DialogueUIBridgeRequestBusRegisterDialogueUIRegisters a UI entity as the active dialogue display target.
DialogueUIBridgeRequestBusCloseDialogueTells the registered UI to close.
DialogueUIBridgeNotificationBusOnDialogueCompleteFires when the dialogue UI reports it has finished displaying.
DialogueUIBridgeNotificationBusOnSelectionCompleteFires when the player makes a selection.

Dialogue Display Components

Screen-Space Text

DialogueUIComponent handles HUD-style dialogue display. Add it to a UI canvas entity. It exposes the active TypewriterComponent so other systems can check typewriter state or force completion.

World-Space Speech Bubbles

WorldDialogueUIComponent extends DialogueUIComponent for world-space placement. It positions the dialogue panel above the speaking actor’s entity in 3D space. Use this for over-the-shoulder dialogue or conversations where the camera stays in the world rather than cutting to a UI overlay.


Selection Components

Screen-Space Choices

DialogueUISelectionComponent renders the player’s available choices as a list on the HUD. Each choice is backed by a DialogueSelectButtonComponent entity that is configured with option text and a selection index. When the player activates a button, it fires back through the Bridge to the sequencer.

World-Space Choices

WorldDialogueUISelectionComponent extends DialogueUISelectionComponent for world-space display. Choices appear positioned in 3D space rather than as a HUD overlay, useful for games with diegetic UI.


TypewriterComponent

TypewriterComponent in the O3DE Inspector

The TypewriterComponent reveals a string one character at a time. It fires OnTypeFired for each character revealed and OnTypewriterComplete when the full string is displayed. Use ForceComplete to instantly reveal the remaining text — typically wired to a player skip input — and ClearTypewriter to reset the display to empty.

BusMethod / EventWhat It Does
TypewriterRequestBusStartTypewriter(text)Begins revealing the given string character by character.
TypewriterRequestBusForceCompleteInstantly reveals all remaining characters.
TypewriterRequestBusClearTypewriterClears the display and resets state.
TypewriterNotificationBusOnTypeFiredFires each time a character is revealed.
TypewriterNotificationBusOnTypewriterCompleteFires when the full string has been revealed.

BabbleComponent

BabbleComponent pairs with TypewriterComponent to play short audio sounds for each character revealed, giving the impression of a speaker’s voice. Each actor has a SpeakerBabbleEvents record that maps them to a specific babble sound profile. The component returns the correct BabbleToneEvent for the current speaker via GetBabbleEvent, which is called by the typewriter on each OnTypeFired.

BusMethodWhat It Does
BabbleRequestBusGetBabbleEventReturns the babble audio event for the active speaker.

ScriptCanvas Usage

Forcing Typewriter Completion on Skip Input

Wire a player input action to ForceComplete so pressing a button instantly reveals the current line:

Reacting to Typewriter Events


Quick Reference

NeedBusMethod / Event
Route sequencer events to UIDialogueUIBridgeRequestBusRunDialogue / RunSelection
Register a UI entity with the bridgeDialogueUIBridgeRequestBusRegisterDialogueUI
Close the dialogue UIDialogueUIBridgeRequestBusCloseDialogue
React when dialogue UI finishesDialogueUIBridgeNotificationBusOnDialogueComplete
React when player makes a choiceDialogueUIBridgeNotificationBusOnSelectionComplete
Start typewriter revealTypewriterRequestBusStartTypewriter
Skip / instantly reveal textTypewriterRequestBusForceComplete
Clear the typewriter displayTypewriterRequestBusClearTypewriter
React to each character revealTypewriterNotificationBusOnTypeFired
React to full text revealedTypewriterNotificationBusOnTypewriterComplete
Get babble event for speakerBabbleRequestBusGetBabbleEvent

Glossary

TermMeaning
DialogueUIBridgeThe connector component that routes sequencer events to UI and player input back to the sequencer
TypewriterA text reveal component that displays characters one at a time with configurable timing
BabblePer-character audio playback that simulates a speaker’s voice during typewriter text reveal

For full definitions, see the Glossary.


See Also

For the full API, component properties, and C++ extension guide:

For related systems:


Get GS_Cinematics

GS_Cinematics — Explore this gem on the product page and add it to your project.

2 - Performances

How to move and reposition actors during dialogue in GS_Play — the polymorphic performance system, built-in movement types, and async completion.

Performances are polymorphic actions that move or reposition actors during dialogue sequences. The sequencer triggers a performance when it reaches a PerformanceNodeData node and waits for OnPerformanceComplete before advancing. This async model lets multi-step actor choreography complete fully before dialogue continues. Three built-in performance types cover direct movement, navmesh navigation, and instant teleportation. Custom types can be created by extending the base class.

For architecture details, component properties, and extending the system in C++, see the Framework API reference.

Dialogue Performer Marker component in the O3DE Inspector Performance Node in the Dialogue Editor

 

Contents


How Performances Work

When the sequencer encounters a PerformanceNodeData node, it:

  1. Resolves the named performer entity via DialogueManagerRequestBus → GetPerformer.
  2. Instantiates the performance object specified on the node.
  3. Calls DoPerformance() — the public entry point.
  4. Waits. The sequencer does not advance until the performance broadcasts OnPerformanceComplete.
  5. Resumes from the next node once completion is received.

The performance itself handles the movement logic, monitors completion, and signals back through its notification bus. This means a single PerformanceNodeData can represent any action that takes time — walking to a spot, running a path, playing an animation, triggering a VFX sequence — as long as it broadcasts completion when done.


Built-in Performance Types

Performance TypeMovement MethodWhen to Use
MoveTo_DialoguePerformanceDirect translation to marker(s)Open areas, stylized movement, non-physical traversal.
PathTo_DialoguePerformanceRecastNavigation pathfindingRealistic navigation around obstacles and geometry.
RepositionPerformer_DialoguePerformanceInstant teleport to markerOff-screen repositioning between scenes, no visible movement needed.

All three extend DialoguePerformance, the abstract base class. The base class provides DoPerformance(), ExecutePerformance(), and FinishPerformance() hooks, plus TickBus integration for per-frame movement updates.


MoveTo_DialoguePerformance

MoveTo_DialoguePerformance translates an actor toward one or more named stage markers using direct movement — no obstacle avoidance, no navmesh. It broadcasts movement requests over MoveTo_PerformanceNotificationBus. Listening systems (typically the performer’s movement component) receive those requests and execute the actual translation. When the actor reaches the final marker, the performance calls FinishPerformance() and broadcasts completion.

Use this for stylized games where physical path correctness is less important than snappy, predictable actor placement, or for any case where the path between actor and marker is guaranteed to be clear.

BusPurpose
MoveTo_PerformanceRequestBusQuery state of the performance.
MoveTo_PerformanceNotificationBusReceives move-to-marker requests from the performance.

PathTo_DialoguePerformance

PathTo_DialoguePerformance navigates an actor to one or more named stage markers using the RecastNavigation navmesh. It requests a path from the navmesh, walks the actor along that path, and completes when the actor arrives at the final marker. Use this in games with detailed geometry where actors must walk around walls, furniture, and obstacles rather than moving in a straight line.

RecastNavigation must be enabled in the project and a navmesh must be baked in any level where PathTo performances are used.

BusPurpose
PathTo_PerformanceRequestBusQuery state of the performance.
PathTo_PerformanceNotificationBusReceives path-to-marker requests from the performance.

RepositionPerformer_DialoguePerformance

RepositionPerformer_DialoguePerformance teleports an actor instantly to a named stage marker. It does not animate, translate, or navigate — it sets position directly. Useful for placing actors at the start of a new scene, recovering from a previous sequence that ended far from the required starting point, or repositioning actors that are off-camera and do not need visible movement.

BusPurpose
RepositionPerformer_PerformanceNotificationBusReceives teleport requests from the performance.

Async Completion

All performances signal completion asynchronously. The sequencer does not poll or time out — it simply waits for the performance to call FinishPerformance(), which broadcasts OnPerformanceComplete over the appropriate notification bus. This means:

  • A performance can take any amount of time.
  • A performance can be driven by external events — animation callbacks, physics arrival, etc.
  • Multiple performances can run in parallel if the node graph is structured to fork, because each notifies independently.

When writing custom performance types, always call FinishPerformance() when the action is done. Forgetting to do so will stall the sequencer indefinitely.


Extending with Custom Performances

Custom performance types are discovered automatically through O3DE serialization at startup. Extend DialoguePerformance, reflect it, and your custom type appears in the node editor’s performance picker and can be placed on any PerformanceNodeData node.

See the Framework API reference for the full base class interface and extension guide.


ScriptCanvas Usage

Performances are authored in the dialogue node graph and executed automatically by the sequencer. Most projects do not need to drive performances from ScriptCanvas directly. The common scripting patterns involve the movement side — receiving move or path requests from a performance and executing them on the performer entity.

Receiving a MoveTo Request

[MoveTo_PerformanceNotificationBus → StartMoveToMarker(markerEntity)]
    └─► [Move performer toward markerEntity position]
    └─► [When arrived → MoveTo_PerformanceRequestBus → ReportArrival]

Receiving a Reposition Request

[RepositionPerformer_PerformanceNotificationBus → RepositionToMarker(markerEntity)]
    └─► [Set performer transform to markerEntity transform]

Quick Reference

NeedBusMethod / Event
Receive a MoveTo move requestMoveTo_PerformanceNotificationBusStartMoveToMarker
Receive a PathTo navigation requestPathTo_PerformanceNotificationBusStartPathToMarker
Receive a reposition teleport requestRepositionPerformer_PerformanceNotificationBusRepositionToMarker
Query active MoveTo stateMoveTo_PerformanceRequestBus(see Framework API)
Query active PathTo statePathTo_PerformanceRequestBus(see Framework API)

Glossary

TermMeaning
PerformanceA polymorphic action that moves or repositions an actor during a dialogue sequence
PerformanceNodeDataA dialogue graph node that triggers a performance and waits for completion
Async CompletionThe pattern where the sequencer waits for OnPerformanceComplete before advancing

For full definitions, see the Glossary.


See Also

For the full API, component properties, and C++ extension guide:

For related systems:


Get GS_Cinematics

GS_Cinematics — Explore this gem on the product page and add it to your project.