Exécution & séquençage¶
Je veux qu'un volume de déclenchement ou un objet interactif démarre un dialogue¶
Gardez une référence à la Dialogue Instance placée et appelez StartDialogueInstance dessus — c'est
tout ce dont un déclencheur a besoin. Depuis l'événement d'overlap de votre volume de déclenchement,
ou l'événement « use » de votre objet interactif, appelez l'instance et le dialogue se joue. Les
sélecteurs et les requêtes de point d'entrée servent uniquement à choisir quel sous-dialogue
s'exécute — vous n'avez besoin de rien de tout cela pour simplement lancer.

- Placez votre Dialogue dans le niveau (déposez l'asset) pour obtenir un
ALBRDialogueInstance, et exposez-en une référence sur votre déclencheur (une variable instance-editable, ou une référence de niveau). - Depuis votre événement de déclenchement/interaction, appelez
StartDialogueInstancesur cette instance. Terminé — aucun flag, aucun sélecteur requis. - Seulement si vous voulez que les designers choisissent le dialogue et un sélecteur depuis le
panneau de détails de l'acteur, utilisez plutôt le schéma de point d'entrée : ajoutez un
DialogueEntryPoint(FLBRAnyDialogueEntryPoint, instance-editable), implémentez l'interfaceLBRHasGPTagMeta(surchargezGetGPTagRootFilterpour renvoyerALBRDialogueInstance::GetSubdialogueSelectorsCategoriesFromAnyEntryPoint(DialogueEntryPoint)afin que la liste déroulante des sélecteurs se remplisse), et lancez avecStartDialogueWithAnyEntryPoint— qui accepte aussi un Dialogue générique, pas seulement une instance placée.
Piège
Si vous utilisez le schéma de point d'entrée avancé, ne mettez jamais de breakpoint dans
GetGPTagRootFilter — l'éditeur l'appelle pendant qu'il dessine le panneau de détails, donc
s'y arrêter peut geler l'éditeur et forcer une fermeture brutale. Pour le cas simple, il n'y a rien
à surveiller : StartDialogueInstance joue simplement l'instance.
Voir aussi : Runtime — démarrer depuis Blueprint · Runtime — déclencher depuis vos propres objets · Prise en main
Je veux qu'un même Dialogue joue une scène différente selon la situation¶
Placez la logique d'embranchement dans la condition de chaque sous-dialogue, puis démarrez simplement le dialogue normalement — Libretto parcourt les sous-dialogues d'entrée dans l'ordre et joue le premier dont la condition passe. Un même asset Dialogue peut contenir plusieurs entrées (une salutation, une première rencontre, une variante post-quête) ; une condition sur chacune est la façon la plus propre de dire « celle-ci s'applique quand… », et vous n'avez pas à coder le choix dans l'appelant.
- Sur chaque sous-dialogue d'entrée, définissez une condition (
ULBRDialogueDoneCondition— GPVars, gameplay tags, votre propre vérification personnalisée). Ordonnez les entrées de la plus spécifique à la plus générale : la variante post-quête au-dessus de la variante première rencontre, elle-même au-dessus de la salutation par défaut. -
Lancez simplement avec
StartDialogueInstance. Les candidats sont évalués dans l'ordre de la liste et le premier dont la condition passe est joué — laissez une dernière entrée sans condition comme repli par défaut attrape-tout.
-
Seulement si l'appelant doit forcer une variante particulière (pas l'état du monde), recourez aux sélecteurs : taguez les sous-dialogues et démarrez avec
StartDialogueWithSelector/…Selectors/…SelectorQuery/…AnySelector. Sélecteurs et conditions se combinent — le premier sous-dialogue dont les sélecteurs correspondent et dont la condition passe l'emporte.
Piège
Préférez les conditions plutôt que de décider de l'embranchement dans l'appelant. Les
sélecteurs sont un levier de ciblage pour quand le code appelant doit vraiment choisir une
variante ; mettre la logique situationnelle dans la condition du sous-dialogue garde l'embranchement
avec le contenu et le rend réutilisable depuis tous les points de lancement. Si les tags de
sélecteur sur un nœud StartDialogue* semblent périmés, recompilez le Blueprint ; et notez que
l'ancien StartDialogue(SubdialogueName) est déprécié.
Voir aussi : Conditions · Runtime — démarrer depuis Blueprint · Runtime — sélecteurs de sous-dialogue
Je veux exécuter du code à la fin d'un dialogue¶
Choisissez le callback adapté à la portée voulue : la broche End Event se déclenche pour une lecture
précise, DialogueEndEvent se déclenche à chaque sortie de cette instance, et le OnDialogueEnd du
manager se déclenche globalement. Les trois reçoivent la fin — utilisez le plus étroit qui couvre
votre cas.

- Cette lecture uniquement — câblez un événement sur la broche End Event du nœud
StartDialogue*que vous avez appelé. Elle se déclenche une fois, quand cet appel se termine. -
Chaque sortie de cette instance — sur la Dialogue Instance placée, utilisez Actor ▸ Add Event ▸
DialogueEndEvent(un delegate multicast surALBRDialogueInstance). Elle se déclenche quelle que soit la façon dont le dialogue a été lancé.
3. N'importe où dans le projet — bindez le OnDialogueEndglobal du Dialogue Manager (ALBRDialogueInstance*, raison de fin) pour réagir de façon centralisée.
Piège
La broche End Event ne se déclenche que pour l'appel StartDialogue* qui l'a définie. Si le
même dialogue est lancé plus tard autrement — un déclencheur, un autre script — cette broche n'est
pas appelée. Pour un callback qui survit aux différents lancements, utilisez plutôt
DialogueEndEvent (par instance) ou OnDialogueEnd (global).
Voir aussi : Runtime — action à la fin d'un dialogue · Runtime — lister les dialogues en cours
Je veux que le joueur passe la réplique courante — ou arrête complètement le dialogue¶
Avancer et terminer sont deux appels différents : SentenceSkip saute d'une réplique vers l'avant,
tandis que StopDialogue (ou StopAll) met fin à la lecture. Câblez-les sur vos entrées ; le player
de la showcase mappe déjà une action Skip line et une action Stop all dialogues que vous pouvez
copier.

- Passer en avant / arrière — appelez
SentenceSkip/SentenceSkipBacksur la Dialogue Instance en cours. Protégez l'entrée avec leCanSkipdu manager pour ne la proposer que lorsqu'il existe une destination valide. - Passer un bloc entier — définissez le flag de sous-dialogue
SkipAsWhole(TAG_LBRSubDialogueFlag_SkipAsWhole) : dans ce sous-dialogue, un skip saute au sous-dialogue suivant au lieu de la phrase suivante — pratique pour les intros passables que vous ne voulez pas parcourir réplique par réplique. - Arrêter un dialogue en cours — appelez l'un des helpers du Dialogue Manager avec une raison de
fin :
StopDialogue(une instance),StopDialogueInstancesForDialogue(toutes les instances d'un asset),StopDialogueInstancesInvolving(toutes les instances impliquant un personnage donné), ouStopAll.
Piège
Arrêter n'est pas passer. StopDialogue met fin au dialogue — comme l'issue de priorité
Interrupt, les effets de bord qui ne s'étaient pas encore déclenchés (GPFlags levés sur des
répliques ultérieures, actions de ligne) ne s'exécuteront pas. SentenceSkip n'avance
rapidement qu'au sein du même dialogue, donc ses répliques produisent quand même leurs effets. La
showcase câble les deux sur ALBRShowcasePlayer (input actions SkipDialogueLine /
StopAllDialogues) si vous voulez une référence fonctionnelle.
Voir aussi : Runtime — arrêter un dialogue · Priorités — dialogues ignorés & interrompus
Deux dialogues entrent en collision — je veux contrôler lequel l'emporte¶
Donnez à chaque dialogue un niveau de priorité et laissez le système de priorités résoudre la paire ; par défaut, celui d'index le plus bas (le plus important) interrompt, l'autre est ignoré. Vous n'ajustez cela que lorsque deux dialogues peuvent réellement se chevaucher — un bark se déclenchant pendant une scène mise en scène, par exemple.
- Assurez-vous que vos niveaux de priorité sont enregistrés et ordonnés dans Project Settings ▸
Libretto ▸
DialoguePriorities— l'index 0 est le plus important. - Pour les paires nécessitant un traitement particulier, définissez l'issue dans l'éditeur de
priorités (
EWBP_LBRDialoguePriorities), par contexte (qui est présent). Laissez le reste au comportement par défaut basé sur l'ordre des index. - Choisissez des issues qui prennent réellement effet aujourd'hui (voir le piège) : Interrupt, Pause ou Ignore.
Piège
Muffle / Mute / PlayMuffled / PlayMuted se comportent actuellement comme Play pour le son.
Ils positionnent le flag d'exécution et calculent un modificateur de volume, mais le plugin de base
ne peut pas l'appliquer (le hook de filtre audio côté moteur n'est pas disponible), donc le dialogue
affecté continue de jouer à plein volume. Pour un comportement de priorité fiable aujourd'hui,
tenez-vous-en à Interrupt, Pause ou Ignore.
Voir aussi : Priorités — référence complète · Priorités — comportement par défaut
Je veux jouer un dialogue sans instance placée (messagerie vocale, comms, une scène générée à la volée)¶
Générez le Dialogue directement depuis l'asset (sans instance), puis démarrez-le avec une fonction
StartGenericDialogue* accompagnée d'un transform de spawn — Libretto spawne la Dialogue Instance pour
vous. Un dialogue générique est simplement un dialogue qui se joue sans ALBRDialogueInstance
pré-placée ; une voix off en est un usage, mais il peut tout aussi bien porter des personnages mis en
scène et de l'animation spawnés au transform que vous passez.
- Générez-le depuis l'asset — clic droit sur le Dialogue ▸ Libretto ▸ Generate Sequences… (et Generate Assets… d'abord pour l'audio). Comme ce chemin ne prend aucune Dialogue Instance, ce qu'il produit est un dialogue générique — il n'existe pas de commande « generate as generic » séparée.
- À l'exécution, appelez la variante dont vous avez besoin, en passant le transform de spawn :
StartGenericDialogue,StartGenericDialogueWithSelector,StartGenericDialogueWithSelectors, ouStartGenericDialogueWithSelectorQuery. Chacune renvoie l'ALBRDialogueInstancespawnée. - Si vous ne savez pas à l'avance si vous détenez une instance placée ou un Dialogue générique,
utilisez la fonction statique
StartDialogueWithAnyEntryPoint— elle accepte les deux.
Piège
« Générique » concerne la façon dont il est lancé (spawné depuis l'asset vs. une instance placée), pas le fait qu'il ait des corps : les personnages mis en scène, les caméras et l'animation fonctionnent aussi dans un dialogue générique. Assurez-vous toutefois que les personnages dont il a besoin sont bien présents dans le niveau au moment de son exécution, car un lancement générique n'apporte aucune instance placée pour porter les références de niveau.
Les dialogues génériques ne sont pas cookés dans un build packagé par défaut
Comme un dialogue générique n'a aucune instance placée dans une map, rien dans les niveaux cookés ne le référence — le cooker ne l'atteint donc jamais et il (avec ses séquences générées) se retrouve exclu du package. Il se joue normalement dans l'éditeur et en PIE, mais dans un build packagé le lancement ne fait silencieusement rien. Corrigez-le en cookant le dossier explicitement : Project Settings ▸ Packaging ▸ Additional Asset Directories to Cook (aussi appelé Directories to always package) — ajoutez le répertoire de contenu qui contient le Dialogue générique et ses séquences générées, puis repackagez.
Jouer la voix en 2D (messagerie vocale / interphone)
Une messagerie vocale, un interphone ou une comm radio veulent généralement que la voix se joue à plat en 2D, sans être spatialisée quelque part dans le monde. Deux façons de l'obtenir :
- Cochez
Libretto.Flags.Subdialogue.Staging.Audio2Dsur le sous-dialogue — chaque réplique qu'il contient est alors placée sur une piste audio racine (non bindée) et jouée en 2D, quelle que soit la mise en scène. - Ou confiez les répliques à un personnage intangible — il n'a aucun binding de corps, donc sa voix se joue en 2D par défaut, quels que soient les flags du sous-dialogue.
Voir aussi : Runtime — dialogues génériques · Personnages intangibles · Une messagerie vocale avec sa transcription dans une UI de téléphone