Коли краще зробити своє, ніж купити готове. Як створювали власну систему візуальних скриптів для Atom RPG

Мене звати Костянтин Допіра, я один зі співзасновників AtomTeam та один з творців світу Atom RPG. Загалом у компанії я програміст, але коли ти інді, твоя роль може бути будь-якою, залежно від поточних проблем. Однак зараз не про це. На мою думку, немає нічого більш провокативного, ніж статті про розробку власних рушіїв, власну реалізацію «стандартних» бібліотек тощо, бо завжди простіше купити готовий інструмент. Але мені захотілося трішки штурхонути спільноту статтею про те, як ми в AtomTeam запровадили власну систему «візуальних скриптів» для ігор Atom RPG та Atom RPG: Trudograd.

Що це за ігри

Atom RPG та Atom RPG: Trudograd — це рольові ігри, події в яких відбуваються в альтернативній реальності у світі після ядерної війни на території СРСР.

Ігри розроблені в класичному жанрі RPG, тому тут все, як і має бути: ізометрична камера, покроковий режим бою, десятки локацій, сотні діалогів та квестів, а також гори луту, зброї та набоїв.

Для нас також важливо сказати про те, що прямо зараз ми працюємо з компанією «Шлякбитраф» над українським перекладом.

Чому та навіщо

Для початку я хотів би вказати на те, що в іграх серії Atom RPG дуже багато тексту: майже кожний NPC має свій діалог. До того ж у світі гри багато «неживих» інтерактивних об’єктів, з якими також є «діалогова» взаємодія. Якщо говорити мовою цифр, то це близько мільйона слів для Atom RPG та близько 500 000 слів для Trudograd. Ба більше, діалоги — це не тільки текст, а ще й логіка переходів з однієї фрази до іншої через умовні та безумовні переходи. Іншими словами, це деревоподібна структура, де переходи по гілках відбуваються через вибір користувача, перевірками на якісь значення змінних тощо.

Тепер трошки про те, як той самий текст з’являється. А пишуть його наші наративні дизайнери, називаймо їх простіше — письменники. Так уже склалося, що письменники володіють словом та неабиякою логікою, бо вони зразу пишуть тексти з логікою переходів, вказуючи, де та що перевіряти, але не вміють працювати ні з Unity, ні з «цими вашими програмерськими штучками».

Доволі логічною видається ідея про те, що треба придумати інструмент, який би міг зрозуміти та з яким би міг працювати будь-хто. На жаль, в Unity «з коробки» чогось схожого немає, тож один з наших програмістів вирішив власноруч розробити систему візуальних нод на стандартних GUI-елементах Unity. А за ідеями далеко ходити не треба, адже всі ці «блюпрінти», «віжуал скриптинг» тощо використовують у розробці роками. Тут ще ми не знали, як сильно змінить нашу розробку ця система...

Наша версія редактора

Діалоги бувають різними

Що далі

А далі з’явилася ідея використовувати цю систему не тільки для діалогів. Спочатку здавалося, що то не дуже вдала думка, бо написати, а що важливіше, налагоджувати код C# та шукати помилки в Visual Studio зручніше, але ми спробували. У результаті маємо дві гри, вся ігрова логіка яких написана на візуальних нодах.

Спочатку були реалізовані лише основні функціональні ноди, такі як «йди до точки», «програй анімацію», та набір нод для роботи зі змінними «(логічне) якщо», «додати значення», «видалити змінну» тощо. З часом кількість нод перевалила за сотню, особливо коли ми розробили та випустили для спільноти офіційний modkid: ноди для діалогів, квестів, логіки та математики, тригерів та подій (events), роботи з інвентарем, персонажами, ігровими об’єктами, часом, звуком. Все прекрасно працює, ми задоволені результатом та аргументовано стверджуємо, що в нашому випадку такий підхід був вдалим і виправданим:

  • Система гнучка, дуже легко додавати нові функціональні ноди.
  • Система проста та візуальна, наприклад, людина без знання Unity та програмування через декілька тижнів почала писати перші скрипти, а через півтора місяця вже працювала в команді.
  • Система ідеальна для розробників модів для гри (у нас є офіційний modkid і візуальні скрипти — це просто подарунок для спільноти).
  • Запуск сцени в Unity займає значно менше часу, не треба перезбирати C# файли, особливо це помітно коли проєкт розрісся до десятків гігабайтів.
  • Розділивши логіку рушія та ігрову логіку, ми отримали кращий та чистіший код на C#.

Про технічну реалізацію системи я писати не буду, але розкажу про деякі особливості, які треба тримати в голові під час розробки скриптів:

  • Скрипти всіх об’єктів запускаються (відпрацьовується нода Start) лише на старті або під час завантаження сцени, зміни дня чи ночі, а також при «прокрутці» часу. Також можна перезапустити скрипт або всі скрипти сцени із самого скрипту.
  • З попереднього пункту випливає, що скрипт може перерватися та перезапуститися у будь-який момент: save/load, зміна день/ніч тощо. Це не повинно позначатися на персонажі: якщо він йшов кудись, то має продовжувати йти, якщо сидів — має продовжувати сидіти. Ми часто застосовуємо підхід «стейтів», розбиваючи логіку персонажа на фази.
  • У кожної ноди є свій час життя, якщо в скрипті запустити декілька разів ноду (не тільки в циклі, а й просто через розгалуження Dummy), буде створено декілька її інстансів, хороший підхід для генераторів.
  • Скрипти можуть перезапускати себе окремим інстансом на тому ж об’єкті, породжуючи таким чином щось на зразок багатопотоковості, якщо комусь такий підхід подобається.

Висновки

У нашому випадку філософське питання «писати своє чи шукати готове» пройшло через чітке усвідомлення потреби в дуже спеціалізованому інструменті, який пізніше перетворився на більш потужний та універсальний інструмент. Звичайно ж, шукали й щось готове, що можна було взяти за основу. Потім шукали окремі приклади для реалізації графічних елементів на Unity IMGUI тощо. Тобто витратили на цю систему доволі багато часу. Чесно скажу, краще і простіше купити готове. І якби ми знайшли готове, скористалися б цим. Це моя думка та порада всім, особливо маленьким студіям. Адже основне завдання ігрової студії — це писати саме гру. А найбільша проблема під час розробки — це брак часу, тож його треба витрачати розумно.

Наостанок хочу побажати всім гарних ідей та розумних рішень. Адже кожний проєкт — це виклик.

Хай щастить!

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини.

👍НравитсяПонравилось10
В избранноеВ избранном2
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
У кожної ноди є свій час життя, якщо в скрипті запустити декілька разів ноду (не тільки в циклі, а й просто через розгалуження Dummy), буде створено декілька її інстансів

Краще мати один інстанс, але всі дані ноди зберігати окремо і просто прогоняти вектор даних крізь єдиний інстанс, ніж запускати багато інстансів, кожен із своїми локальними даними

Не знав, що розробники гри з України. Не дарма купив.

А чому Unity, а не Godot?

Мб потому что для того чтобы допилить годот нужно вкинуть много денег в этот самый годот.

А що там допилювати? Для потреб AtomRPG того що є вистачить з головою.

Зате не таке убоге, як те Unity і працює нормально

Вітаю! Скажу як було. Ми представники «старої» школи та мали досвід тільки з комерційними «серйозними» рушіями. Спочатку, як воно часто буває, розробка велася на власному (с++) рушії, все то було більше як хобі, цікаво було просто «щось писати в вільний час», приймали в лави розробників всіх охочих, про щось комерційне навіть не думали.
А от коли зрозуміли що потенційним гравцям проект подобається, ми, щоб зменшити ризики, взяли перше що було безкоштовне, добре задокументоване та з купою туторів. З іншого боку, з нас ніхто не мав досвіду ні в c#, ні в unity, вчилися по туторам та докам. Дуже можливо, що аби godot був тоді такий відомий (нам), то був би godot.
(по темі «чому та як» в мене інфи на повноцінну статтю, плюсуйте: якщо спільноті буде цікаво, то напишу)

Плюсую. Залюбки почитав би статтю.

Ми в YC обрали Godot, бо по-перше ліцензія MIT і повний опенсорс. По-друге, писати можна на С++, а не на убогому C# (хоча на ньому теж ніхто не забороняє). По-третє, дуже подобається філософія і підхід до розробки: EСS, дерево нодів і т.п. В четвертих, 2D та 3D підсистеми не залежать одна від одної і можна робити чисто 2D гру, чого не дозволяє юніті

Секта свидетелей с++, и убогого с#, ну ок. Чисто рассуждения школьника.

Чисто рассуждения школьника

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

Ага, в геймдев не берут людей которые не купили красный кандибобер, и не воевали в Афганистане.

Ти часом над Cyberpunk 2077 не працював? )

Им нужны те кто воевал во Вьетнаме, а за Афганистан, это к дедам из croteam которые serious engine клепают.

Мені дуже подобається підхід, коли є і текстове, і графічне представлення.

Для прикладу AADL (Architecture Analysis and Design Language)

Бачу, що йде робота над українською локалізацією.
Маю такі питання:
Українська мова на Switch буде доступна?
Підтримувати локалізацію купівлею варто до виходу локалізації чи після?

Українська буде скрізь: ios, android, xbox, ps4/5, switch, pc/mac/linux
Ваша підтримка — це єдине що в нас є, бо ми інді. У нас нема ні інвесторів, ні паблішерів, ні інших папіків.

Люто плюсую. За останні роки побачив дуже багато ігор з українською локалізацією. Після 30 років дискримінації і панування російської в усіх сферах, це не може не тішити

Початківцям раджу GamePlay ingredients. Це не візуальний скриптинг, а готові рішення в інспекторі. Можна без коду налаштувати події, менеджери, стани тощо

Дякую за статтю! Не знав, що Atom робили українські девелопери.

І якби ми знайшли готове, скористалися б цим.

Чи правильно я розумію — шукали готове та не знайшли?

Трохи дивно, бо для Юніті є усім відомий Bolt, який Юніті викупила та зробила доступним з коробки з 2021 версії рушія. Якщо рушій старший, то ассет ставиться зі стору і є безплатним. І викупили вони його не просто так — ассет дуже потужний і надзвичайно якісний.

Рік тому спробував Bolt. Мені здався недостатньо гнучким. Це вже покращили?

Важко відповісти, не знаючи у чому саме він видався вам недостатньо гнучким :)

Ми перейшли на unity десь в 2017-2018 році, тоді це був єдиний добре задокументований рушій, на який можна було перейти, не маючи коштів на розробку. Тоді було не так багато можливостей.

Bolt релізнувся влітку 2017 і коли я його придбав восени того ж року, він вже був функціональніший та приємніший у користуванні, аніж PlayMaker. Just saying.

До речі, чому не дивились в сторону PlayMaker? Йому вже більше 10-ти років, мабуть.

Конкретно про PlayMaker я не пам’ятаю. Але ми точно дивилися щось схоже. Як я писав в статті, нам треба була проста система для діалогів. Саме її і шукали.
Глянув Bolt та PlayMaker — цікаві штуки. Можливо, аби зараз починали, то я б забрав в проект. Хоча, якщо чесно, я не фанат unity та c#. Я люблю с та с++, зараз би точно починали з unreal, там трохи більше дають «з коробки» (хоча там сам с++ важко назвати чистим та чесним)

Тепер хочу поглянути ближче на ваше рішення. Де знайти modkit, який ви створили для спільноти?

Обожнюю RPG класичного стилю і про вашу гру вже чув, але ще не пробував грати. А тепер чекатиму української локалізації.
Оголосіть приблизну дату готовності. Або де можна чекати новину про це?

У коментарях до іншої статті розробник розповідав, що український переклад Atom RPG вже готовий на 86%
gamedev.dou.ua/...​he-2021-gamedev/#comments

В сьогоднішній розсилці від www.patreon.com/sbt_localization прийшло таке

Atom RPG — 5% редаговано (усього 870 тисяч слів). Локалізацію вже можна спробувати в грі. Для цього в Steam треба вибрати в гілці тестування lang_test — lang_test.

Вітаю!
почати краще тут: steamcommunity.com/...​iledetails/?id=1713655141
ютубчики тут: www.youtube.com/...​/UCKshSkwZiynYP3mSTT76vsQ
тут діскорд: discord.gg/qGxSSwGgTh
git: github.com/atomrpg/modkit

Скажу чесно, тут у нас ще безлад. Але якщо копнути, то все можна спитати, покрурити, розібратися. В діскорді завжди допоможуть!

Подписаться на комментарии