Разработка игр, идеи, проекты
  • Дата создания
    16 января 2025
  • Топиков
    3
  • Ограничение на постинг
    0.000
  • Категория:
    Разработка игр

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
Очень нравится как получилось сделать архитектуру, может быть потом распишу

Видос

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

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

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

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

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

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

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

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

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

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