Постановка и камеры
Средний Обновлено 10 июл. 2026 г.
Содержание
Без какой-либо постановки Questwright просто ставит каждого говорящего лицом к собеседнику и кадрирует сцену автоматически; многим квестам большего и не нужно. Постановка нужна для мизансцен с несколькими NPC, спавна статистов, перемещений по ходу диалога и камер, расставленных вручную.
Схема постановки
Правая зона Studio представляет собой схему сцены с видом сверху вокруг её якоря (размещённого маркера диалога или трансформа самого квестодателя, если маркер не поставлен). Перетаскивайте метки, чтобы расставить персонажей, поворачивайте их, добавляйте путевые точки и размещайте камеры. Поставьте курсор на реплику диалога, и схема подсветит, кто где стоит в этот момент: занятость меток отслеживается пореплично по всей сцене.

Всё, что редактируется на схеме, записывается в блок staging: файла квеста; как и во всём
остальном Studio, ручное написание полностью равнозначно:
staging:
anchor: DialogueMarker_Barn # a placed BP_QW_DialogueMarker; omit → the giver's transform
settle_timeout: 4.0 # seconds a walk may take before falling back to teleport
marks:
- { id: giver, actor: Bran, pos: [-100, -30], face: hero, keep: true }
- { id: hero, actor: Player, pos: [-100, 60], face: giver }
- { id: m1, actor: Mira, pos: [ 140, 30], face: anchor, appear: arrive }
- { id: m2, actor: Mira, pos: [ 40, -80], face: anchor } # waypoint
Ключевые поля метки:
| Поле | Назначение |
|---|---|
id | Стабильный идентификатор: line.stage.to и камеры ссылаются на метки по id |
actor | Ключ говорящего; опустите для чистой путевой точки |
pos | [x, y] в сантиметрах относительно якоря; высота в рантайме прижимается к земле |
face / yaw | Автоповорот к якорю / говорящему / метке, либо угол вручную |
appear | placed (стоит на месте с начала сцены) или arrive (спавнится вне поля зрения и подходит; его первая реплика ждёт прибытия) |
keep | Остаётся ли заспавненный участник после конца диалога (по умолчанию деспавнится) |
Участники, уже находящиеся на уровне (и Player), перемещаются; всех остальных плагин спавнит из состава сцены и автоматически убирает.
Перемещение по ходу диалога
Прикрепите переход stage: к любой реплике; реплика подождёт, пока перемещение завершится
(с откатом на телепорт по истечении settle_timeout):
- { by: Mira, id: step, text: "Let me see the tracks.",
stage: [ { who: Mira, to: m2, approach: walk } ] }
Одна метка вмещает одного участника за раз: валидатор помечает двух человек на одной метке в один момент как ошибку, а схема показывает конфликт.
Автоматические камеры
По умолчанию компилятор кадрирует каждую сцену по грамматике планов: устанавливающий общий план
на первой реплике, крупные планы после нескольких реплик подряд от одного говорящего,
кадрирование через плечо по адресату to: каждой реплики. Переопределения для отдельной
реплики задаются через shot: (wide, ots, cu, reaction), а политика на уровне квеста
настраивается:
camera:
cu_run_threshold: 2 # close-up after N consecutive lines from one speaker (default 3)
establishing: true # establishing wide on the first line (default true)
choice_shot: wide # shot while the player is choosing (default wide)
Собственные метки камер
Для полного режиссёрского контроля размещайте камеры прямо на схеме. У каждой есть живой предпросмотр зоны обзора, так что вы точно видите, что попадает в кадр:

staging:
cameras:
- { id: cam_quick, class: dynamic, pos: [200, 0], height: 200, look_at: anchor }
- { id: cam_window, class: BP_MyCam_Voyeur, pos: [-320, 90], height: 150, look_at: giver, fov: 28 }
- { id: cam_dutch, class: BP_MyCam_Dutch, pos: [140, 200], height: 120, yaw: -135, pitch: -8 }
# on a line: shot: cam_window
# while choices unfold: camera: { choice_shot: cam_high }
Как всё это устроено:
- Метка описывает конкретный экземпляр: стабильный id, позицию относительно якоря и
направление. Реплики ссылаются на id метки через
shot:, никогда на класс или координаты. - Переиспользуемая оптика (объектив / DOF / filmback) живёт в классе камеры, то есть в любом
Blueprint-наследнике
QuestwrightDialogueSceneCamera. Встроенномуclass: dynamicBlueprint не нужен вовсе (оптика по умолчанию; добавьтеfov:для быстрого нестандартного ракурса). look_atнаводится на якорь, говорящего или метку, и разрешается в момент смены плана, поэтому камера держит объект в кадре даже после перемещений по ходу диалога.- Автоматическая грамматика никогда не выбирает собственные метки; они применяются только как
явные переопределения на реплике (или через
choice_shot). - Если класс камеры не загрузился в рантайме, реплика деградирует до запасного общего плана с предупреждением; сцена никогда не ломается.
Заметки о дизайне
Планы сменяются мгновенно (SetViewTargetWithBlend с нулевым блендом), а персонажи двигаются
штатной AI-локомоцией движка: без Sequencer и запечённых синематиков, поэтому сцены
продолжают работать, когда меняются ваш уровень, персонажи или анимации. Все ссылки идут на
стабильные идентификаторы (метки, реплики, квесты), а не на координаты или внутренности классов.