Sous-titres¶
Libretto fournit un circuit de sous-titrage prêt à l'emploi qui transforme chaque réplique jouée en texte à l'écran sans aucune configuration de votre part : au fil du dialogue, le gestionnaire transmet le nom du locuteur et le texte de chaque réplique à un widget de sous-titre. Cette page présente le widget fourni, la façon de le remplacer ou d'en modifier le style, l'interface qu'un widget personnalisé doit implémenter, ainsi que les flags de réplique qui modifient le comportement des sous-titres.
Le widget fourni¶
Par défaut, la classe de sous-titre est ULBRSimpleSubtitleWidget (module LBRCore). Elle
construit sa propre arborescence de widgets par le code — une superposition plein écran avec un
unique bloc de texte à retour à la ligne automatique, centré en bas de l'écran — et met en forme
chaque réplique sous la forme Speaker : line text.
Elle expose deux propriétés que vous pouvez ajuster (directement, ou sur une sous-classe Blueprint) :
| Property | Default | Effet |
|---|---|---|
bShowSpeakerName |
true |
Préfixe la réplique avec le nom du locuteur (Speaker : text). Désactivez-la pour des sous-titres sans nom. |
FontSize |
22 |
Taille de police du texte du sous-titre. |
Le nom du locuteur provient du personnage lui-même : le widget appelle
ILBRDialogueCharacter::LBRGetCharacterName sur la classe Speaker de la réplique ; ce qu'un
personnage renvoie à cet endroit (idéalement du texte localisé — voir la page
Dialogue Editor) est donc ce qui apparaît dans le sous-titre.

Info
ULBRSimpleSubtitleWidget construit sa mise en page par programmation — il n'y a aucun binding
nommé (pas de widgets SubtitlesLabel_TXT / SpeakerName_TXT / Background à raccorder).
Pour en changer l'apparence, ajustez les deux propriétés ci-dessus, dérivez le widget en
Blueprint, ou fournissez votre propre classe de widget (voir ci-dessous).
Choisir le widget de sous-titre¶
La classe utilisée pour afficher les sous-titres est un réglage de projet :
Project Settings ▸ Libretto ▸ UI ▸ Widget Subtitle Class (WidgetSubtitleClass sur
ULBRDialogueCoreSettings).
Par défaut, il pointe vers ULBRSimpleSubtitleWidget :
[/Script/LBRCore.LBRDialogueCoreSettings]
WidgetSubtitleClass=/Script/LBRCore.LBRSimpleSubtitleWidget
Faites-le pointer vers la classe de widget de votre choix — mais cette classe doit implémenter
l'interface LBRDialogueSubtitle (le réglage l'impose via MustImplement). Si le réglage est
vide, le gestionnaire consigne un avertissement et aucun sous-titre n'est affiché à l'écran.

Écrire un widget de sous-titre personnalisé¶
Pour maîtriser entièrement la présentation, créez un widget (Blueprint ou C++) qui implémente
ILBRDialogueSubtitle et définissez-le comme Widget Subtitle Class. L'interface comporte deux
événements :
| Event | Appelé quand |
|---|---|
ShowDialogueSubtitle |
Une réplique commence à être jouée. Paramètres : la Dialogue Instance, le Line ID, le Dialogue et la durée de la réplique (SentenceLength, en secondes). |
HideDialogueSubtitle |
La réplique se termine. Mêmes trois premiers paramètres. |
À partir de ces paramètres, vous pouvez extraire tout ce dont vous avez besoin — par exemple le texte
localisé via les tableaux de répliques du Dialogue, et le nom du locuteur via
ILBRDialogueCharacter::LBRGetCharacterName sur la classe Speaker de la réplique — et le rendre
comme votre projet le souhaite (polices, arrière-plan, animations d'apparition/disparition, etc.).
Le chemin le plus simple consiste à dériver ULBRSimpleSubtitleWidget en Blueprint : vous
héritez de sa logique d'affichage/masquage et de sa mise en forme du nom du locuteur, et vous ne
surchargez que ce que vous voulez modifier.

Les flags de réplique qui modifient les sous-titres¶
Les flags d'une réplique peuvent remplacer le comportement de sous-titrage par défaut. Deux flags sont fournis à cet effet :
| Flag | Tag | Effet |
|---|---|---|
| NoSubtitle | Libretto.Flags.Lines.NoSubtitle |
La réplique est jouée mais n'affiche aucun sous-titre. |
| Subtitle3D | Libretto.Flags.Lines.Subtitle3D |
Affiche le sous-titre en espace-monde, au-dessus de la tête du locuteur (façon bark) plutôt que sur le HUD 2D. |

Sous-titres en espace-monde (Subtitle3D)¶
Lorsqu'une réplique porte Subtitle3D, le gestionnaire résout l'acteur du locuteur dans le niveau
et, à la première utilisation, attache un UWidgetComponent au-dessus de sa tête — en réutilisant la
même WidgetSubtitleClass que le circuit 2D, simplement rendue en espace-monde. Le composant est
créé une seule fois par locuteur et réutilisé pour les répliques suivantes ; si l'acteur du locuteur
ne peut être résolu (par exemple un bark provenant d'un personnage absent du monde), rien ne
s'affiche et aucune erreur n'est levée.

Passer outre le sous-titre : piloter votre propre interface¶
Si vous ne voulez pas que Libretto crée son propre widget de sous-titre — parce que votre HUD dispose
déjà d'une zone de sous-titres — vous pouvez contourner entièrement le widget intégré en vous liant
aux delegates du gestionnaire sur ULBRDialogueManager :
| Delegate | Déclenchement |
|---|---|
OnSubtitleDisplayed |
Lorsque le sous-titre d'une réplique doit apparaître. Transmet la Dialogue Instance, le Line ID, le Dialogue, SentenceLength, et un ensemble de Flags d'exécution. |
OnSubtitleHidden |
Lorsqu'il doit disparaître. Transmet la Dialogue Instance, le Line ID, le Dialogue. |
Info
Ces delegates ont la priorité sur le widget intégré : si OnSubtitleDisplayed est lié, le
gestionnaire y diffuse l'événement et ne crée pas de WidgetSubtitleClass. Liez-les pour
router les sous-titres vers votre propre HUD.
Les Flags transmis à OnSubtitleDisplayed vous permettent de distinguer le dialogue principal
(celui sur lequel le joueur est concentré) des dialogues d'arrière-plan : ils portent
Libretto.RuntimeFlags.MainDialogue (TAG_LBRRuntimeFlag_MainDialogue) pour le dialogue en cours de
focalisation. Servez-vous-en, par exemple, pour afficher la conversation principale de façon bien
visible et les échanges secondaires plus discrètement.