Войти
UnityФорумОбщее

Архитектура игры

#0
(Правка: 8 фев 2023, 1:11) 12:42, 7 фев 2023

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

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

Есть, например, такой вариант - одна пустая сцена, каждый экран отдельный префаб. Соответственно, добавляем/убираем эти префабы со сцены. Или одна сцена для меню, отдельная сцена для игры. Или все в отдельные сцены.

Есть какая-то устоявшаяся практика для работы с этим всем?

Если кто-то использовал ECS, то ECS накладывает какие-то ограничения на архитектуру игры или наоборот?

#1
13:59, 7 фев 2023

главное не говори о Бойцовском клубе тфу о сценах

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

Тут все ситуативно.

#2
20:48, 7 фев 2023

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

Я люблю такую схему:
Запускаемся с технической сцены, которая инициализирует всякие внешние и внутренние сервисы, рожает всякие [DontDestroyOnLoad] менеджеры и тд. (Starter)
сразу переходим в сцену с основной игровой логикой, интерфейсом и т.д., типа Main
а сцены с контентом по необходимости загружаем аддитивно:
https://docs.unity3d.com/ScriptReference/SceneManagement.LoadScen… Additive.html

#3
0:49, 8 фев 2023

meekobold
> Запускаемся с технической сцены, которая инициализирует всякие внешние и
> внутренние сервисы, рожает всякие [DontDestroyOnLoad] менеджеры и тд. (Starter)
> сразу переходим в сцену с основной игровой логикой, интерфейсом и т.д., типа
> Main
> а сцены с контентом по необходимости загружаем аддитивно:
>

А имеет смысл весь контент запихнуть в ассетбандлы и использовать их вместо аддитивной подгрузки сцен?

#4
12:07, 8 фев 2023

KolyaL
Бандлы и сцены решают разные задачи, если там сам напишешь механизм заменяющий тебе сцены, то можно как бы

Бандлы - это чисто про организацию хранения ресурсов.

Сцены - это готовый механизм, чтобы ты в редакторе заранее сконфигурировал набор игровых объектов так, как тебе надо и со всякими удобствами, а потом в рантайме одним вызовом их всех родил.
Бонусом к этому в юнити сцена является точкой входа на графе зависимостей. Когда ты говоришь "грузим сцену <имясцены>, движок сам вычисляет все ресурсы, которые понадобятся и загружает их. Менеджмент ресурсов вообще в Юнити сделан очень непрозрачно, но зато это снижает порог входа - меньше нужно понимать, чтобы им успешно пользоваться.

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

#5
21:27, 8 фев 2023

Лучший способ- чтобы самому было понятно и просто делать и переделывать потом игру. Для этого нужно сразу определится с именованиями сущностей, и разделить игру на правильные блоки. Понятие сцены- однозначно должно быть. Одна и та же сцена всегда остается, только загружаются/выгружаются нужные объекты, уровни и т.п.

#6
12:38, 9 фев 2023

Выводы на данный момент такие:

1. Лучший способ - ходить по граблям и методом научного тыка, постоянно все переделывая, придти к согласию с самим собой и кодом
2. Первые 8 проектов надо делать на сценах, а потом 9й сам собой сделается на одной сцене (и точке) и с мега менеджерами ресурсов и тд
3. Главное архитекторное решение - менеджер префабов.

#7
17:08, 10 фев 2023

KolyaL
Ну примерно так.
Я лично делаю менеджер сцены в который кидаю все что есть на сцене. Таким образом он рут объект и к нему есть лёгкий доступ у каждого ребенка. Он же управляет всеми глобальными событиями, в нем же динамические списки динамических объектов, так что у меня нет проблем с поиском нужных объектов.
Несколько сцен использую для дизайна уровня, если это прям глобальная карта. Скажем на одной сцене террейн, на другой промышленные постройки, на третьей гражданские, на четвертой дороги, на пятой сами игровые объекты. Нет ни каких проблем все это объединить, а потом опять разбить.
Либо рассматривать сцены как подуровни, со своей логикой.
Собственно для этого юниты и сделали возможность подгружать другие сцены.

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

#8
8:38, 12 фев 2023

Меню отдельно, игра отдельно. Если в игре есть уровни, то естественно каждый уровень это сцена.
Вариант со Starter от meekobold мне очень понравился (дебажить проще будет).
ECS помойка, применима только для онлайн игр.

UnityФорумОбщее