UE5: Как я смирился и полюбил блюпринты

Давно писал пост про попытку попробовать ангелскрипт плагин в UE5, по итогу когда после долгого перерыва вернулся к разработке понял что нахрен не нужно оно. Блюпринты никого не убивали на самом деле, а зато дают плавный опыт работы с двиглом. И понятно как оно работает.

Я, как раньше разрабивший на блице и немного на юнити, охреневаю от сложности UE5, но со временем привыкаешь, начинаешь даже клепать что-то по вайбу, не думая о перфе или чем-то таком, фокусируясь на игровых возможностях.

Так а про что игра-то? а то я не рассказывал. Мы с приятелем (он UE5-разраб, в основном UIщик) как-то переписывались и поняли, что хватит это терпеть, надо свою игру делать. Идея, в трёх словах, кооперативный головоломка-детектив-шутер в sci-fi, с космосом и полуоткрытым миром. Чтобы не велосипедировать и в целом поучиться лучшим практикам двигла, взяли Lyra за основу. Lyra это, типа, недотурнамент, с целиком работающей сетевой игрой и ботами.

Ох, как же это было сложно. Там собрались «самые лучшие и правильные» архитектурные идеи, и я, как привыкший к логике «чтобы поставить куб нужно просто поставить куб», по-русски говоря, охуел. Поначалу количество абстракций убивало: вытащено в Data Driven абсолютно всё, раздекаплено так что стрельба раскидана по 10 классам, часть из которых в C++, часть в блюпринтах, завязано это всё на систему инвентаря, в котором дефинишены эквипа, вещей раскиданы в датаассеты, а сама логика работы с ними и связанной с этим графики… Кароче, для меня не знавшего это было очень сложно. Кстати, не только для меня. Чел целый сайт про разбор этой Лиры сделал, вот он. Эпики уже сдались и сами ссылаются туда на конфах, так как от них доки по Лире особо не завезли. А, кстати, UE5 с болью запускался на моём ноуте, несмотря на нехилые такие спеки (32 гига озу, встройка 680M). Ну, я лукавлю, запускался, в целом, окей. Разрабить можно было, но это, наверное, самое тяжелое что я на этом ноуте когда-либо запускал. Говорят, плохому футболисту мяч мешает…

В общем, это были мои первые ощущения, это и было причиной почему я охладел к этому всему и отложил в сторону на несколько месяцев. Дальше, я пробовал начать прямо с самого нуля в рейлибе (попутно с осваиванием нового языка Zig), но тоже долго это не продлилось: осознание количества необходимой работы дизморалило даже начинать. Потом я попытался в годоте что-то сделать, накидал там перса, движение, и тоже понял: ох как же дохрена делать.

Шло время, а воз был и ныне там. Я купил себе новую-кленовую пеку, специально подогнав спеки под потенциальный запуск UE5. И вот как-то раз, меня осенило — ну я и дебил. У меня было всё: сеть, инвентарь, стрельба, перс, вполне себе нормальная графика, фреймворк. А я всё это хотел променять на что? на геморрой? как всегда, сесть писать движки вместо игр? С этой мыслью, пройдя такой бесславный путь, я снова открыл UE5. И знаете, на этот раз мне всё было понятно. Я просто поборол своё нежелание читать чужой код, разбираться в чужой архитектуре. Просто сел и читал. Читал. Если что-то не понимал, ходил в чатгопоте, гуглил, разбирался, понимал почему сделано так а не иначе. И вот что я скажу: хуйня эта ваша Лира. Нету там чего-то неимоверно сложного. Да, местами перемудрили, но при желании, даже если заранее не знаешь, можно понять как правильно инпуты прикрутить, как закастомить камеру так чтобы был вид сверху а не третье лицо. Как встроить квестовую и диалоговую систему. И при этом оно всё, почти без усилий, отлично работает по сети. Это ли не сказка? Это ли не то, о чём мечтает разработчик игр?

Так вот, возвращаясь к основной теме: блюпринты. Ну классная же штука! и, если ты не работал с анрылом, тебе может показаться что это только про блоксхемки и логику. На самом деле нет: через них ты можешь собирать игровые объекты из других блюпринтов/крестовых классов. Можешь даже не хранить в них логику, а только данные: например сделал класс/блюпринт оружия, а дальше добавил туда поля какие геймплейные абилки оно даёт, какая моделька, какие эффекты, какой дамаг и так далее через формочки в самом редакторе движка. А потом бац, винтовка! или пистолет. Наверное, такая штука это какой-то общеизвестный паттерн, но я об этом не знаю, я просто мимо проходил во всей этой разработке на UE5. А, ну ещё через эти блоксхекмы прикольно в моменте что-то спрототипировать, а дальше на чистую можно и на крестах написать. Один минус: код-агентов сейчас под них особо не завезли, ну и да ладно. Там несложно. Да и всё сложное никто не запретит описать на плюсах, собсно это так и предполагается. Глупенькие геймдизайнеры клепают блюпринты, продвинутые разрабы сурово пишут кресты.

Не знаю, какая мораль. И до куда мы дойдем с этим проектом. Но одно могу сказать точно: дорогие булчане, пишите игры! хватит писать движки! лучше получить 1 какую-то игрушку, а не 10 недописанных и недобитых велосипедов. Осваивайте мощные инструменты, а не проделывайте путь от камня до кремниевого кристалла самостоятельно.

Короче, ничего нового. До встречи! пусть у всех получится допилить свою игрульку!

Mafia Definitive Edition



Прошёл Мафию Диффиченто Эдишен.

Уже был наслышан о том, что в ремейке много чего убрано, так что начинал играть уже без завышенных ожиданий.

Но вот что забесило, так это то, что переиначили сюжет и характеры персонажей, причём без особых на то причин. В оригинале Томми, загнанный в угол, просит защиты у Дона Сальери, и тот берёт его к себе на работу шофёром. Здесь же Томми сразу же рвётся быть гангстером. Сара бухает пиво с мужиками на гоночном треке, а её отец в прошлом тот ещё головорез, Ральфи “на ножах” с Поли и т.д. Хотя вся суть этих персонажей в оригинале была в том, что они обычные люди, без гангстерских замашек, но так уж получилось, что работают на Дона. Как будто эффективные манагеры дали задачу пройтись по всем сюжетным персонажам и сделать их них “крутых”?

Пропердоллили и те моменты, которые делали Мафию Мафией, а не очередным клоном ГТА.

В самом начале Ральфи в катсцене учит Томми открывать замок на машине, но далее в игре Томми просто может угнать любую машину, как в GTA, и весь смысл теряется. В Оригинале Ральфи именно учил Томми угонять машины, со временем увеличивая выбор тачек. Теперь же всё упростили.

В том же был и смысл миссий Луки Бертоне — заработать себе доступ к бОльшему числу тачек. Впрочем, я проходил их просто ради контента, потому что это всё ещё были миссии, не так ли? Здесь же два раза Лука в катсценах намекает Томми о том, что у него есть “некие машины” и “возможности заработать”. Миссии Лукаса явно планировались, но после гонок на треке мы Луку больше не увидим.

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

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

По сути, игру низвели почти до уровня интерактивного кино. Бегаешь от катсцены к катсцене, убивая по пути не особо сопротивляющихся врагов. Да, я в курсе, что можно было выбрать более высокий уровень сложности при старте… Но зачем? Хардкор ради хардкора? Мафия 1 была сложна не для того, чтобы враги больно стреляли, а чтобы игрок искал неочевидные варианты прохождения миссий, и в ремейке этот момент потерян.

Плюсы:

Катсцены отлично и зрелищно срежиссированы.
Графика неплохая.
Не отнимает много времени, чтобы ознакомиться.

Поиграть можно, но чего-то выдающегося ждать не стоит.

Как Жека приложение с сервера на сервер переносил (IT-триллер)

Всем привет!

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

Приложение: джава-прога с веб-мордой.
Сервер 1 (старый): CentOS 7
Сервер 2 (новый): AstraLinux 1.7

Прога — всё в докере: джава, постгрес, нжинкс, файлбит.

По сути перенос — это копирование файлов между серверами.
На новом сервере монтируем докеровские папки со старого сервера, и всё работает «as expected».

Это не первый мой подобный перенос, и я придерживался такого алгоритма:
  1. Останавливаем контейнер с прогой
  2. Делаем бэкап БД, т.к. хочется накатить его на постгрес свежей версии, (н-р 12.4 -> 16.4) простое копирование папки не сработает
  3. Останавливаем все контейнеры
  4. Запаковываем всё в архив без сжатия; для удобства, чтобы затем копировать 1 файл и видеть сколько времени осталось, да и по скорости это должно быть быстрее
  5. Копируем через scp с сервера на сервер

Прошлые проекты занимали в предалах 5-20 гб, а последний — 85 гб, именно большой размер превратил рутину в триллер.
Читать дальше

CyberGrad 2033 Архитектура: Ecs

Предыдущий пост: CyberGrad 2033

Сразу оговорюсь, данная реализация лишь внешне выглядит как Ecs, под капотом это скорее всего что-то совершенно другое, т.к я не в курсе как выглядят настоящие Ecs
Так же тут нет никакой претензии на производительность, главными приоритетами были удобство, простота и нативная интеграция с движком.

Основные сущности, на которых все держиться: Энтити, компоненты, системы и сервисы.

Entity
Это класс, наследник Node, в нем я реализовал методы добавления/удаления компонентов.
На старте энтити пробегается по своим чилдам и если они являются компонентами, добавляет в словарь.

Components
Это тоже наследник Node, потому что я хочу иметь возможность добавлять компоненты через редактор
Компоненты не содержат логики (хотя никто не запретит), толко данные и могут содержать ссылки на другие ноды

Systems
Тут происходит вся логика с энтитями, но только с теми, которые попадают под фильтр этой системы.
У систем есть несколько коллбэков, которые имплементируются интерфесами
IInitSystem — вызовется один раз при старте игры
IDestroySystem — вызовется один раз при завершении
IEntitiesAdded — вызывается когда появляется новый энтити, подходящий под фильтр системы (только один раз)
IEntitiesUpdate — вызывается каждый кадр и содержит всех энтитей подходящих под фильтр
IEntitiesPhysicsUpdate — то же самое но каждый апдейт физики
IComponentsRemoved — вызывается когда энтити больше не подходит под фильтр

Services
Немного походяд на системы, но если система работает с энтитями, то сервисы это просто утилитарные классы, которые могут делать что угодно. К примеру AudioService — который воспроизводит звуки в игре.
Сервисы умеют в следующие интерфейсы:
IInit — на старте игры один раз
IUpdate — каждый кадр
Читать дальше

CyberGrad 2033

Начал пилить игру перед самым новым годом, буду выкладывать тут прогресс (а может и не буду)


Жанр: Топдаун шутер
Сеттинг: Ближайшее грустное будущее в мухосранске провинциальном городке
Сюжет: ЧатГПТ 6 захватил склад Амазон и теперь клепает из бытовых товаров истребителей кожанных мешков. Робот пылесос с ножом на изоленте — один из простых врагов.
Главный герой — отважный курьер, который должен доставлять заказы в этом опасном городе.

Специально для этого проекта запилил ECS, FSM и Dependency Injection
Очень нравится как получилось сделать архитектуру, может быть потом распишу

Видос

С новым годом, булчане!

Этот год был непростым (впрочем, как и все где-то после 2020, и я не про математику), ну что поделать. Желаю всем заниматься любимым делом, оставаться молодыми в душе, чтобы глаза горели от энтузиазма (молодость, геймдев, хардкор, Мытищи — вы всё знаете), и поменьше сталкиваться со всякими трудностями.

Тем кто пилит игры — отдельное пожелание успешно довести их до релиза!

Kotlin, KorGE и корутины для организации игрового цикла.

Я вчера решил ради интереса посмотреть движок KorGE. Он довольно простой, для 2д игр, поддерживает сборку под разные платформы типа мобильных и веб.

Что меня заинтересовало — в нём активно используются корутины!
Читать дальше

Пилю физический движок и автосимулятор на нём.

Кажется, я уже перерос libgdx и он сейчас больше мешает, чем помогает. Кто-то писал что к godot легко прикрутить свой физический движок — жду в комментариях рассказа как это сделать и ссылок с примерами.

Читать дальше

Angelscript: где он обитает и с чем его едят

Здарова, пекари.

Решил вытащить обсуждение из тг чата в альфабулчанск. Оказывается Angelscript существует уже очень давно, а с ним даже успел поработать MrF в своём самописном движке. Слышал Кнайт биндинги к Xors3D делал.

С чего вообще сыр-бор: недавно вот наткнулся на сабж angelscript.hazelight.se/
Я тут в свободное время крайне медленно пилю «игру мечты» на UE5, и хотелось чего-то среднего между крестами и блюпринтами. А тут вот это нашёл и выглядит очень вкусно на первый взгляд.

Вопрос булке: как вам вообще ангел? стоит свеч? какие подводные?
А вдруг кто-то прямо с этим плагином тут работал? если да, то вообще очень круто. Если нет то буду первым, потом тут расскажу.

А что расскажу? Вкратце, хочу интегрировать Angelscript в Lyra-подобную data driven архитектуру, выкинув оттуда откровенно архитектурный булщит.

Топик о возможностях и проблемах статической типизации

Я тут на скале попробовал написать код, чтобы компилятор знал про размерности как в системе СИ, и догадывался, что скорость, поделённая на время — это ускорение. И не давал его складывать с чем-нибудь другим.
(Сам пост тут, сори мне лень из маркдауна в форумный вид форматировать, может потом попробую, да и статья немножкно не об этом).

Так вот, идея размерностей проиходят на физике в шестом классе. Компиляторы развиваются полвека как минимум.
Но почему, блин, я такую относительно простую концепцию смог записать только в довольно простом виде только сейчас и на немейнстримном языке?
На части языков это невозможно, на части языков придётся через числа Чёрча изобретать арифметику заново и писать нечитаемый код. Ещё на С++ на шаблонах можно, но сам по себе С++ можно назвать одним большим извращением.

А казалось бы задача не сложная — параметризовать шаблонный тип целыми числами и делать арифметические операции в compile time. Всё.