Perspective & contrôle¶
Je veux que le joueur garde un peu de contrôle pendant qu'un PNJ lui parle¶
Placer les PNJ et libérer le joueur sont deux choix indépendants — vous pouvez les combiner. Que les personnages se tiennent sur des marques fixes dépend de si le sous-dialogue a un stage ; que le joueur puisse encore se déplacer et regarder dépend de si la caméra de gameplay continue de tourner et des deux flags de verrouillage du stage. Donc « PNJ positionnés » ne force pas « joueur figé » — vous réglez chaque côté séparément.
-
Aucun positionnement, liberté totale — laissez la Stage Actor Class vide. Le sous-dialogue s'exécute en 3C pur : rien n'est placé, rien n'est verrouillé, le joueur garde la caméra de gameplay et se déplace librement. Vous pouvez le rendre explicite avec le flag
Libretto.Flags.Subdialogue.Staging.3C(TAG_LBRSubDialogueFlag_3C).
-
PNJ positionnés, le joueur garde la vue — donnez un stage au sous-dialogue mais réglez son
bUseStageCameras = false(le mode « 3C-staged ») : les PNJ se calent sur leurs marques tandis que la caméra propre au jeu continue de tourner, si bien que le joueur n'est jamais arraché vers une vue cinématique.
-
Réglez le déplacement et le regard séparément — sur le stage,
bLockPlayerMovementetbLockPlayerCamerasont deux booléens indépendants (tous deux àtruepar défaut). Désactivez celui que vous voulez : laissez le joueur regarder autour de lui sans pouvoir s'éloigner, figez la caméra mais autorisez un pas en arrière, ou effacez les deux pour une liberté totale alors que les PNJ restent mis en scène. - Generate Sequences. La scène se joue avec le mélange de placement et de liberté que vous avez défini.
Piège
Les flags de verrouillage vivent sur le stage, donc un sous-dialogue 3C sans stage n'a rien à
verrouiller — le joueur y est toujours libre. Mais le piège inverse : un stage verrouille le joueur
par défaut (les deux flags à true), donc simplement ajouter un stage pour positionner vos PNJ
va figer le joueur tant que vous n'aurez pas désactivé les flags. Placement et verrouillage sont
des réglages distincts, mais les valeurs par défaut les lient — inversez-les délibérément.
Voir aussi : Mise en scène — ajouter un stage · Runtime — modes de mise en scène
Je veux une cinématique qui prend le contrôle de la vue et du joueur¶
Choisissez le mode de mise en scène sur le sous-dialogue — les trois modes décident qui pilote la caméra et si le joueur est verrouillé. Chaque sous-dialogue se joue dans l'un des trois modes, et en choisir un est la façon de glisser de « entièrement entre les mains du joueur » à « cinématique entièrement scénarisée ».
- Staged (prise de contrôle cinématique) — donnez une Stage Actor Class au sous-dialogue.
Les caméras du stage pilotent la vue et, par défaut, le déplacement et la caméra du joueur sont
verrouillés (
bLockPlayerMovement/bLockPlayerCamerasur le stage). C'est le mode pour une scène dirigée et filmée. -
3C-staged (placé, mais le joueur garde la vue) — utilisez un stage mais réglez son
bUseStageCameras = false: les personnages se calent sur leurs marques, tout en laissant la caméra de gameplay tourner. Voir l'entrée précédente pour les réglages de liberté de déplacement/regard.
-
Cinematic (scénarisé à la main) — cochez le flag
Libretto.Flags.Subdialogue.Staging.CinematicDialogue(TAG_LBRSubDialogueFlag_CinematicDialogue) du sous-dialogue. Libretto ne génère aucune caméra ni aucune animation de personnage — seulement la coquille de timeline — laissant le plan à construire à la main dans Sequencer.
Piège
Staged et Cinematic sont deux choses différentes : staged génère quand même les caméras et l'animation pour vous ; cinematic ne génère délibérément ni l'un ni l'autre et est destiné à être retravaillé par un cinematic designer. Ne recourez pas au flag Cinematic juste pour obtenir un rendu filmé — un stage normal est ce qui filme la scène automatiquement.
Voir aussi : Mise en scène — ajouter un stage · Runtime — modes de mise en scène · Core concepts
Comment rendre mon propre personnage (ou le joueur) capable de parler dans les dialogues ?¶
Implémentez l'interface LBRDialogueCharacter sur votre Actor — vous n'avez besoin de dériver de
rien. Libretto communique avec les participants via l'interface ILBRDialogueCharacter, qui est
Blueprintable : n'importe quel pawn, character ou objet qui l'implémente peut être distribué dans un
dialogue. Les ALBRSimpleDialogueCharacter et ULBRIntangibleCharacter du plugin ne sont que des
implémentations prêtes à l'emploi — utilisez-les telles quelles, ou ajoutez l'interface à votre propre
classe plutôt que d'en hériter.

- Sur votre Blueprint (ou classe C++), ajoutez l'interface
LBRDialogueCharacter(Class Settings ▸ Implemented Interfaces). - Implémentez les fonctions d'identité :
LBRGetCharacterName(nom d'affichage localisé) etLBRGetCharacterGender(alimente le repli de voix TTS). - Pour un personnage doté d'un corps, renvoyez les meshes à animer :
LBRGetBodyComponent(animation du corps / gestes) etLBRGetHeadComponent(visage / lip-sync). Un personnage uniquement vocal peut les laisser de côté — c'est exactement ce que faitULBRIntangibleCharacter. - Implémentez
RequestStartDialogue: préparez le personnage (déplacez-le en position si vous le gérez vous-même) puis appelezULBRDialogueManager::OnDialogueCharacterReadyForDialogue— le dialogue attend cet appel avant de démarrer. ImplémentezRequestEndDialoguepour faire le nettoyage. - Pour que le personnage puisse se tenir sur les marques d'un stage, renvoyez ses rôles depuis
GetStageRoles(Libretto.Stage.Roles.*) — le même système de rôles auquel se réfèrent les slots, les caméras et les lumières.
Piège
Un dialogue restera bloqué au démarrage si le RequestStartDialogue d'un participant n'appelle
jamais OnDialogueCharacterReadyForDialogue — ce callback est le signal « je suis prêt », il doit
donc se déclencher sur tous les chemins (y compris le cas où il n'y a rien à déplacer). Si vous
n'avez besoin que d'une voix sans corps (un narrateur, une voix sur les comms), ne réimplémentez pas
l'interface — utilisez ULBRIntangibleCharacter.
Voir aussi : Personnages intangibles · Mise en scène — qui se tient où · Blueprint API