Aller au contenu

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.

The shipped simple subtitle widget

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.

Widget Subtitle Class in Project Settings

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

Subtitle widget options

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.

Subtitle line flags on a line

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.

A Subtitle3D line above the speaker

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.