Kozlov Dev - Разработка игр
3.35K subscribers
518 photos
160 videos
3 files
230 links
Канал о разработке игр.
Download Telegram
🧤 Всем привет! Выходим с новогодних праздников с новым девлогом по Blockworld!

👍 Полностью закончил перенос системы блоков на новый компонентный подход. Остались ещё мелкие детали, но сама система уже готова.

Шейдеры
Доработал шейдеры блоков и предметов — а именно часть с боковым освещением. Теперь оно отлично накладывается как на рендер блоков (когда меш задаём в коде), так и на рендер моделей (готовый меш модели — унитаз, холодильник).

Доработал и добавил новые блоки:
✔️ Холодильник — добавил к нему компонент хранилища, теперь он умеет хранить предметы. В будущем планирую добавить фильтр, чтобы в нём можно было хранить только еду. Думаю, это прикольная механика — добавляет правдоподобности 🙂

✔️ Слой снега — блок с компонентом слоя. Теперь слои умеют стакаться, количество слоёв можно настраивать в компоненте (сейчас по умолчанию — 8). Планирую использовать это при генерации заснеженных биомов — будет добавлять разнообразия в мир.

✔️ Рельсы — автоподстраиваемый блок. В скором времени планирую добавить вагонетки, чтобы игроки могли строить американские горки)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥145👍1
😎 Стартуем первый в этом году эвент SCREENSHOT SATURDAY!

❗️ Переходите в наш Game Dev чатик 🔜 ссылка, делитесь своими скриншотами, рисунками, прикрепляйте ссылки на каналы и показывайте прогресс в геймдеве за неделю

P.S Эвент длится оба выходных

#скриншотник
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥91👏1🙏1🌭1
🔥 Всем привет! Сегодня расскажу, почему я использую JSON-конфиги.

🤔 Некоторые подписчики спрашивали, почему для конфигурации я выбрал JSON, ведь в Unity есть ScriptableObject (SO)? Так как в SO можно описывать структуру и удобно заполнять данные прямо в редакторе и в зачастую именно SO и берут в роли конфигов.

🧐 Главная причина выбора JSON в том, что я хочу максимально отвязать проект от движка. JSON это универсальный формат, который используется практически везде. А вот SO это уже часть Unity, и работать с ним вне движка полноценно нельзя.

Какие задачи решает JSON в проекте

1) Удобная работа с ИИ-агентом для генерации контента
Моя не самая любимая часть разработки это создание новых конфигов для контента 😏. Чтобы добавить новый блок, приходится заводить конфиг блока, предмета, добавлять ключи переводов и так далее.
⚡️ Чтобы ускорить процесс, я подключаю ИИ-агентов. Достаточно одного промпта, и ИИ может создать пачку новых конфигов за пару минут, экономия времени получается очень заметной. Специально для этого у меня есть небольшая документация: как устроены конфиги и как их правильно оформлять. И тут JSON подходит идеально: ИИ агент легко читает, правит и генерирует JSON без проблем 👍.

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

3) Моды
В будущем хочу развивать проект в сторону модов, чтобы любой человек мог добавить в игру что-то своё. JSON для этого отличный вариант: он читаемый и понятный человеку. Мод можно сделать даже без редактора, просто создавая и редактируя файлы с конфигурацией.

Что уже покрыто через JSON
На данный момент через JSON я настраиваю такие вещи:

✔️ Модели и риг: модели собираю в Blockbench и экспортирую в JSON
✔️ Блоки: поведение, рендеринг и прочие настройки
✔️ Предметы: функционал, рендеринг и параметры
✔️ Биомы: рельеф, окружение (цвет неба, звуки и т.д.)
✔️ Структуры: правила спавна, варианты, настройки генерации
✔️ Мобы: правила спавна, уникальные параметры и поведение

Это уже мощный фундамент: на нём можно быстро расширять игру контентом, постепенно подключать паки, а дальше без боли перейти к полноценной поддержке модов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥11🥰3
🔥 Структуры и проблема с поворотом

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

✔️ Чтобы структуры выглядели разнообразнее, нужно уметь размещать их в разных направлениях.
Сам поворот реализовать несложно: мы просто переставляем данные массива местами в зависимости от направления и готово.

😭 Но если в структуре используются блоки, у которых есть состояние направления (ступеньки, лестницы, сундуки, кровати и т. д.), то они начинают ломаться, потому что при повороте мы не меняем их мета данные.

🙂 Раньше мета блока у меня хранилось в 1 байте (для оптимизации): я делил его на биты и упаковывал туда всё, что нужно. Например для блока двери в первом бите хранил открыта или закрыта дверь, далее два бита были на поворот от 0 до 3, следующий бит был на то какая часть двери верх или низ и т.д. Но из-за этого было сложно работать с метой блока из вне, чтобы ее подредактировать на тех же поворотах

😍 После большого рефакторинга я избавился от «байтовой меты» и перенёс систему на отдельные состояния. Теперь можно легко добавлять новые состояния блока и получать к ним доступ по ключу.

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

P.S Прикрепил скрины бага структур, а так же примеры конфигурации состояний блока в компонентах двери и ступеньки 📌
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥206👍6🤯1
😎 Стартуем эвент SCREENSHOT SATURDAY!

❗️ Переходите в наш Game Dev чатик 🔜 ссылка, делитесь своими скриншотами, рисунками, прикрепляйте ссылки на каналы и показывайте прогресс в геймдеве за неделю

P.S Эвент длится оба выходных

#скриншотник
Please open Telegram to view this post
VIEW IN TELEGRAM
66🔥5🥰4
😍 Прощай, мир — встречай, вселенная!

Всем привет! Сегодня хочу рассказать о переходе на новую структуру игры.

Старые миры
В первой части игры структура была довольно простой и строилась вокруг сущности мира. Игрок мог создать мир и играть в нём. При этом не существовало никаких измерений — вроде ада, небесных островов и т.д.

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

Новые вселенные
Новый подход строится уже на двух сущностях:
— сущность вселенной
— сущность места (place)

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

✔️ Вселенная содержит в себе набор всех мест, которые в ней существуют, и хранит общие данные, доступные для переноса между ними (данные игрока: инвентарь, статы и т.д).
✔️ Само место — это переработанная сущность мира. Место может ссылаться на другие места, благодаря чему можно настраивать полноценный граф переходов между ними. У каждого места есть своя конфигурация — можно настроить биомы, мобов, структуры и многое другое. За счёт этого каждое место будет выглядеть уникально и не похоже на остальные.

Что это даёт
✔️ Такой подход даёт очень мощную и гибкую систему для создания разнообразных локаций в игре. Например, можно создать места-планеты: Земля, Луна, Марс и т.д.

✔️ Для каждой планеты можно добавить собственные измерения: внешний мир, ад, небесный сад и другие. Игрок сможет перемещаться между всеми этими местами с помощью порталов.

В будущем можно прикрутить систему разблокировки места, чтобы в него попасть нужно выполнить какой то квест или скрафтить какой то ключ

😅 Пока система находится на этапе рефакторинга: многое приходится переписывать и дорабатывать. Но как только я её завершу, обязательно покажу результат в отдельном посте 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥202🥰2
😎 Стартуем эвент SCREENSHOT SATURDAY!

❗️ Переходите в наш Game Dev чатик 🔜 ссылка, делитесь своими скриншотами, рисунками, прикрепляйте ссылки на каналы и показывайте прогресс в геймдеве за неделю

P.S Эвент длится оба выходных

#скриншотник
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥83🥰1
👋 Всем привет.

🧑‍💻 На данный момент идет рефакторинг кода под новую систему вселенной и плейсов, особо показать нечего, надеюсь на следующей недели ее закончить.

😍 Так же параллельно работаем над интерфейсом, на данный момент прорабатываем цветовую палитру (на иконки внимания не обращать, они для теста). Пробывали 2 варианта: темная и светлая версия. Пока что больше склоняюсь к темной версии, поэтому за основу берем ее.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🥰64
😎 Стартуем эвент SCREENSHOT SATURDAY!

❗️ Переходите в наш Game Dev чатик 🔜 ссылка, делитесь своими скриншотами, рисунками, прикрепляйте ссылки на каналы и показывайте прогресс в геймдеве за неделю

P.S Эвент длится оба выходных

#скриншотник
Please open Telegram to view this post
VIEW IN TELEGRAM
6🥰7🔥2
🔥 Мультиплеер!

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

👍 Решил делать всё сразу, так как архитектура игры поменялась на систему вселенных, из-за чего приходится переписывать большую часть кода. Поэтому проще на этом этапе внедрить работу с сетью, чем переписывать код ещё раз в будущем.

Сетевые решения
Для мультиплеера выбрал PurrNet — у него есть всё, что мне нужно. Среди других решений (FishNet, Mirror, Netcode) у него лучшая производительность.
Из минусов — пока очень мало документации, но спасает то, что я уже работал с FishNet и база у меня есть, так что разобраться несложно.

Также интегрировал VContainer в PurrNet, чтобы при создании сетевых объектов в них автоматически внедрялись зависимости.

Режимы работы
Планирую сделать 3 режима:

✔️ Локальный (по сути режим хоста с local transport) — для одиночной игры

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

✔️ Онлайн с выделенным сервером — игрок подключается к заранее созданному серверу разработчика и может играть с любыми другими игроками

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

✔️ Клиент + сервер — для запуска хост- и клиентского режимов

✔️ Сервер — для режима выделенного сервера

Для этого я сделал 2 входные сцены: Client Bootstrap и Server Bootstrap, а также кастомный инструмент сборки.

В первом варианте собирается билд клиента (WebGL, Android и т.д.) со стартовой сценой Client Bootstrap,
во втором — билд для Dedicated Linux Server со стартовой сценой Server Bootstrap.

⚡️ Это даёт полный контроль над флоу: что нужно загружать, а что нет. Например, на выделенном сервере не нужны клиентские зависимости (меню, аналитика, SDK площадок и т.д.).
При старте выделенного сервера сразу создаётся нужная вселенная, после чего запускается сцена с ней — и далее клиенты могут к ней подключаться.

P.S.
💭 Пишите в комментариях, интересна ли вам тема мультиплеера и стоит ли подробнее рассказывать про архитектуру и подходы, которые я использую при разработке
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥374🥰2👍1
😎 Стартуем эвент SCREENSHOT SATURDAY!

❗️ Переходите в наш Game Dev чатик 🔜 ссылка, делитесь своими скриншотами, рисунками, прикрепляйте ссылки на каналы и показывайте прогресс в геймдеве за неделю

P.S Эвент длится оба выходных

#скриншотник
Please open Telegram to view this post
VIEW IN TELEGRAM
66👍3🔥3
🧑‍💻 Продолжаю работать над архитектурой мультиплеера!

Всем привет! Сегодня расскажу про систему мультисцен и разделение игрока на два уровня.

Система Universe и Place на мультисценах
Для реализации вселенных использовал мультисцены Unity. При старте сервера запускается главная сцена Universe — это общее пространство вселенной. Когда игрок хочет зайти в конкретный Place — подгружается дополнительная сцена.

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

Два уровня игрока
Разделил сущность игрока на два уровня.

✔️ PlayerUniverse — сущность игрока на уровне вселенной. Хранит общую информацию: ник, статус, текущий плейс. Благодаря этому можно видеть, в каких плейсах сейчас играют другие игроки, и при необходимости телепортироваться к ним.

✔️ PlayerPlace — сущность игрока внутри конкретного Place. Здесь уже вся игровая информация: позиция, инвентарь, взаимодействие с блоками. Создаётся при входе в плейс, уничтожается при выходе.

Спавн, синхронизация чанков и игроков
🌐 Игроки теперь полноценно спавнятся при подключении к серверу. При этом спавн не происходит мгновенно — сервер сначала дожидается, пока чанки вокруг точки спавна будут сгенерированы и готовы. Это исключает ситуации, когда игрок проваливается сквозь мир или появляется в пустоте.

✔️ Сервер сам решает, какие чанки нужны каждому игроку, на основе его позиции и радиуса видимости. Отправляются только дельты — что добавилось, что изменилось, что вышло из зоны. Данные чанков сжимаются перед отправкой, а для хоста стриминг вообще пропускается, так как данные уже и так есть локально. Чанки отправляются порциями, чтобы не забивать канал. Приоритет отдаётся ближайшим к игроку чанкам.

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

📌 Прикрепил скрины организации сцен, можете посмотреть как выстроена архитектура)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍4🥰1