Участвуя в конкурсе (не) изучил Игровой Движок

Непонимание темы, изучение нового для себя игрового движка, одновременная работа над двумя играми, дедлайн, кривая реализация и всё это меньше чем за четыре недели.

Вступление

Конкурс. Тема: Реальность и Фантазия. Дополнительное условие: “два геймплея одного жанра”.

Долго сидел и думал над условием. Были одни вопросы, мне нужна была конкретика, но ощущал я это всё исключительно туманно, неизвестны были рамки дозволенного. К этому добавлялось то, что я обещал попробовать и сделать игру на неизвестном мне ранее движке.

В голове накидал идеи, одна эпичнее другой и требовала бы по году разработки, а то и больше. К какому-то моменту решил сделать свой любимый финт на конкурсы — склеить все разные идеи в одну. Таким образом появился “Концепт Вирмир2”.

Что получилось

В результате участия вышла недоделка, а вот небольшая демонстрация:

Более чем 50% игры

Кратко что есть: микро квартира, где игрок может “поспать”, “поесть” и главное поиграть в компьютер! А в компьютере игра Вирмир, где игрок ходит, прыгает и “гладит” вражеских рыцарей палкой, а они и не против они игрока в ответ. Цель проста: добраться до выхода включая рычаги, которые отпирают решётки. Игра простая как 5 копеек!

Логотип конкурса повесил на стену, потому что не успел и\или не смог сделать заглавный экран. У отсутствия заглавного экрана есть ещё одна проблема: игра начинается сразу же, что как мне кажется мешает некоторым игрокам.

Оригинальная задумка

Предполагался относительно крупный проект, который реально реализовать в рамках 3-4 недель. Примерно 14.04.2023 начал составлять простой текстовый документ, описывающий все важные моменты игровой идеи. Вышло очень много, поэтому передам лишь основную суть:

Если кратко (хе-хе, ну да, ну да), то игра была поделена на 3 главы, 3 “геймплея”. Подразумевалось, что глава-геймплей ведётся от лица разных персонажей, так сказать.

В первой главе (Глава1) играем за Персонажа1, который живёт в квартире и ходит на работу НА_ЗАВОД. jpg, где выполняет простую нудную задачу — нажатие на кнопки, мини-игра. Придя домой он включает очень увлекательную (нет) игру под названием Вирмир2, где управляет рыцарем и проходит уровни. А ещё Персонаж1 должен был спать, ходить в туалет и кушац, а еда покупалась на деньги, которые давали за то, что ходишь на работу. При этом на работу надо ездить на автобусе, хотя в рамках реализации это был бы скорее трамвай.

Примерный вид как выглядела бы локация Город, где и жилище (К. - Комната) героя и "завод" (Р. - Работа) и линия движения (А - Автобус).
Примерный вид как выглядела бы локация Город, где и жилище (К. - Комната) героя и "завод" (Р. - Работа) и линия движения (А - Автобус).

Собственно уже в первой главе была внесена реализация темы конкурса, а в итоге я и сократил свою игру до минимального необходимого Главы1.

Вторая глава (Глава2) по сюжету резко меняет игрока на Персонажа2, который в концепте был «Милиционер”. В Главе1 мы ходили и спокойно интерактивили с кнопками, делали ближний бой и прыгали, а в Главе 2 я хотел всё это перевернуть в медленный шутер от первого лица, с явным вдохновением от Resident Evil. Врагами бы выступали зомби с бубликовидными телами. Почему такой формы? Не знаю! Наверно снова подсознательные метафоры о »пустых” людях с ноткой геймплейного решения сложности прицеливания.

Шутер против бубкликиных зомби и про бахилы не забудьте
Шутер против бубкликиных зомби и про бахилы не забудьте

Третья глава (Глава3) предполагает гибридность как геймплея, так и истории между Персонажем2 и персонажем из Вирмир2, которым управляет Персонаж1 (в итоге этого персонажа я назвал как Персонаж3). Игрока должно было кидать то в шутерный геймплей, то в рыцарский. Перекидывание так же крылось и в сюжетном антураже.

О Сеттинге, Сюжете и Атмосфере

В Главе1 за Персонажа1 (этот режим и сеттинг я назвал Геймплей1) всё должно было быть серым, обычным, возможно, антиутопия. Затем я подумал, что складывая ограничения, навыки и время это место не просто должно быть серым, но ещё и очень минималистичным. Да чего скрывать, оно должно передавать типичную серость окружающего мира (хотя таким я его не вижу).

Геймплей2 (или Вирмир2) же должен был быть классическим рыцарским фэнтази за Персонажа3. Фентезийно мрачное настроение, которое явно контрастировало бы с блеклой серостью Геймплей1, должно было бы подчеркнуть различия, а динамичный игровой процесс усилить разноплановость. Всего планировалось лишь 3 уровня.

По сюжету когда Персонаж1 доигрывает за Персонажа3 в Геймплей2 последний уровень, где встречается босс, то случается удар током и от этого нас перекидывает в Персонаж2.

Персонаж2 в Геймплей3 исследует и воюет в зомби в Больнице, куда попал Персонаж1 после удара током, что игроку конечно не известно. По ходу раздумий был вариант заменить место действия под улицы города из Геймплей1, метался от одной идеи до другой, но решил что хочу видеть именно Больницу как замкнутое пространство.

К какому-то моменту Геймплей3 превращался в так сказать Геймпрей4, а именно в гибрид Геймплей3 и Геймплей2. Сюжетно оба мира начали существовать в одном. Персонаж2 пересекался с (виртуальным) Персонаж3, сеттинг\локации тоже пересекались: проходя по больничным коридорам и зайдя в дверь игрок мог очутиться в замке.

Финал был такой, что игрок доходит до босса-Колдуна, побеждает его, а Персонаж1 просыпается, конец.

Так выглядели бы гибридные моменты. Пистолет против рыцаря, меч против лифта! Вернее врага в лифте.
Так выглядели бы гибридные моменты. Пистолет против рыцаря, меч против лифта! Вернее врага в лифте.

Дедлайн близко

Времени практически не было, хотя почти каждый день всего конкурса я так или иначе думал о концепте и толком ничего не делая по нему.

Решено было ещё больше сократить свою Эпичную задумку. Это было третье сокращение (другие не были задокументированы), последнее до принятия окончательного решения “сделать и всё тут”.

Результатом стал вот такой рисунок постфактум:

Участвуя в конкурсе (не) изучил Игровой Движок

Забавно, но даже из этого концепта была выброшена одна вещь! А именно система с ключами, которые должны были выпадать, чтобы разрешить воспользоваться рычагом.

Из Геймплей1 было вырезано почти всё, кроме главного антуражного элемента и остался Сон с Голодом без подкрепляющих их игровых особенностей.

Геймплей3 был полностью выкинут, как и Персонаж2.

Геймплей2 наверно меньше всего пострадал в плане “фантазия@реальность”, хотя тоже значимо подстриг: От размера локации была выкинута идея чекпойнтов, не реализованы враги стреляющие, а ещё всего 1 короткий уровень против 3 полноценных.

Тот уровень что получился это наверно должна была бы быть 1/3 от одного полноценного. Дело не столько в масштабах, сколько в идее того, что стычка с врагом должна даваться не так просто. В итоге получилось очередное избиение палкой тупых болванчиков.

А ещё в игры я хотел показать фразу “Взгляни вокруг — это реальность, а на мониторе — это фантазия” или что-то такое очевидное, поучительное. Но даже это не было реализовано.

Изучение игрового движка Годот

Кратко о моём геймдевном бэкраунде, если суммировать: Game Maker головного мозга, немного Unity, пару раз открывал Unreal Engine, застукан за движкописанием на C++ OpenGL\DirectX.

Движок я не сравнивал с другими, а принял “вызов” по его изучению с нуля, словно ничего не знаю о своём опыте. На удивление такой подход сработал, хотя так или иначе приходили мысли о том, что “о, это почти как в GameMaker”.

Идея архитектуры движка, если я верно понимаю, в том, что всё кругом есть ноды т.е. это минимальный атом структуры, так сказать. У ноды есть дочерние ноды и\или родительская. Одна нода наследуется от другой.

Основной сложностью лично для меня стало понимание и принятие нод, самой концепции. И что на одну ноду можно нацепить лишь один скрипт, в отличии от Unity (ну вот, опять сравнения сами собой идут!).

Смирился с идеями Ноды, даже 1 скрипт на ноду, что мне казалось странным ограничением. Но затем я обнаружил какую-то даже связь с GM в том, что по идее объект в GM можно описать тоже как один лишь скрипт (так кстати представляется игровой объект в редакторе кода GMEdit от YellowAfterLife).

Вообще по ходу изучения движка я подмечал какие-то схожести с GM больше, чем с Unity. В итоге если поставить GM как 0, Unity как 10, то Godot был бы как 4 как мне кажется. Это не оценка, а положение схожести.

Участвуя в конкурсе (не) изучил Игровой Движок

Мой проект был 3D, следовательно посмотрел лишь поверхностные вещи трёхмерности в Godot. Даже интерфейсы особо не попались мне, кроме ProgressBar и Lable.

Пробовал импортнуть 3D модели, но я не сразу разобрался с этим. Какие-то вещи не были столь интуитивны, например, я не понимал как из самого файла с моделью получить именно что сам Mesh. В итоге оказалось, что это настраивается во вкладке Import, которая всегда была на экране, но в упор не видел её. Пока это один из тех моментов, который мне не понравился структурно: модель это файл из которого ещё нужно вытаскивать Mesh. ОДНАКО, этот файл считывается как Сцена, который можно расположить на уровне, что оказалось буквально как в Unity.

Сцена. Возможно это кому-то может показаться тоже непонятно, но я по каким-то причинам (возможно, ещё школьным) сразу же принял это. Сцена — это тоже Нода! А нода со своими дочерними нодами может быть Сценой! А сохранённая Сцена может быть добавлена в другую Сцену как нода! Сцена Нода, Нода Сцена, Сцена! А если выражаться терминами Unity, то Сцена это аналог Префаба.

Процесс обучения и информация

Документация(оффлайн, в движке) у меня не вызывала особых проблем, она достаточно техническая, хотя есть в онлайн документации и целые уроки для старта.

Основным источником информации для меня стал YouTube и Google. В строку поиска задавал то, что мне необходимо в данный момент, смотрел кто как реализовывает это и что-то повторять, одновременно с этим пытаясь понять что это значит. В итоге у меня получилось не просто копировать видеоуроки, а именно что подсмотреть реализацию и сделать по-своему.

Так же в комментариях к коду я сохранял какие-то ссылки на видео, не знаю насколько будет интересно, но поделюсь ими:

Разумеется это не все видео и далеко не все ссылки, которые были открыты в этом обучающем путешествии.

Уровень

Прототипы уровней я собрал используя CSG, которые встроенные прямо в Godot. Выглядело это конечно как крайне упрощённая версия того, что доступно скажем в Unreal Engine.

Если пытаться просто объяснить CSG, то это метод создания уровней (или даже объектов), когда мы либо “складываем”, либо “вычитаем” примитивные формы. Например, взяв большой куб и вычтем из него куб поменьше и вот у нас комната! … без окон и дверей правда, но думаю понятно!

Участвуя в конкурсе (не) изучил Игровой Движок

Для локации “Квартира” (Геймплей1) я накидал такой CSG концепт, но дальше заменил это всё моделью. А вот локация “Замок”(Геймплей2) полностью состоит из таких вот примитивов с операциями, накидал её честно говоря в спешке от чего можно заметить там странные решения, которые в итоге потом использовались для спидрана!

Быстрая графика в Блендере

Удивительно как быстро я накидал базовые формы и модели для окружения комнаты: стол, монитор, стул, кухня, холодильник и кровать.

Участвуя в конкурсе (не) изучил Игровой Движок

Но оказалось не всё так радужно! Во время моделирования у меня появилось резкое желание использовать один давно установленный плагин, но я забыл, что блендер только что обновился, а плагин соответственно не адаптирован под новую версию. Ну и всё вылетало! Всё аж йокнуло, но я был уверен, что сохранялся. Спокойно переоткрываю файл с моделями и … ничего нет! Весь процесс в никуда! Тогда у меня можно сказать бомбануло от самой ситуации и уверенности в сохранении, которая противоречила реальности.

Но спокойствие! Медленно, спокойно осматриваю интерфейс Блендера и вижу кнопку о восстановлении прошлых сессий. Программа отрывает папку, а там несколько файлов, среди которых есть и с сохранённым прогрессом по моделям. Хвала автосохранению!

Рыцарь из 2012, Рыцарь из игры, Рычаг, решётка.
Рыцарь из 2012, Рыцарь из игры, Рычаг, решётка.

Отголоски прошлого достигли меня в модели рыцаря, которую достал из своих старых запасов. Модель где-то 2012 года, когда-то тогда хотел сделать сетевую игру с сокомандниками, ещё в школьные годы это было. Игровая задумка называлась CrownGame. Рыцарь был взят как placeholder, но как известно нет ничего более постоянного, чем временное.

Отступление или Тайна Монолита

В комнате через окно слева виден загадочный объект, прозванный игроками Монолит. В чем же его мистическое предназначение? Мне не хочется рушить всю таинственность, но отвечу на это честно и прямо!

Мне кажется какие-то вещи в этой простой поделке могут быть интерпретированы как какой-то глубокий смысл, который первоначально не был заложен, но в итоге хорошо ложится. Возможно это даже какая-то тема для СПГС.

Так вот, коробка эта является ничем иным как гробом для персонажа игрока! В силу своих малых знаний движка и сверх лимитах по времени я не придумал ничего лучше, чем отправить персонажа в позицию, где он бы был заблокирован в передвижении и взаимодействии. Я и не подумал и не проверил, что данная коробка видна из окна. Но выходит, что такая композиция словно говорит “дышит в затылок”(хоть и в бок), напоминая о том, что ничто не вечно и скоро эта коробка будет достигнет свою цель.

Монолит в окне
Монолит в окне

Итог

Что же я могу сказать подведя итог. Стоит выделить целых два итога: 1. по проекту и 2. по движку.

Честно говоря и думаю очевидно для всех, но игра у меня не удалась. Возможно, что концепт прототипа альфа версии и вполне себе, но свою оригинальную задумку я не воплотил.

По движку могу сказать следующее: имея опыт в GameMaker и немного Unity можно поставить Godot между ними, при этом я бы даже рекомендовал некоторым желающим попробовать начать делать игры с этого движка, если хочется именно 3D. Параллельно с этой разработкой я так же участвовал с другой игрой в качестве художника, но уже на движке Unity и ощущения так сказать свежи. Лучше начинать в Godot.

К тому же движок полностью бесплатный и с открытым исходным кодом, есть сообщество, плагины и материалы для обучения. Это для тех, кто скажем не хочет сталкиваться с подписочной моделью GameMaker (но сам движок можно попробовать бесплатно, а вот для создания EXE — подписка, если не покупался ранее).

Можно скачать то, что у меня получилось вот по этой ссылке с Dropbox: https://www.dropbox.com/s/cffgetv5v85x045/G25_G_2.zip?dl=0

Возможно, когда-то пойдёт чистка всякого хлама с сервиса у меня, так что возможно, когда-нибудь эта ссылка перестанет работать.

Расскажите пробовали ли вы движок Godot? И если да, то какое о нём мнение у вас? Сложный или простой он, для каких игр на ваш взгляд подходит?

Если вас интересуют какие-то конкретно технические моменты реализации из моей игры, то спрашивайте!

Всем спасибо, всем пока!

Могу ли я сказать, что это #лонг ?

3333
2 комментария

Интересная статья получилась и идея игры вдохновляет на свои реализации. Насчёт прикрепления нескольких скриптов к одному узлу(ноду), не совсем понял зачем это нужно. Если ты про возможность наследовать другой класс/скрипт то там есть ключевые слова extend *название узла или путь к другому скрипту/классу* и class name *название класса, которым становится этот скрипт* . Всё в этом движке включая ноды завязанно на банальной иерархии классов или ООП. Я сам новичок, так что мог не правильно тебя понять или неправильно выразиться.

1

Спасибо! Ты всё верно понял про мой "уу всего один скрипт". Дело в том, что в начале волей-неволей проводил аналогии с тем же Unity и там для каких-то моментов куда проще на один объект (считай узел) накинуть несколько скриптов.
Потом конечно я понял, что можно такие моменты в отдельный дочерний узел. Например, у меня так сделан Голод, Сон и Здоровье (прикрепил картинку для примера).
Про extend и иерархию всё верно. Скажем в GameMaker аналогичное наследование (только один родитель, но множество дочерних), а "расширение" делаются иными способами, отличными от Unity и Godot (хотя не исключаю, что это я неправильно использую GM).

1