Статус: Ready · личная памятка Макса
Как правильно заводить ассеты (арт, аудио, анимации) в проект до того, как начнётся плотная разработка контента. Цель — чтобы не пришлось переразбирать импорт-настройки и историю git на сотне файлов потом. Связано: 0.3. Подготовка проекта (Unity), 5. Технологический стек и архитектура, 1. Сборки (Assembly Definitions).
TL;DR — порядок действий
- Сначала настроить Git LFS (пока НЕ настроен — см. Шаг 0). Без этого первый же спрайт-атлас раздует историю.
- Класть файлы строго в
Assets/_Project/...по карте папок (Шаг 2). - Выставить единые import-настройки для каждого типа (Шаги 3–5) — лучше через Presets, чтобы не кликать руками каждый раз.
- Соблюдать неймин (Шаг 6).
- Контент ссылается на ассеты через SO по строковым ID, а не хардкодом (Шаг 7).
- Коммитить ассет вместе с его
.meta(Шаг 8).
Шаг 0 — Git LFS (СДЕЛАТЬ ПЕРВЫМ ДЕЛОМ)
Сейчас в репозитории LFS не настроен (.gitattributes содержит только Linguist-оверрайды). Бинарные ассеты (спрайты, аудио, видео) в обычном git хранятся целиком в каждой ревизии → история пухнет необратимо. Завести LFS нужно до первого коммита арта, иначе чистить придётся через git filter-repo.
git lfs installДобавить в .gitattributes (в корне репо):
# === Git LFS — бинарные ассеты ===
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.aseprite filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.anim filter=lfs diff=lfs merge=lfs -text
⚠️
.meta,.asset,.prefab,.unityчерез LFS НЕ гонять — это текст (YAML), нужен нормальный diff/merge.
После правки .gitattributes:
git add .gitattributes
git commit -m "chore: configure Git LFS for binary assets"
git lfs track # проверить, что паттерны подхватилисьGitHub Free даёт 1 ГБ LFS-хранилища и 1 ГБ трафика/мес. Для вертикального среза хватит; следить, не лить сырые
.psd-исходники в репо без нужды.
Шаг 1 — Откуда берутся ассеты
| Источник | Что | Лицензия — проверить |
|---|---|---|
| Заказной арт (фриланс) | спрайты юнитов, реликвии, UI | право на коммерческое использование, передача исходников .psd/.aseprite |
| Suno (платный тир) | музыка | коммерческая лицензия активна; раскрыть AI-контент в анкете Steam |
| Asset Store / itch | временные плейсхолдеры, SFX-паки | лицензия на релиз; помечать как placeholder_ |
Правило: исходники (
.psd,.aseprite, исходные стемы музыки) хранить отдельно (внеAssets/, напр. вArt_Source/вне репо или в облаке). ВAssets/— только то, что реально импортит Unity.
Шаг 2 — Куда класть (карта папок уже создана)
Assets/_Project/
├── Art/
│ ├── Sprites/ ← спрайты юнитов, иконки, фоны
│ └── Animations/ ← .anim, контроллеры
├── Audio/ ← музыка, SFX
├── UI/ ← UXML/USS, UI-спрайты, шрифты
├── Prefabs/
├── ScriptableObjects/ ← SO-определения контента (см. Шаг 7)
└── Scenes/
Правила:
- Всё кастомное — только в
Assets/_Project/. КореньAssets/(Settings, URP, InputSystem) не трогать. - Внутри
Sprites/разбивать подпапками по смыслу:Units/,Relics/,Icons/,Environment/. - Не плодить ассеты в
Tests/и рядом со скриптами — арт и код разнесены.
Шаг 3 — Import-настройки спрайтов (2D / URP 2D)
Проект на URP 2D (см. Assets/Settings/Renderer2D.asset). Базовый профиль для игрового спрайта:
| Параметр | Значение | Почему |
|---|---|---|
| Texture Type | Sprite (2D and UI) | — |
| Sprite Mode | Single / Multiple (атлас) | Multiple для спрайт-листов |
| Pixels Per Unit | зафиксировать одно значение (напр. 100, или под пиксель-арт — равно высоте тайла) | иначе масштабы юнитов поедут |
| Filter Mode | Point (no filter) для пиксель-арта · Bilinear для гладкого | пиксель-арт мылится на Bilinear |
| Compression | None для UI/иконок · норм для крупных текстур | артефакты на иконках |
| Generate Mip Maps | Off для 2D-спрайтов | мипы не нужны, едят память |
| Max Size | по факту, не задирать | — |
💡 Заведи Preset. ПКМ по импортированному спрайту с нужными настройками → сверху в инспекторе иконка ползунка →
Save to Preset. Дальше можно сделать его дефолтным для типа черезEdit → Project Settings → Preset Manager. Это снимает 90% ручной возни и держит настройки едиными.
Для пиксель-арта рассмотреть пакет 2D Pixel Perfect (камера) — но это уже решение по визуальному стилю, не блокер для заводки ассетов.
Шаг 4 — Import-настройки аудио
Сейчас в Фазе 1 — Unity Audio за интерфейсом IAudioService (FMOD позже, Фаза 3). Базово:
| Тип звука | Load Type | Compression |
|---|---|---|
| Короткие SFX | Decompress On Load | Vorbis (или PCM для совсем коротких) |
| Музыка (длинные треки) | Streaming | Vorbis, качество ~70% |
| Часто повторяемые мелкие SFX | Compressed In Memory | ADPCM |
- Исходники музыки из Suno качать в максимальном качестве (
.wav/высокий битрейт), в Unity ужимать импортом — не наоборот. - Force To Mono для UI-кликов и мелких SFX (экономит память, позиционирование им не нужно).
Шаг 5 — Анимации
- Спрайтовые анимации (
.anim) — вArt/Animations/. - Если арт приходит спрайт-листами — резать через Sprite Editor (
Sprite Mode: Multiple+ Slice). - Контроллеры аниматоров — рядом, именовать по сущности (
unit_warrior.controller). - Не тащить тяжёлые 3D/FBX-риги — проект 2D.
Шаг 6 — Неймин и организация
- Файлы:
snake_case, латиница, без пробелов и кириллицы.unit_warrior_idle,relic_flame_sword,icon_attack. - Префиксы по типу:
unit_,relic_,icon_,ui_,sfx_,bgm_,placeholder_. - ID контента в SO и в именах файлов держать согласованными — облегчит локализацию и сейвы (сейвы хранят строковые ID, см. 5. Технологический стек и архитектура).
- Никакой кириллицы в путях ассетов (вики — отдельная история, там можно; в
Assets/— нет).
Шаг 7 — Ассеты в контенте: через SO, не хардкодом
Ключевой принцип проекта: «данные в SO + поведение в коде», SO иммутабельны, контент адресуется строковыми ID.
- Спрайт/звук реликвии не прописывается в коде по пути — он лежит ссылкой (или строковым ID) в SO-определении.
- Сейвы хранят
"relic_flame_sword", а не ссылку на ассет → визуал можно менять, не ломая сейвы. - Локализацию закладывать сразу: в SO — строковые ключи текста, а не сам текст (пакет Unity Localization подключится на стадии 2–3).
- Addressables — позже (Фаза 2). Пока ссылки на ассеты прямые. Но именовать и раскладывать так, будто Addressables уже есть — миграция пройдёт безболезненно. Не завязываться на
Resources/(антипаттерн, мешает Addressables).
Иначе говоря: ассет — это данные, на которые ссылается SO. Не зашивай пути ассетов в
Combat-логику — она вообще не должна знать о спрайтах (разделение симуляции и презентации).
Шаг 8 — Коммит ассетов
- Каждый ассет = два файла: сам файл +
.meta. Коммитить всегда вместе. Потеря.metaрвёт ссылки (GUID) во всех префабах/SO. - Не коммитить
Library/,Temp/,obj/(закрыто.gitignore). - Бинарники едут через LFS (Шаг 0) — проверять
git lfs statusперед пушем, если завёл новый тип файла. - Сырые исходники (
.psd, стемы) — внеAssets/, в репо не тащить без явной нужды.
Чек-лист перед заводкой партии ассетов
- Git LFS настроен и
.gitattributesзакоммичен (Шаг 0) - Есть Preset импорта для типа (спрайт / аудио)
- PPU зафиксирован проектным стандартом
- Имена в
snake_caseс префиксом, латиница - Файлы в правильной подпапке
Assets/_Project/ - Под контент заведено SO-определение со строковым ID (не хардкод)
- Текстовые поля — ключи локализации, не сырой текст
- Ассет +
.metaуходят в коммит вместе