Структура проекта на 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 - Ассеты для стриминга, опционально.
    • Leopotam.Ecs - Сторонний ассет. Каждый сторонний ассет должен быть в отдельной папке.
    • Leopotam.Ecs.UnityIntegration - Еще один сторонний ассет.
    • Plugins - Платформо-зависимые ассеты. Unity корректно поддерживает папки Android / iOS только из корневой папки.
    • StandardAssets - Еще один сторонний ассет.

Из примера видно, что все данные проекта лежат внутри отдельной папки “Client” - это позволяет хранить сторонние ассеты, импортируемые с assetstore, отдельно от своих данных и легко обновлять их на новые версии или удалять без проблем с основным проектом.

Почему папка названа “Client”? Название может быть любым, я использую “Client” для унификации (оно короткое, ну и я ленив для придумывания оригинальных имен). Использование одинакового имени и общей иерархии по всем проектам позволяет переиспользовать не только визуальные ассеты, но и код в других проектах практически без изменений (пространство имен будет совпадать).

Почему Хранить как можно меньше данных! внутри папки “Resources”? Папка с именем “Resources” (причем любой вложенности) будет автоматически распознана Unity как специальная папка и весь контент из нее, включая зависимости, будет упакован в конечный билд приложения, даже если этот контент никогда не будет использоваться.

Если нужно что-то проверить по-быстрому - лучше создать папку “_TEMP” в корневой папке “Assets”. Не забываем - это только для временных быстрых тестов, папка должна быть удалена после этого!

Если структура проекта будет содержаться в строгости и чистоте с самого начала - это сохранит кучу времени и нервов, когда наступит время чистки проекта от мусора перед релизом.

Оформить подписку можно здесь: