Структура проекта на Unity
Довольно часто новые проекты начинаются как “proof of concept” для оценки геймплея и вообще жизнеспособности проекта. Берутся ассеты с assetstore как для кода, так и для контента, новые ресурсы в виде сцен, префабов, картинок и звуков создаются врассыпную, без четкой структуры. Но когда проект переходит в более зрелую стадию - это уже неуправляемая помойка с кучей неизвестных зависимостей и никто не знает, что можно удалять, а что нет. Знакомая ситуация?
Если вы не хотите страдать позже, то должны заботиться о порядке в проекте все время - с начала разработки и до конца. Все члены команды разработки должны придерживаться одних и тех же правил без исключения. Я обычно предлагаю следующую иерархию:
- Assets // Корневая папка
Unity
-проекта, все ассеты проекта должны быть внутри нее.- Client - Все ассеты, специфичные для данного проекта.
- Animations
- Controllers - Графы AnimationController, маски для аниматора.
- Sources - Исходные анимации в формате FBX / DAE.
- Fonts - Шрифты.
- Images - 2D-изображения, которые не относятся к 3D моделям.
- AppIcon - Иконки приложения для всех платформ.
- Ui - Изображения, связанные с игровым UI.
- Atlases - Атласы UI.
- Sources - Исходные изображения для сборки атласов. Каждый атлас - отдельная папка с тем же именем, что и атлас.
- Models - 3D-контент, внутренняя иерархия зависит от проекта.
- Prefabs - Префабы, внутренняя иерархия зависит от проекта.
- Resources - Ресурсы для динамической загрузки, внутренняя иерархия зависит от проекта. Хранить как можно меньше данных!
- Scenes - Сцены, внутренняя иерархия зависит от проекта.
- Scripts - Скрипты, внутренняя иерархия зависит от проекта.
- Shaders - Шейдеры, внутренняя иерархия зависит от проекта.
- Sounds - Звуки, внутренняя иерархия зависит от проекта. Музыка обычно стримится из Resources/Music/.
- StreamingAssets - Ассеты для стриминга, опционально.
- Animations
- Leopotam.Ecs - Сторонний ассет. Каждый сторонний ассет должен быть в отдельной папке.
- Leopotam.Ecs.UnityIntegration - Еще один сторонний ассет.
- Plugins - Платформо-зависимые ассеты.
Unity
корректно поддерживает папки Android / iOS только из корневой папки. - StandardAssets - Еще один сторонний ассет.
- …
- Client - Все ассеты, специфичные для данного проекта.
Из примера видно, что все данные проекта лежат внутри отдельной папки “Client” - это позволяет хранить сторонние ассеты, импортируемые с assetstore, отдельно от своих данных и легко обновлять их на новые версии или удалять без проблем с основным проектом.
Почему папка названа “Client”? Название может быть любым, я использую “Client” для унификации (оно короткое, ну и я ленив для придумывания оригинальных имен). Использование одинакового имени и общей иерархии по всем проектам позволяет переиспользовать не только визуальные ассеты, но и код в других проектах практически без изменений (пространство имен будет совпадать).
Почему Хранить как можно меньше данных! внутри папки “Resources”? Папка с именем “Resources” (причем любой вложенности) будет автоматически распознана Unity
как специальная папка и весь контент из нее, включая зависимости, будет упакован в конечный билд приложения, даже если этот контент никогда не будет использоваться.
Если нужно что-то проверить по-быстрому - лучше создать папку “_TEMP” в корневой папке “Assets”. Не забываем - это только для временных быстрых тестов, папка должна быть удалена после этого!
Если структура проекта будет содержаться в строгости и чистоте с самого начала - это сохранит кучу времени и нервов, когда наступит время чистки проекта от мусора перед релизом.