Лавка Разработчика
3.35K subscribers
388 photos
42 videos
16 files
631 links
Мы тут игры пилить будем, или как?

YouTube: https://youtube.com/@gamedevlavka

Автор: @vavilichev

Все контакты: https://linktr.ee/vavilichev
加入频道
Продолжим разбор архитектурных вопросов

Дисклеймер:
Придется потерпеть скучные и местами рваные кусочки информации, потому что я решил собрать всё в кучу, но сделать это постепенно, отслеживая фидбек, чтобы не отойти в сторону. Потом это всё соберется в отдельную видео-лекцию. За вопросы всем заранее спасибо!

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

1. Существуют классы, которые знают КАК менять данные. Знают, потому что вы их написали, конечно. Их называют обработчики данных. На скринах можно увидеть пример обработки добавления предмета в инвентарь. Отдельный класс, он умеет только добавлять предмет в инвентарь и возвращать ответ, на этом всё. Это вынесенно намеренно в отдельный класс, чтобы в случае резкого изменения механики добавления просто выбросить этот класс и написать новый без поисков откуда ноги растут. Если при добавлении предмета что-то работает не так - знаем где искать.

2. Сервисы. Это прослойка, которую могут видеть практически все в проекте. Они в себе собирают обработчики данных и могут ими жонглировать, чтобы менять данные как нужно. В сервис инвентаря можно послать команду добавить предмет в инвентарь, убрать, а можно просто написать метод проверки: есть ли предмет в инвентаре. В хорошем исполнении монобехи не могут видеть сервисы, их видят вьюмодели, контроллеры и т.д. Но даже если видят почему-то, игра будет весьма стабильной, т.к. изменение данных происходит в одном месте, которое управляется из какого-либо сервиса.

На скринах показана связка, для чего нужен сервис и как он взаимодействует с данными (через посредника - обработчика данных). Это, наверное, базовая база. MVVM, MVP, MVC, независимо от выбранной базы архитектуры, связка сервис - обработчик данных останется прежней. Если упороться, можно и в ECS применять, но там это излишне, ECS немного по-другому работает,
👍3152🤓2
Еще день, еще схемка! MVVM подъехал

Дисклеймер: схемка расширяет информацию из
предыдущего поста

MVP, MVC, MVVM - распространенные архитектурные паттерны в разработке приложений. Многие говорят, что они фигово ложатся на геймдев, и доля правды в этом есть. Нюанс в том, чтобы понять кто такой View, а кто такой ViewModel/Controller/Presenter, кто из них является монобехом и кто кем управляет. Небольшая путанница, я бы сказал.

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

В своем опыте я видел несколько реализации MVVM, из них была плохая только одна: где ViewModel была монобехом. Было жутко неудобно и непонятно зачем так. Самая надежная схема (представлена в скриншоте) - когда модель представлена сервисами и обработчиками данных, вьюмодели могут ссылаться на сервисы, чтобы запрашивать данные или их изенение, а вью, которые представлены баиндерами (монобехами), могут получать данные из вьюмодели (которые доступны только на чтение), подписываться на них и посылать сигналы с запросом на изменение данных (читай Инпут). Вот и всё

Область видимости следующая:
- Данные никого не видят, их могут только обрабатывать снаружи
- Обработчики команд (данных) видят данные и могут их обрабатывать, больше ни о ком не знают
- Сервисы знают про обработчики команд, имеют данные для чтения и методы для запуска изменения данных. В теории могут создавать вьюмодели
- ВьюМодели знают про сервисы, поэтому могут туда посылать запросы на изменение данных. Также они знают о данных (через сервисы), и могут их конвертировать в удобный формат. Например: при изменении количества объектов в инвентаре реагировать внутренним дополнительным флагом IsInventoryEmpty, эти данные торчат наружа (публичные) в виде реактивных свойств. Ну и методы инпута есть, которые прилетают из монобехов
- Вью (то есть баиндеры), знают про их вьюмодель. Она передается через специальный метод Bind(). Таким образом вью может подписаться на изменение данных (даже обработанных вьюмоделью), и посылать сигналы через публичные методы (инпут).

Как-то так. Остались вопросы - обязательно задавай в комментах!
🔥31👍12❤‍🔥5
Еще одна схемка, очень надеюсь, что понятная для тех, кто слышал слово DI или фразу Dependency Injection

На схемке типичная контейнеризация зависимостей, разделенная на разные уровни доступа:

- Уровень игры, где лежат сервисы, существующие всю игровую сессию. Часто это сервисы аналитики, показа рекламы, платежей, время и подобные

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

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

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

Все вопросы, особенно от тех, кто вообще ничего не понял - жду в комментариях, желательно с пояснением, какая часть именно не понятна.
👍18🔥94🥴2
This media is not supported in your browser
VIEW IN TELEGRAM
Скриншот-суббота
Vol. 137


Схематичная, математичная

🔠 ProjectLazyDungeon движется: разработал формулу симуляции боя, включая вычисление сложности битвы. Получается так, что чем слабее отряд игрока относительно вражеского - тем больше он несет потерь. При этом присутствует доля рандома, так что даже с очень слабым отрядом есть мизерный шанс успешного захвата. Надо будет уже тестить на игроках ошчушчения. Демонстрация в комментах

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

___
Еще играю в Ratchet & Clank: Rift Apart. Будет что рассказать, т.к. намереваюсь пройти. А вы чем занимались на неделе? Кидайте в комменты ваши нюдсы гифки, тексты с результатами!

#скриншотсуббота
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥86😱2
Продолжаем идти по "кусочкам" архитектурной схемки

Наиболее удобным для управления, расширения, изменения данных способом на моем опыте оказался паттерн команда, используемый через сервисы. В игре существует некий ICommandProcessor, который при старте игры/сцены пичкается набором обработчиков команд. То есть фактически процессор бесконечно расширяемый и не зависит от собственных кишков. Этот процессор раздается всем желающим. И все желающие могут создать команду и послать в процессор для обработки.

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

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

Этим мы уже занимались в #пилимигру, если что. У нас как раз домики так строятся.

Вопросики в комменты, пожалуйста!
🔥20👍8
🎯 Ищем игры на релиз и маркетинг!

Мы ищем партнеров, чьи проекты находятся на стадии активной разработки. Нас вдохновляют игры, которые не только развлекают, но и заставляют задуматься.

Идеальный кандидат:

📌 Сформированная команда (1-30 человек) с доказанным опытом или сильным прототипом.
📌 Проект с четкой дорожной картой, ведущей к релизу в ~2026 году.
📌 Игра, сочетающая сильную тематику (техно/этика/история), новаторский геймплей и выразительный визуал.

Мы предлагаем:

Поддержку,
🤝Партнерство,
💥Издательство,
🔥МАРКЕТИНГ

Присылайте свой проект👉 https://yangx.top/CyberRomGamesBot
📩 https://gamecyber.ru
Baldur's Gate III пройден

Играя одну сессию в неделю с друганами, 109 часов геймплея прошлись за полтора года реальной жизни. Впечатляет!
А ведь игра стоит всего $30 (вероятно, где-то подороже, но тем не менее). $30 за 109 часов историй и развлечений, представляете? А говорят, игры дорогие нынче.

Хочу поделиться отзывом об этой игре.

От игрока:
Игра отличная, однако Divinity: Original Sin 2 лучше. В этом мы сошлись во мнении с моими друзьями после завершения BG3. В свою очередь Baldur's Gate 3 взяла награзу GOTY вполне заслуженно. В игре графон, в игре сюжет, в игре тонны интерактивностей, что позволяет не скучать учитывая достаточно однообразную боёвку.

Что понравилось:
- DND с кубиком. Larian показали, как работают механики рандома в ДНД играх буквально подбрасыванием кубика. Это позволило многим игрокам узнать больше о DND (в том числе и для меня) и многих даже побудило поиграть в настолки. Механика классная, и породила множество мемов.
- История. А именно - персонажи. История не про спасение мира, но спасение города, понравилось. Персонажи вообще классные, у каждого своя глубокая история, свои проблемы, страхи, свой характер. Не могу вспомнить персонажей, прописанных лучше, чем в BG 3
- Графоний - завезли. Игра оч красивая
- Сиси и писи - завезли, в том числе романтик и любовные утехи. К тому же все помнят ролик про соитие с друидом в форме медведя. Такое одновременно откровенное и нейтральное изображение темы наготы и секса мне понравилось
- Баланс игры-сюжета, неторопливый геймплей с интересными сюжетными вставками, с большой вариативностью происходящего, плюс зависящего от навыков (в основном харизмы), идеальный кандидат на прохождение в кооперативе под чипсеки

Что НЕ понравилось:
- Прокачка. 12 (вроде) уровней за всю игру, качаются долго и различия между первым уровнем и уровнем после 100 часов игры, не то чтобы не значительны, но хотелось бы больше. Способностей много, но пользуешься 3-4.
- Боевка. Очки действий и навыков перемудрили, как мне кажется. Кто играл, тот поймет. Вроде бы их цель сделать ограничение на использование мощных навыков, но получилось так себе. Сами бои не шибко сложные, чтобы это имело хоть какой-нибудь смысл. Плюс, можно использовать долгий отдых без особых последствий, поэтому после боя можно восстановить все силы. Самое большое разочарование - смещение фокуса с комбинированных атак. Когда разливаешь воду - электризуешь ее, масло - поджигаешь, кровь - мажешь стрелы и т.д. Они есть (комб атаки), но внимания им не уделяется, эффекта от них существенного нет. Стратегия тут скукожилась
- Лут. Тут минус небольшой, за все 109 часов я нашел лишь один плащ на мага, это... Страннова-то

Итог:
BG 3 с точки зрения разработки геймплея и основных механик на самом деле не очень-то большая. Огромная работа была проведена с окружением, с катсценами, с сюжетом, вариативностью и балансом - это правда. Рекомендую ли я в нее поиграть? Наверное, да. Особенно, коопчиком под чипсеки
👍2510🤡4
Поделюсь еще одной схемкой. Более непонятно, но уже ближе к проекту #пилимигру, что мы с вами делаем

В посте выше, я уже рассказывал, как устроены взаимосвязи в MVVM. Но то были взаимосвязи "по вертикали", то есть кто кого видит, и за что отвечает. Теперь же нам нужно бы разобраться, как строятся горизонтальные связи. Как условное оружие, которое можно модернизировать отображается и в геймплее и в UI окошке с крафтом, например? Используют ли они одну вьюмодель?

Прежде чем читать далее, небольшой дисклеймер:
1. На схеме выше, а также в проекте #пилимигру мы делаем не бест оф зе бест реализацию MVVM. Потому что идеальная реализация подразумевает то, что баиндеры - это маленькие монобехи цепляющиеся непосредственно к свойствам классов вьюмодели. То есть в редакторе вешаешь баиндер (монобех) на строку, выбираешь вьюмодель к которой цепляешься и реактивное свойство со строкой. Таким образом такой баиндер можно использовать повсюду. Баиндеры могут быть и на спрайты, и на звуки, и ковертеры вроде bool => Sprite, чтобы в зависимости от реактивного свойтсва подставлять нужную картинку и т.д. Этого у нас не будет, но у меня однажды была попытка сделать подобное в ассете Lukomor. Наверное, надо бы его обновить, глядишь, полезным окажется
2. Вьюмодели нужны не для всех объектов в игре. В зависимости от игры, для мировых объектов вьюмодели могут не применяться. Пример: игры вроде Lethal Company, или R.E.P.O. Все объекты с которыми можно взаимодействовать не нуждаются во вьюмоделях, т.к. не содержат необходимости быть соединенными с моделью. Игрок играет сессию, собирает/рушит/перемещает предметы в игре, но это никак не влияет на модель (сами предметы в модели никак не отображаются). Предметы могут нанести урон игроку - но это происходит за счет игрока, соединенного с моделью, а не предметов. Так что не нужно пихать вьюмодели там, где они не нужны.

В остальном, мы получаем некое дерево зависимостей, с входом через 2 точки: для UI и для World, т.е. для мира. Так разделено, потому что UI обычно создается из префаба, а World (то бишь сцена) имеет какие-то заготовки помимо создаваемых объектов. Фабрики вьюмоделей регистрируются в DI контейнере, поэтому в момент входа на сцену после регистрации, мы можем запросить нам выдать корневые вьюмодели - для UI и для World. Тут же в точке входа мы можем вытащить UIRootBinder и WorldRootBinder и выполнить методы Bind(uiRootViewModel) и Bind(worldRootViewModel) на обоих. Каждая вьюмодель может иметь внутри себя ссылки или списки ссылок на другие вьюмодели. Они даже могут пересекаться (несколько вьюмоделей иметь ссылку на одну и ту же модель, см. ViewModel D). Игрок имеет инвентарь, инвентарь имеет ячейку, ячейка имеет предмет - вложенность, я думаю понятна.

Получается каждый баиндер получает свою модель. И (в нашем проекте) каждый баиндер имеет ссылку на вложенные баиндеры. То есть условный баиндер инвентаря имеет ссылку на баиндеры ячеек инвентаря. Баиндер инвентаря получает вьюмодель инвентаря в которой лежит список вьюмоделей ячеек инвентаря. Баиндер инвентаря проходится по этому списку и запихивает каждую вьюмодель ячейки в баиндер ячейки. И так далее. Получается дерево.

Интересный момент, что при такой структуре разные баиндеры могут получать одну и ту же модель и отображать ее по разному. Вспомним пример с крафтовым оружием из начала поста: вьюмодель оружия содержит информацию обо всех "обвесах", мировой баиндер оружия их визуализирует, а UI баиндер показывает иконками, какой обвес в какой слот на оружии добавлен. Меняя обвес в UI, он автоматически меняется и в мире, т.к. биндеры подписаны на одну и ту же модель

Как-то так. Похоже, скоро всё соберется в кучку и выдавится в видеоролик.. Вопросы!
🔥16👍83
Скриншот-суббота
Vol. 138


Схематичная, нагруженная

🔠 ProjectLazyDungeon по-прежнемудвижется: симуляция боя полностью готова. Высчитываются потери, высчитывается результат, все это применяется и показывается игроку. Плюс появились награды за захват комнат, которые также можно увидеть до и после боя, ну и забрать их, конечно. Также теперь пока отряд занят на захвате комнаты - нельзя стартовать новый захват. В общем, стратегический геймплей вырисовывается. Результат в комментах

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

🔠 Ещё Baldur's Gate III завершил, и почему написал небольшой отзыв. К обсуждению можно присоединиться под этим постом

___
Рассказывайте как ваши дела? Как лето? Как проекты? Всё в комментариях!

#скриншотсуббота
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84
Скриншот-суббота
Vol. 139


No Comments*

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

___
Надеюсь у вас с этим всё в порядке и вы закинете в комменты свои наработки за неделю, закинете же, да?

#скриншотсуббота
👍13💯54
Похоже, что надо вылезать из спячки и что-то делать, да?
👍31💯15🥴11🤷43
Скриншот-суббота
Vol. 140


Пора просыпаться

Всё ещё ничего не делал, но отдохнул, кажетс. Кажется удалось и готов двигаться дальше. Так что, какой-то контент начнет появляться с этой недели. Ну а пока..

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

#скриншотсуббота
🫡13🔥43🏆1
🕹Возвращаемся потихоньку, и начну с поверхностного обзора Ratchet & Clank: Rift Apart от Insomniac

Игра вышла в 2021м году, как демонстрация крутизны PlayStation 5. Через пару лет игра вышла и в Steam (2023).

Игра является продолжением Ratchet & Clank: Into the Nexus, первой части серии, в которую мне погружаться совсем не охота. Даже посмотреть: что там по сюжету. И далее станет понятно, почему.

Итак, Ratchet & Clank: Rift Apart - ААА игра от Insomniac Games, которая славится проработанными анимациями и вниманием к деталям. Собственно, наверное, на этом плюсы в игре и заканчиваются, по крайней мере для меня.

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

Но нам, как разработчикам больше нужны косячки и шороховатости, чтобы в своих играх не натыкаться на те же грабли, верно? Что я увидел в игре и пометил как "не очень":

1. В игре много оружия, и не смотря на то, что оно очень разнообразное, есть четкое преимущество одних над другими. То есть, есть условный автомат, дробовик, снайперка даже, гранаты с разными эффектами, даже спавн миньонов есть, которые атакуют врага. Это здорово. Но 99% геймплея покрывает 2-3 вида оружия. Единственная причина, которая заставляет использовать другое оружие (буквально заставляет): дефицит патронов. Битва с боссами выглядит обычно так: тратишь патроны с подходящих пушек (дальних), а затем вывозишь забрасывая всякой ближней фигней, что есть в наличие. Это не стратегия, это искусственная смена геймплея. Может быть кому-то прикольно, но не мне

2. Сюжет достаточно детский. Он не про становление героев, он такой, типично комиксовый: есть герой, есть злодей, который пакостит - надо победить, а то будет плохо. Краешком задет внутренний конфликт между Ривет и Кит, но весьма поверхностно. Кстати, Кит как персонаж раскрыта сильнее всех, хоть и не полностью. В общем, сюжет на 2/5

3. Еще по геймплею: его пытаются растянуть за счет миниигры Глючкой (типа программка, борящаяся с вирусами в системах, буквально стрелять по вирусам надо), миниигры с Кланком или Кит - головоломка, и за счет арены для Ривет. Глючка - хрень, а не геймплей, просто уничтожить вирусы, одно и тоже раз 6 за всю игру. Скукота без прогрессии. Головоломка с Кланком и Кит неплохая, прогрессия хорошая, только подбешивает что нужно внутри игры постоянно проходить 3 уровня, 3ий уже подбешивает однообразием. Арена для Ривет - хорошее разнообразие, плохая мотивация. Вроде зарабатываешь гайки (деньги), но покупаешь на них ненужное оружие (читать п.1). То есть мотивация остается - получить новый геймплей, новый вызов, чего малова-то, чтобы пройти все доступные арены. Я прошел 2 сложности арен, а 3я не доступна. Не знаю почему.

4. Прокачка оружия почти не ощущается. Очков прокачки много, много куда можно вложиться. А смысла в этом немного, опять же потому что оружие бессмысленно. Условно, в какую-то ненужную пушку можно вбухать 20-30 очков, но прогрессии не ощущается. Даже если бы пушки были полезные, то мне кажется нужно уменьшить количество шагов прокачки, но сделать их существеннее, вместо 20 шагов с увеличением урона на 1%, сделать 4 шага с увеличением на 5%. Как-то так.

Итого, оценки:
- Геймплей 3/5
- Визуал 4/5
- Звук и музыка 3/4
- Сюжет 2/5

Итого: 3/5. Рекомендовать не буду, можно использовать как референсы к анимациям

P.S. В титрах стоят заглушки. Много заглушек!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥1
А вы бы какую оценку поставили Ratchet & Clank: Rift Apart?
Anonymous Poll
40%
1️⃣
7%
2️⃣
18%
3️⃣
22%
4️⃣
13%
5️⃣
GMTK Game Jame 2025 скоро наклевывается (буквально завтра), а у меня огромное желание поучаствовать, а времени нэ ма :(

Кто-то будет участвовать? Готовы?

P.S. Есть небольшая вероятность, что получится поучаствовать в Brackeys Game Jam 2025.2😈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9