Kozlov Dev - Разработка игр
3.35K subscribers
518 photos
160 videos
3 files
230 links
Канал о разработке игр.
Download Telegram
🔥 Всем привет! Сегодня расскажу, почему я использую 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
😎 Стартуем эвент SCREENSHOT SATURDAY!

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

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

🙂 Всех с праздником 14 февраля!

#скриншотник
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
🔥 Продолжаю работу над мультиплеером!

Всем привет! В прошлом посте рассказывал про архитектуру Universe/Place и стриминг чанков. С тех пор добавил много нового функционала и теперь уже можно вместе с кем то побегать по миру

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

👀 Камера и вид отображения игроков
Разделил режимы камеры: для своего персонажа мы можем переключать вид от первого или третьего лица, но чужие игроки всегда будут отображаться в третьем лице. Сделать это было не так сложно, так как у меня уже была заложена система переключения вида для игрока

✔️ Синхронизация анимаций
Так как система анимаций у меня кастомная (без юнити аниматора), то было несколько вариантов как реализовать синхронизацию. Пока что остановился на параметрах сущности (Velocity, IsCrouch и т.д). Аниматор просто подвязывается к ним и работает как обычно, вызывая нужные стейты в зависимости от параметров. Возможно в будущем оптимизирую за счет синхронизации самих стейтов анимации, а не параметров, но пока что сойдет и такой вариант.

✔️ Физика на уровне Place
Вынес работу с физикой (различные касты) из глобальной обработки в Place. Каждый плейс теперь работает со своей физической сценой Unity — физика одного места не влияет на другое. Без этого физика в мультисценах нормально работать не будут, так что штука важная.

😏 В целом мультиплеер уже работает — можно зайти на сервер, увидеть других игроков и побегать вместе. Дальше на очереди синхронизация взаимодействия с блоками и инвентарем, после чего можно уже попробовать запустить тест с выделенным серваком.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥133👍2