Постановка и камеры

Средний Обновлено 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Автоповорот к якорю / говорящему / метке, либо угол вручную
appearplaced (стоит на месте с начала сцены) или 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: dynamic Blueprint не нужен вовсе (оптика по умолчанию; добавьте fov: для быстрого нестандартного ракурса).
  • look_at наводится на якорь, говорящего или метку, и разрешается в момент смены плана, поэтому камера держит объект в кадре даже после перемещений по ходу диалога.
  • Автоматическая грамматика никогда не выбирает собственные метки; они применяются только как явные переопределения на реплике (или через choice_shot).
  • Если класс камеры не загрузился в рантайме, реплика деградирует до запасного общего плана с предупреждением; сцена никогда не ломается.

Заметки о дизайне

Планы сменяются мгновенно (SetViewTargetWithBlend с нулевым блендом), а персонажи двигаются штатной AI-локомоцией движка: без Sequencer и запечённых синематиков, поэтому сцены продолжают работать, когда меняются ваш уровень, персонажи или анимации. Все ссылки идут на стабильные идентификаторы (метки, реплики, квесты), а не на координаты или внутренности классов.