Статус: Ready · личная памятка Макса


Как правильно заводить ассеты (арт, аудио, анимации) в проект до того, как начнётся плотная разработка контента. Цель — чтобы не пришлось переразбирать импорт-настройки и историю git на сотне файлов потом. Связано: 0.3. Подготовка проекта (Unity), 5. Технологический стек и архитектура, 1. Сборки (Assembly Definitions).


TL;DR — порядок действий

  1. Сначала настроить Git LFS (пока НЕ настроен — см. Шаг 0). Без этого первый же спрайт-атлас раздует историю.
  2. Класть файлы строго в Assets/_Project/... по карте папок (Шаг 2).
  3. Выставить единые import-настройки для каждого типа (Шаги 3–5) — лучше через Presets, чтобы не кликать руками каждый раз.
  4. Соблюдать неймин (Шаг 6).
  5. Контент ссылается на ассеты через SO по строковым ID, а не хардкодом (Шаг 7).
  6. Коммитить ассет вместе с его .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 TypeSprite (2D and UI)
Sprite ModeSingle / Multiple (атлас)Multiple для спрайт-листов
Pixels Per Unitзафиксировать одно значение (напр. 100, или под пиксель-арт — равно высоте тайла)иначе масштабы юнитов поедут
Filter ModePoint (no filter) для пиксель-арта · Bilinear для гладкогопиксель-арт мылится на Bilinear
CompressionNone для UI/иконок · норм для крупных текстурартефакты на иконках
Generate Mip MapsOff для 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 TypeCompression
Короткие SFXDecompress On LoadVorbis (или PCM для совсем коротких)
Музыка (длинные треки)StreamingVorbis, качество ~70%
Часто повторяемые мелкие SFXCompressed In MemoryADPCM
  • Исходники музыки из 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 уходят в коммит вместе