Цели и прогресс

Средний Обновлено 9 июл. 2026 г.

Содержание

Здесь описано всё между «принять квест» и «сдать квест»: как засчитываются цели, как условия ограничивают доступ к контенту, как эффекты меняют состояние и как квесты связываются в цепочки.

Цели

Отслеживаемая цель живёт внутри шага. Шаг использует обобщённый id (Goal, Deliver), а конкретный вид цели задаётся в objective.type, поэтому вид можно поменять, ничего не переименовывая:

- id: Goal
  objective:
    type: Kill
    target: MyGame.Enemy.Wolf         # GameplayTag; MUST be registered
    count: 3
    location: MyGame.Area.Farm        # optional area gate
    desc: "Kill the wolves near the farm"
  next: Deliver
ТипСмыслКак засчитывается
Killубить N врагов с тегомваш код смерти сообщает событие Kill
Collectсобрать N предметов с тегомваш код подбора сообщает событие Collect
Reachдобраться до места с тегомсобытие Reach или CompleteObjective из триггера
TalkToпоговорить с кем-тоавтоматически: начало разговора засчитывает цель
Deliverвернуться к квестодателювыполняется самим актом сдачи квеста
Customчто угодно ещёигра сообщает Custom + ваш собственный тег

Два удобных момента, о которых стоит знать:

  • Целью TalkTo служит ключ говорящего, а не тегtarget: Mary стоит тот же ключ, что в speakers: и на вкладке Cast). Любой разговор с этим NPC засчитывает цель только тому игроку, который говорит, и только пока цель активна, поэтому разговор с NPC до принятия квеста корректно не засчитывает ничего.
  • Deliver никогда не блокирует сдачу квеста: он существует, чтобы в трекере была строка «вернуться с докладом», и автоматически отмечается при сдаче квеста.

Засчитывание из вашей игры сводится к одному вызову (Blueprint или C++), серверно-авторитетному и идемпотентному по EventSourceId:

Comp->ReportObjectiveEvent(Instigator, EQuestwrightObjectiveEventType::Kill,
                           MatchTags, LocationTags, EventSourceId);

Сопоставление тегов иерархическое: цель с target: Enemy.Wolf засчитывается событием с тегом Enemy.Wolf.Alpha, так что перечислять каждый подтип не нужно.

Подход к квестодателю: подсказка взаимодействия, разговор автоматически засчитывает цели TalkTo

GameplayTags: одно критическое правило

Каждое значение target, location, require/grant у вариантов выбора, tag в условиях и grant_tag в эффектах представляет собой GameplayTag, который уже должен быть зарегистрирован в вашем проекте, иначе он разрешается в невалидный тег и молча игнорируется. Это причина №1 жалобы «моя цель не засчитывается». Регистрировать теги можно двумя способами:

  1. Нативно в C++ (предпочтительно для тегов, уходящих в релиз): UE_DEFINE_GAMEPLAY_TAG_COMMENT(...).
  2. Project Settings → Project → GameplayTags (пишет в Config/DefaultGameplayTags.ini).

Используйте иерархию через точки (MyGame.Enemy.Wolf, MyGame.Area.Farm), и иерархическое сопоставление заработает само собой. Единственное исключение: в цели TalkTo указывается ключ говорящего, а не тег.

Условия

Условия ограничивают доступность квеста (available_when) и вход в шаг (require). Атомарные виды:

ФормаСмысл
{ quest: <QuestId>, state: <state> }другой квест находится в состоянии (available, active, completed, failed, declined)
{ objective: <ObjId>, state: <state> }цель active / complete / failed / inactive
{ flag: <Name>, equals: <Value> }квестовая переменная текущего прохождения равна значению
{ tag: <GameplayTag> }у игрока есть gameplay-тег
{ item: <ItemId>, min: <N> }в инвентаре ≥ N предметов (через ваш провайдер инвентаря)
{ attribute: <AttrId>, min: <N> }характеристика ≥ N (через ваш провайдер статов)

Составные: { all: [...] } (И), { any: [...] } (ИЛИ), { not: <cond> }.

available_when:
  all:
    - { quest: Region.Intro, state: completed }
    - { not: { flag: Betrayed, equals: "true" } }

Эффекты (on_end:)

Применяются при выходе из сцены:

on_end:
  quest: accept                     # accept | complete | decline | fail | turnin
  set: { RewardTier: Negotiated }   # write flags, read back by flag conditions
  grant_tag: Region.MetBran         # grant gameplay tag(s) to the player
  grant_quest: Region.FollowUp      # auto-accept follow-up quest(s)

Сцена сдачи квеста обычно заканчивается на on_end: { quest: turnin } плюс end: completed.

Ветвление по выбору игрока

Чтобы квестодатель отреагировал на сделанный ранее выбор, установите флаг в момент выбора, а затем опишите два шага сдачи: шаг, закрытый флагом, поставьте первым, а универсальный оставьте последним. Маршрутизация квестодателя выбирает первый шаг сдачи, чей require проходит:

- id: Haggle
  scene: { ... }
  on_end: { quest: accept, set: { RewardTier: Negotiated } }

- id: DeliverHaggled                       # specific branch, goes before the catch-all
  require:
    all:
      - { objective: Goal, state: complete }
      - { flag: RewardTier, equals: Negotiated }
  scene: { ... }
  on_end: { quest: turnin }
  end: completed

- id: Deliver                              # default branch, carries the tracked objective
  require: { objective: Goal, state: complete }
  objective: { type: Deliver, count: 1, desc: "Report back" }
  scene: { ... }
  on_end: { quest: turnin }
  end: completed

Демо-квест из поставки использует ровно этот приём (торг ведёт к другой сцене расплаты).

Цепочки квестов

Цепочка представляет собой просто данные, никакого отдельного ассета:

  • у квеста B available_when: { quest: A, state: completed } (пререквизит), и/или
  • у квеста A on_end: { grant_quest: B } (авто-принятие продолжения).

priority упорядочивает несколько квестов, предлагаемых одним квестодателем (квест с большим значением предлагается первым). UI New Chain в Studio записывает эти значения за вас перетаскиванием; ручное написание эквивалентно. Валидация ловит циклы в цепочках и висячие ссылки на квесты и цели.

Барки

Фоновые барки (barks:) звучат над головой квестодателя по случайному таймеру; барки простоя (idle_barks:) звучат при взаимодействии, когда квестодателю больше нечего предложить. И те и другие проходят через тот же пайплайн озвучки и лицевой анимации голосом квестодателя:

barks:
  interval: [8, 16]
  lines:
    - "Wolves howling again..."
    - { text: "After dark, nobody sets foot in the yard.", weight: 2 }

idle_barks:
  lines:
    - "Rest easy. The farm's safe, thanks to you."

Награды

rewards:
  base:
    currency: 20
    xp: 50
    items:
      - { def: SmokedMeat, count: 1 }

currency, xp и items записываются при сдаче квеста; сами блага ваша игра выдаёт через шов провайдера инвентаря (см. Интеграция в рантайме).