Aller au contenu

Dialogue Editor

Le Dialogue Editor est l'outil que vous utilisez pour créer et écrire un Dialogue.

Un Dialogue est un asset qui contient une arborescence structurée de texte. Il est avant tout destiné à héberger des conversations entre un ou plusieurs personnages, que l'on peut transformer en séquences jouables et interactives — mais c'est d'abord et surtout un conteneur de données, si bien qu'il peut également alimenter d'autres mécaniques telles que des documents écrits, des interfaces informatiques diégétiques, etc.

Créer un Dialogue

Faites un clic droit dans le Content Browser ▸ Dialogue. Par convention, préfixez toujours l'asset avec D_.

Creating a Dialogue asset

Personnages

Pour que chaque ligne de contenu puisse être attribuée à un personnage qui parle (Speaker) et/ou écoute (Listener), on commence en général un dialogue en ajoutant les personnages qui y prennent part.

Utilisez les boutons jaunes de la barre d'outils pour ajouter un personnage et — après en avoir sélectionné un dans la liste — pour le retirer ou le remplacer.

Character list

Chaque personnage se voit attribuer une couleur utilisée sur ses lignes dans la vue principale. Faites glisser les personnages dans la liste pour permuter leurs couleurs.

Pour être utilisable dans un Dialogue, le Blueprint d'un personnage doit implémenter l'interface LBRDialogueCharacter.

Tip

La plupart des projets disposent d'une classe de base unique dont dérivent tous les personnages. Si cette classe de base implémente l'interface, vous pouvez créer un Blueprint par personnage à partir d'elle (ou d'une autre classe adaptée à votre projet).

Tip

Une classe de base pour les personnages intangibles (une voix au téléphone, un narrateur…) — voir ULBRIntangibleCharacter — n'a besoin que de définir des paramètres de voix et ne requiert aucune instance dans le niveau.

Le nom d'affichage par défaut est le nom de la classe. Pour le remplacer, implémentez LBRGetCharacterName. Un bon motif consiste à l'implémenter une seule fois dans la classe de base, à partir d'une variable Name que vous renseignez pour chaque personnage. Préférez du texte localisé, car ce nom peut être affiché en jeu (dans les sous-titres, par exemple). La classe de base ALBRSimpleDialogueCharacter fournie renvoie sa propriété CharacterName de cette manière.

Subdialogues

Les subdialogues sont l'élément structurel essentiel d'un Dialogue. Ils vous permettent de découper un dialogue de manière logique, afin de :

  • Tenir différentes conversations entre les mêmes personnages selon des contextes différents (par exemple un subdialogue lorsque le joueur parle à un personnage sans connaître une information clé, et un autre une fois qu'il la connaît).
  • Séparer des configurations différentes qui nécessitent un traitement spécifique lors de la génération (par exemple un subdialogue pour un tête-à-tête, un autre lorsqu'un troisième personnage se joint à la conversation).
  • Rendre les longs dialogues plus faciles à lire et à parcourir.
  • Structurer du contenu utilisé dans un autre contexte (par exemple un subdialogue par page lorsque le dialogue décrit un document écrit).

Un Dialogue contient toujours au moins un subdialogue. Par défaut, un Dialogue joue son premier subdialogue ; vous pouvez en demander un précis par son nom. À l'entrée, les subdialogues candidats sont évalués dans l'ordre — le premier qui correspond au nom demandé et dont la condition est satisfaite est joué.

La fin d'un subdialogue est la fin du Dialogue : utilisez un GoTo explicite pour sauter vers un autre subdialogue (uniquement au sein du même Dialogue). L'ordre des subdialogues dans la liste a son importance (voir GoTo ▸ Next Subdialogue ci-dessous).

Double-cliquez sur le nom d'un subdialogue pour l'ouvrir ; chaque subdialogue ouvert possède son propre onglet dans la vue principale. Chaque subdialogue peut redéfinir son contexte de mise en scène (placement des personnages, gestion des caméras…), mais la liste des personnages est partagée par l'ensemble du Dialogue.

Paramètres d'un subdialogue

La sélection d'un subdialogue affiche ses propriétés dans le panneau de détails :

Propriété Rôle
Name Unique au sein du Dialogue. Sert à la fois à naviguer dans l'éditeur et à générer le tag identifiant le subdialogue.
Selectors Tags utilisés pour sélectionner spécifiquement ce subdialogue, ou pour le regrouper thématiquement avec d'autres.
Condition Une condition dynamique qui autorise, ou non, le subdialogue à se jouer.
Stage Actor Class La classe de stage instanciée à la génération. Définit le placement des personnages et les types de caméras générés.
Dialogue Priority Le niveau de priorité utilisé lorsque deux subdialogues sont en concurrence.
Flags Configuration extensible via LBRGameplayTagFlags. Même s'ils ne sont pas affichés ici, un subdialogue est considéré comme ayant tous les flags par défaut du projet cochés, sauf s'il définit Libretto.Flags.Subdialogue.NoDefault.

Subdialogue list and details

Lignes

L'unité de base du contenu d'un Dialogue est la ligne. La plupart des lignes sont des répliques parlées, mais il en existe plusieurs types.

Chaque ligne possède un ID unique au sein du Dialogue (un entier positif). Vous pouvez également définir un Label optionnel, actuellement utilisé par les lignes GoTo.

Dans le cas d'usage visé (génération dynamique de séquences), seul le texte localisé des lignes Text et Reply est affiché en jeu — sous forme de sous-titres ou de choix de dialogue. Ce texte est coloré avec la couleur du Speaker ; le texte des autres types de ligne est blanc.

An interactive dialogue

Types de ligne

Type Rôle Paramètres clés
Text Le contenu parlé, affiché en jeu sous forme de sous-titres. Stage Direction (utilisée pour l'enregistrement audio — rédigez-la en anglais), Context, Speaker (avec postures et émotions ; s'il y en a un présent, une piste audio est générée), Listener (postures et émotions), Overlap Time (laisse les lignes se chevaucher pour que les personnages puissent s'interrompre).
Choice Propose au joueur un ensemble de réponses (Replies) parmi lesquelles choisir. Time — temps imparti pour faire le choix ; 0 signifie aucune limite de temps. Vous pouvez placer des lignes Text à l'intérieur d'un Choice, avant les Replies : elles se jouent pendant que le choix est affiché et peuvent être interrompues une fois un choix effectué.
Reply Une réponse du joueur à un Choice. Do Once (ne jouer qu'une fois), Default Reply (choisie lorsque le minuteur du Choice expire), Display Condition (si false, la Reply n'est ni proposée ni affichée), Availability Condition (si false, la Reply est affichée mais grisée et non sélectionnable).
GoTo Saute directement vers la ligne indiquée par son ID ou son Label. Undefined (-1) met fin au dialogue. Next Subdialogue (-2) saute vers la première ligne du subdialogue suivant (ou met fin au dialogue s'il n'y en a pas).
If / ElseIf / Else Fait bifurquer le dialogue sans intervention du joueur. Success Condition — si true, le joueur entre dans la branche ; sinon, le ElseIf/Else suivant est évalué. ElseIf/Else sont optionnels et vous pouvez enchaîner autant de ElseIf que nécessaire.
Silence Une simple pause. Time — la durée de la pause.
Cinematic Crée un fichier de séquence sans réplique parlée (cinématiques sans texte). Le texte fait office de commentaire.
Comment Visible uniquement dans l'éditeur, sans effet en dehors. Texte libre — pratique pour garder une idée, expliquer un concept ou clarifier la lecture.

Ordre de lecture après un bloc

Une fois qu'un Reply ou un bloc If/ElseIf/Else est terminé, la ligne suivante jouée est celle située immédiatement après le Choice / le bloc If, au même niveau d'indentation.

GoTo invalide

Un GoTo dont la valeur ne correspond à aucune ligne s'affiche en rouge, avec l'erreur dans son infobulle. Lorsqu'un GoTo valide est sélectionné, sa destination est mise en surbrillance et vous pouvez y sauter avec Go to line dans le panneau de détails.

Flux d'écriture & raccourcis

L'essentiel d'un dialogue s'écrit au clavier, sans toucher au panneau de détails. Sélectionnez une ligne, saisissez son texte, puis ajoutez la ligne suivante à l'aide de l'un des deux raccourcis :

Raccourci Ajoute
Ctrl+Enter Une nouvelle ligne Text avec le même Speaker et le même Listener que la ligne sélectionnée — le même personnage continue de parler.
Shift+Enter Une nouvelle ligne Text avec le Speaker et le Listener inversés — l'autre personnage répond.

Ces deux raccourcis couvrent l'essentiel d'une conversation en va-et-vient : Ctrl+Enter pour laisser un personnage continuer à parler, Shift+Enter pour confier la ligne suivante à l'autre personnage — inutile de définir le Speaker et le Listener à la main à chaque fois.

Inverser sur des lignes déjà écrites

Pour inverser qui parle et qui écoute sur des lignes existantes, sélectionnez-les et exécutez Swap Speaker/Listener (clic droit ▸ Swap Speaker/Listener).

Les autres types de ligne s'ajoutent depuis les boutons de la barre d'outils ou le menu du clic droit — Add Silence, GoTo, Choice, Reply, If, Else If, Else, Comment, Cinematic.

Raccourcis pratiques

Action Raccourci par défaut
Add Text — même speaker Ctrl+Enter
Add Text — inverser speaker/listener Shift+Enter
Déplacer la ligne vers le haut / le bas Alt+↑ / Alt+↓ (ou glisser-déposer)
Rechercher du texte dans le dialogue Ctrl+F
Rafraîchir les onglets F5
Jouer la voix / le TTS de la ligne Space
Jouer les lignes suivantes à la suite Ctrl+Space
Passer l'audio à la ligne suivante / précédente Ctrl+→ / Ctrl+←
Parcourir l'asset audio de la ligne Ctrl+Shift+Enter
Ouvrir l'audio de la ligne dans le Sequencer Ctrl+Shift+Space

L'aperçu audio n'est pas le mixage final

Space joue la voix enregistrée de la ligne (ou son TTS s'il n'y a pas d'enregistrement), et Ctrl+Space joue à la suite les lignes suivantes. Cet aperçu ne reflète pas le montage audio réalisé dans le Sequencer — ouvrez la séquence ou jouez-la dans le niveau pour obtenir le résultat réel.

Tout est remappable

Ce ne sont là que les liaisons par défaut. Modifiez n'importe laquelle dans Editor Preferences — recherchez « Dialogue Editor » pour trouver la liste des commandes Libretto.

Conditions

Plusieurs fonctionnalités d'étiquetage ajoutent des couches à l'interface du Dialogue Editor. Une condition permet à un subdialogue, à une Reply ou à une branche If de dépendre d'un état dynamique (par exemple vérifier qu'une valeur est en dessous d'un seuil).

A condition on a line and its Blueprint

Consultez la page Conditions pour la création de Blueprints de condition.

Vérifier qu'un dialogue a été joué

Pour tester « ce dialogue/subdialogue a-t-il été joué », utilisez la condition dédiée ULBRDialogueDoneCondition plutôt qu'une condition écrite à la main via un chemin de GPVar. Voir GPVars & Conditions.

Actions

Sur tous les types de ligne sauf Cinematic et Comment, vous pouvez ajouter des actions via le panneau de détails. Les actions sont des Blueprints exécutés au moment où la ligne se joue — un hook très flexible pour faire n'importe quoi pendant un dialogue : donner un objet à un PNJ, déclencher un événement de gameplay, afficher une interface, etc.

La classe de base d'une action est ULBRAction. Redéfinissez notamment DoAction (exécutée lorsque la ligne se joue en jeu) et GetLabel (ajoute une couche dans l'interface du Dialogue Editor).

An action on a line and its Blueprint

Tags & Flags

  • Add Tag / Remove Tag lèvent ou baissent directement des GPFlags (à la racine).
  • Flags attachent des métadonnées à une ligne, interprétées à la génération ou au moment de la lecture. Des flags par défaut existent pour modifier le style des sous-titres, mais vous pouvez créer vos propres GameplayTags afin d'ajouter des options propres à votre projet. Les flags par défaut définis sur le projet, le dialogue ou le subdialogue s'appliquent à toute ligne qui ne porte pas le flag NoDefault.

Identification dynamique par tag

Des GameplayTags uniques sont créés automatiquement pour identifier chaque Dialogue, Subdialogue, Choice et Reply :

Libretto.Dialogues.DialogueName[.SubdialogueName]
Libretto.Dialogues.DialogueName.Choice_ID[.Reply_ID]

Par défaut, ils sont générés au chargement du projet, par le LBRDynamicTagsSubsystem. Vous pouvez le désactiver via sa valeur bUseSubsystem dans le .ini ; une fois désactivé, les tags sont figés dans Config/DynamicTags/DynamicTags.ini (et l'association tag→index de dialogue dans Config/LBRDynamicTags.ini). Voir Dynamic tags pour les détails.

Ces tags servent à stocker des métadonnées (combien de fois un dialogue/subdialogue a été joué, combien de fois un choix a été sélectionné) dans le sous-système de GPVar.

Sequences

L'éditeur détecte automatiquement les subdivisions dont un dialogue a besoin pour s'exécuter correctement. Les lignes sont regroupées en sequences, utilisées lors de la génération et de la lecture dans le Sequencer — chaque sequence correspond à un asset Sequencer généré. La sélection d'une ligne éclaircit légèrement les autres lignes de la même sequence.

Une ligne commence une nouvelle sequence lorsqu'elle est :

  • la première ligne d'un subdialogue,
  • un Cinematic, Reply, ElseIf ou Else,
  • située juste après un Choice ou un If/ElseIf/Else,
  • la destination d'au moins un GoTo.

Une ligne termine une sequence lorsqu'elle est :

  • la dernière ligne d'un subdialogue,
  • un Cinematic, GoTo ou Choice.

Vue principale

Main view columns

Le menu View active ou désactive les colonnes de la vue principale. Quelques-unes à retenir :

  • Index — rarement utile pendant l'écriture, mais pratique pour le débogage : l'index auquel la ligne est stockée dans les tableaux de données de l'asset Dialogue. Mis à jour lorsque le Dialogue est sauvegardé.
  • Sequence — la sequence à laquelle appartient la ligne.
  • Tags — une aide visuelle pour repérer rapidement les lignes porteuses de métadonnées telles que des conditions ou des actions.

Panneau de recherche

Ctrl+F ouvre le panneau de recherche. Il recherche une sous-chaîne dans tout le dialogue (sans tenir compte de la casse) ; les petites flèches font défiler les correspondances. Si vous recherchez un nombre, appuyer sur Entrée (ou sur Go to ID) sélectionne directement l'ID correspondant, tandis que les flèches recherchent ce nombre à l'intérieur du texte.

Find panel

Panneau d'aperçu du texte

Le panneau Text Preview rend les balises de texte enrichi. Vous pouvez modifier la configuration du texte enrichi dans Project Settings ▸ Libretto – Dialogue Editor.

Menu contextuel

Faites un clic droit dans la vue principale pour ouvrir le menu contextuel, réparti en sections :

  • Spell Checker — voir Correction orthographique.
  • Open — ouvre la séquence Master ou Level dans le Sequencer à la bonne frame (vous devez d'abord générer le dialogue).
  • New / Delete — ajoute de nouvelles lignes (également dans la barre d'outils du haut) et supprime.
  • Move — déplace une ou plusieurs lignes vers le haut/le bas (également via glisser-déposer).
  • Expand / Collapse — déplie/replie toutes les lignes d'un coup. Shift+clic gauche sur la flèche d'une ligne déplie/replie ses enfants.
  • Copy — Copier/Couper/Coller. Paste special ouvre une petite fenêtre où vous choisissez ce qui accompagne les lignes copiées : leurs traductions dans toutes les langues, la voix enregistrée, le text-to-speech et le lip-sync. Les lignes collées reçoivent de nouveaux IDs, et cela fonctionne d'un dialogue à l'autre (copier dans l'un, paste special dans l'autre).
  • ID — copie l'ID de la ligne sélectionnée (collez-le directement dans un GoTo).

Context menu

Correction orthographique

L'éditeur utilise le correcteur orthographique intégré à Windows (celui de Word et d'Edge). Vous lui fournissez des mots ; il renvoie ceux qu'il ne connaît pas, accompagnés de suggestions orthographiques proches.

Le correcteur peut fonctionner au fil de l'édition d'une ligne, ou à la demande. Sur une « faute », la ligne devient rouge et le menu contextuel liste les erreurs avec des suggestions de remplacement. Si un mot n'est pas réellement une faute (un nom propre, un acronyme…), vous pouvez l'ajouter à un dictionnaire propre au projet, dans Resources/Libretto/personalDictionary.dic.

Exécutez-le sur l'ensemble du dialogue depuis Dialogue Tools ▸ Launch CheckSpeller.

Rien à installer, et aucun dictionnaire n'est livré avec le plugin : le correcteur utilise les langues installées dans Windows. Une culture à deux lettres prend la région principale de la langue (en → en-US, fr → fr-FR). Pour prendre en charge une autre langue, ajoutez-la dans Paramètres Windows ▸ Heure et langue ▸ Langue et région, puis redémarrez l'éditeur.

Correction orthographique en action

Règles de formatage automatiques

Lorsqu'une ligne est éditée, des règles fondées sur des expressions régulières peuvent corriger des erreurs très précises — par exemple imposer les espacements propres à une langue autour de la ponctuation, que l'inattention casse souvent. Configurez-les dans les Project Settings.

Format rules in Project Settings

Pour ajouter des règles à une langue, ajoutez une entrée à Rule by Culture avec cette langue et un jeu de règles :

  • Un jeu de règles est un Data Asset dérivant de ULBRFormatRules (avec le « s »), qui contient ses règles dans son tableau Rules.
  • Une règle est un Data Asset dérivant de ULBRFormatRule, définie par trois paramètres :
    • Pattern — une expression régulière correspondant au texte à corriger.
    • Index to Fix in Pattern — le décalage, depuis le début du texte correspondant, à corriger.
    • Fix Function Name — la fonction de correction. Actuellement UpperCase, RemoveSpace, InsertSpace (définies en C++ dans ULBRFormatRule).

Example

Règle UpperCaseAtBeginning sur la phrase « les jeux, c'est amusant. » — le pattern correspond au premier mot en minuscules « les », l'index pointe sur le premier caractère « l », et UpperCase le transforme en « L » → « Les jeux, c'est amusant. »

Une option Enable automatic capital par ligne permet de désactiver la règle de mise en majuscule en début de ligne.

Localisation & import/export

La traduction des dialogues, l'import et l'export de dialogues via CSV, ainsi que le suivi du statut de localisation/audio de chaque ligne sont traités sur leur propre page — voir Localization & import/export.

Paramètres

Dans Project Settings ▸ Libretto :

  • Dialogues Directory doit lister tous les Dialogues présents dans le jeu final (un répertoire racine ; les dialogues peuvent se trouver dans des sous-dossiers).
  • Base Culture doit être renseignée (par défaut en).
  • Extenders étendent les propriétés attachées aux lignes, aux subdialogues ou aux dialogues, en ajoutant des métadonnées éditables dans les panneaux de détails. Faites-les pointer vers une classe Blueprint contenant les variables à ajouter. ⚠️ Pour appliquer une modification d'Extender, fermez et rouvrez tous les Dialogues ouverts.
  • Vous pouvez ajouter des flags par défaut pour tous les subdialogues ou toutes les lignes, ainsi que des flags propres au projet au niveau ligne, subdialogue ou dialogue, en créant les GameplayTags correspondants dans la bonne hiérarchie.

Dans Editor Preferences ▸ Libretto – Dialogue Editor, vous pouvez modifier le comportement automatique du correcteur orthographique et de l'édition automatique, et personnaliser les couleurs. Rechercher « Dialogue Editor » dans les Editor Preferences permet aussi de personnaliser le raccourci de chaque commande.

Actions depuis le Content Browser

Faites un clic droit sur un ou plusieurs Dialogues pour accéder à plusieurs outils d'écriture par lot :

  • Find text — recherche du texte dans les dialogues sélectionnés et ouvre celui de la correspondance (un Ctrl+F en masse).
  • Count — statistiques de comptage de mots, copiées dans le presse-papiers au format CSV.

Les actions d'import / export ont été déplacées

Les actions d'import/export CSV (import de dialogue, export de localisation, Choices And Replies, Fix localization) se trouvent sur la page Localization & import/export.