01 — Основні поняття¶
🇬🇧 English | 🇺🇦 Українська
Квести й цілі — це дані¶
Квест (UQuestData) — це UPrimaryDataAsset, який ви створюєте в Content Browser: назва, опис, список цілей, необов'язкові пререквізити та нагороди. Ціль (UQuestObjectiveData) — окремий ассет: що має зробити гравець, скільки разів, та ідентифікатор для зіставлення з ігровими подіями.
У квесті нічого не зашито в код. Дизайнери створюють контент цілком як ассети; повний довідник полів — у 03 — Авторинг квестів.
Життєвий цикл квесту¶
Квест проходить через такі стани (EQuestState):
| Стан | Значення |
|---|---|
Locked |
Існує, але пререквізити не виконані. |
Available |
Пререквізити виконані; гравець може почати квест. |
Active |
У процесі виконання. |
Completed |
Завершений — нагороди видані. |
Failed |
Провалений (вичерпано час або гра явно провалила квест). |
У кожної цілі всередині активного квесту свій стан (EQuestObjectiveState): Inactive (ще не почата — використовується для послідовних цілей), Active (зараз відстежується), Completed або Failed.
IsQuestReadyToTurnIn() — це не те саме, що IsQuestCompleted(): перше істинне, щойно виконані всі обов'язкові цілі (час показувати підказку здачі); друге істинне лише після того, як реально відпрацював CompleteQuest() і видані нагороди.
Один компонент, два місця¶
Є єдиний клас компонента, UQuestManagerComponent. Те, чим він керує, цілком залежить від того, куди він прикріплений:
- На
PlayerState→ керує Personal та Individual квестами цього гравця. - На
GameState→ керує Shared-квестами для всієї сесії («party-менеджер»).
В обох випадках масиви квестів реплікуються всім спостерігачам актора-хоста — власні квести гравця на PlayerState доходять до всіх клієнтів, а не лише до власника. Це усвідомлений наслідок того, що один клас обслуговує обидва місця; див. 06 — Мультиплеєр, де пояснюється, чому owner-only-скоуп тут неможливий і що робити, якщо він вам потрібен.
Створювати ці компоненти вручну не потрібно — див. 02 — Інтеграція без налаштування. IsPersonalQuestManager() / IsPartyQuestManager() підкажуть, який із них у вас у руках.
Режими розподілу прогресу¶
У кожного квесту є QuestSharingMode (EQuestSharingMode), і саме він визначає, як квест поводиться в мультиплеєрі:
| Режим | Де живе прогрес | Поведінка |
|---|---|---|
| Personal | Власний PlayerState гравця |
Соло-квест. Кожен гравець, що почав його, отримує свою незалежну копію; інші гравці її не бачать і не можуть до неї долучитися. |
| Shared | GameState |
Один спільний лічильник цілі на всю групу. Прогрес кожного учасника додається до одного числа. Індивідуальний внесок при цьому все одно відстежується (для таблиць лідерів, бонусних нагород тощо). |
| Individual | Власний PlayerState кожного гравця |
Кожен учасник веде свою копію цілей. GameState зберігає лише список учасників і знає, коли закінчили всі. |
Чи потрібен Shared, щоб підтримати і одиночну гру, і мультиплеєр?¶
Ні — усі три режими працюють незалежно від того, грається рівень соло чи кількома гравцями. QuestSharingMode визначає не чи буде квест працювати в мультиплеєрі, а як він поводитиметься, коли гравців більше одного:
- Personal чудово працює і в мультиплеєрі — просто ніколи не стає колективним. Кожен гравець, що поговорив із видавцем квесту, отримує свою незалежну копію, без будь-якої взаємодії між гравцями. В одиночній сесії це не відрізнити від «єдиного гравця»; у мультиплеєрній — це просто кілька гравців, які паралельно проходять один і той самий квест, не підозрюючи одне про одного.
- Shared та Individual потрібні саме тоді, коли ви хочете один екземпляр, що автоматично розтягується на групу — запускається через
StartPartyQuestForAllPlayers()(див. 06 — Мультиплеєр), який зараховує «всіх, хто зараз підключений». В одиночній сесії це група з одного; ні в квесті, ні на рівні нічого міняти під мультиплеєр не потрібно.
Тож справжній вибір — не «який режим дозволить запуститися в обох режимах» (усі дозволяють), а «чи належить прогрес одному спільному лічильнику (Shared), кожному гравцеві окремо зі спільною фінішною межею (Individual), або повністю незалежно кожному гравцеві (Personal)». DemoMap навмисно змішує всі три режими на одному рівні, щоб показати різницю пліч-о-пліч — відкрийте її в редакторі та порівняйте DQ_CrystalWarmup (Personal) з DQ_PartyHarvest (Shared) і DQ_Pilgrimage (Individual).
Куди далі¶
- Налаштування плагіна без жодного рядка коду: 02 — Інтеграція без налаштування
- Створення свого першого ассету квесту: 03 — Авторинг квестів