Створення редактора квестів та діалогів для Unreal engine Частина 1 опис плагіна

редактора

Привіт мене звуть Дмитро. Я займаюся створенням комп'ютерних ігор на Unreal Engine як хобі.

На певній стадії створення вашої гри виникає необхідність написати діалоги та квести. На жаль, Unreal engine не має вбудованого інструменту для вирішення цього завдання. Тому я написав плагін для редагування квестів та діалогів. Як завжди, всі вихідники будуть надані наприкінці статті. Я вирішив розділити статтю на дві частини в першій частині я опишу сам плагін і розповім, як ним користуватися. А в другій частині я розповім про технічні аспекти.

Тому я перейду відразу до розповіді про саму плагін. Для початку необхідно створити ассет StoryGraph. На панелі праворуч ви створюєте сюжетні об'єкти.

1) Quest - Це ваші квести після створення цього об'єкта з'являється можливість додати стартову ноду квесту (підтримується drag and drop), до якої можна вже прив'язувати фази квесту.

Тригер має лише два стани активний і неактивний. Крім того, він має кілька режимів роботи:

UnInteractive - Тригер неактивний а перемикання його станів ви повинні реалізувати самі за допомогою Blueprint функції ChangeState.

Interactive - Тригер активний, коли ви підходите до нього достатньо натиснути клавішу e і він перейде до активного стану.

Також тригер, як і персонаж, може отримувати повідомлення від головного графа.

6) Others — Предмети, які не належать до вище перерахованих, але беруть участь у розвитку сюжету. Ці предмети не мають станів, але можуть приймати повідомлення і в залежності від них зміняться.

Хочу зауважити, що завдяки тому, що квестові об'єкти та об'єкти, які знаходяться на карті, це різні об'єкти. То можна працювати паралельно. Наприклад, ви створюєте сюжет, а вашдруг створює карту. І коли все буде готове, можна їх об'єднати.

Після створення сюжетних предметів можна починати створювати квести. Тут потрібно уточнити що всі ноди діляться на два види, це незалежні ноди, які можна розміщувати коли захочеш, і залежні ноди, які з'являться тільки після створення об'єктів, які від них залежать. Крім того, плагін підтримує технологію drag and drop, тому якщо ви перетягнете об'єкт на поле графа, то вам запропонують створити всі ноди, які залежать від даного об'єкта.

Усі ноди мають два типи зв'язків – це вертикальні зв'язки та горизонтальні. Вертикальне дерево – це основа вашого квесту – саме воно визначає його структуру та порядок виконання. Горизонтальні ноди це модифікатори конкретної фази квесту (нода фази має вертикальні і горизонтальні зв'язку). Вони можуть додати якісь об'єкти на радар або надіслати повідомлення об'єкту, все це станеться, коли активується конкретна фаза квесту.

Тож давайте пробуємо щось створити. Спершу створюємо квест. Після цього можна розмістити стартову ноду квесту. До цієї ноди можна прикріплювати ноди трьох видів:

1) AddQuestPhase - Нода додає в квест нову фазу коли активується. 2) GetObjectState — Ця нода активується, коли конкретний сюжетний об'єкт переходить у конкретну стадію, зазначену у властивостях ноди. Якщо нода активувалася, то вона активує ноди розташовані за нею. Уявіть трубопровід що бере початок від стартової ноди, тоді нода GetObjectState буде вентилем який до певного часу закритий і не пропускає воду далі але якщо він відкриється то вода далі піде. 3) GameOver - З назви зрозуміло що як тільки ця нода активується відбувається завершення гри.

Після того, як ви створили «вертикальне»дерево. До нього можна додавати горизонтальні ноди ось їх опис:

1) Activate/deactivate dialog(message) — Активує або де активує галузь діалогу чи повідомлення. 2) Active/deactive object — Активує або де активує об'єкт. Мається на увазі, що при деактивації об'єкт просто пропаде з гри. Наприклад вам вже не потрібен якийсь об'єкт його можна позбутися, або навпаки об'єкт знадобиться на якомусь етапі гри і щоб персонаж не знайшов його раніше часу його теж можна де активувати. 3) Cancel quest — Скасувати квест, наприклад якщо квести суперечать один одному і персонаж почав виконувати один з них, то інший можна скасувати. 4) Send Message — Надіслати повідомлення сюжетному предмету, щоб він якось змінився. Сама зміна визначається Blueprinte у всіх зовнішніх об'єктів є event GetMessegeFromStoryGraph який спрацьовує при активації цієї ноди. 5) Add Screen Message - Вивести на екран повідомлення, яке побачить гравець. 6) Add to radar — Додати об'єкт на радар. Об'єкт буде виводиться на радарі до тих пір, поки фаза квесту до якої прикріплена нода буде активна. 7) Print quest phase on screen - Вивести вміст конкретної фази квесту на екран. Може бути корисно наприклад на початку гри показувати персонажу що ви від нього хочете. 8) Send message to level blueprint — Те саме що Send Message але посилає повідомлення в blueprin рівня. Щоб ця нода запрацювала, потрібно змінити базовий клас для level blueprint з ALevelScriptActor на ALevelScriptActor_StoryGraph.

створення

До речі, щоб нові рівні створювалися з потрібним level blueprint можна змінити налаштування проекту: ProgectSettings → GeneralSettings → LevelScriptActorClass.

9) Print string - ця нода стоїть особняком, оскільки вона має як вертикальнізв'язки і горизонтальні. Вона виводить налагоджувальне повідомлення, щоб ви могли протестувати ваш сценарій.

Після того, як все буде зроблено, ви запустите гру і нічого не станеться, щоб сюжет почав працювати потрібно перетягнути об'єкт StoryGraph на рівень або скористатися відповідним пунктом контекстного меню.

Я хочу помітити, що на рівні можна розмістити кілька різних об'єктів StoryGraph. Скажімо, в одні помістити всі основні квести, а в іншій всі додаткові або навіть кожен квест помістити в окремий об'єкт.

У наступній статті я розповім про технічні аспекти, і про проблеми, які у мене виникли при створенні плагіна.

А якщо ви хочете просто пограти в демку (її сюжет можна бачити на першому малюнку), то скачати її можна тут.

Управління у грі стандартне:

i - інвентар j -журнал f - перемикання виду

P.S. Трохи не очевидний момент: квест стає активним, коли до нього додається перша фаза. А якщо виконання сягає кінця однієї з гілок, тоді квест вважається виконаним.

P.P.S До проекту додано можливість збереження та завантаження (клавіші [ — зберегти, ] — завантажити).

Оновлення: Доданий експорт у XML файл та імпорт із XML.

Хардкорна конфа за С++. Ми запрошуємо лише профі.