Aller au contenu

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.

Un acteur personnalisé exposant un DialogueEntryPoint / une référence d'instance

  1. 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).
  2. Depuis votre événement de déclenchement/interaction, appelez StartDialogueInstance sur cette instance. Terminé — aucun flag, aucun sélecteur requis.
  3. 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'interface LBRHasGPTagMeta (surchargez GetGPTagRootFilter pour renvoyer ALBRDialogueInstance::GetSubdialogueSelectorsCategoriesFromAnyEntryPoint(DialogueEntryPoint) afin que la liste déroulante des sélecteurs se remplisse), et lancez avec StartDialogueWithAnyEntryPoint — 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.

  1. 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.
  2. 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. Un nœud StartDialogueWithSelector avec sa liste déroulante de tags de sélecteur

  3. 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.

Un événement câblé à la broche End Event d'un nœud StartDialogue

  1. 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.
  2. Chaque sortie de cette instance — sur la Dialogue Instance placée, utilisez Actor ▸ Add Event ▸ DialogueEndEvent (un delegate multicast sur ALBRDialogueInstance). Elle se déclenche quelle que soit la façon dont le dialogue a été lancé.

    Add Event ▸ DialogueEndEvent sur une Dialogue Instance 3. N'importe où dans le projet — bindez le OnDialogueEnd global 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.

Les input actions de la showcase : Skip Dialogue Line et Stop All Dialogues

  1. Passer en avant / arrière — appelez SentenceSkip / SentenceSkipBack sur la Dialogue Instance en cours. Protégez l'entrée avec le CanSkip du manager pour ne la proposer que lorsqu'il existe une destination valide.
  2. 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.
  3. 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é), ou StopAll.

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.

  1. 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.
  2. 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.
  3. 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.

  1. 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.
  2. À l'exécution, appelez la variante dont vous avez besoin, en passant le transform de spawn : StartGenericDialogue, StartGenericDialogueWithSelector, StartGenericDialogueWithSelectors, ou StartGenericDialogueWithSelectorQuery. Chacune renvoie l'ALBRDialogueInstance spawnée.
  3. 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.Audio2D sur 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