Как заводить ассеты (арт, аудио, анимации) в проект. Сверено с репозиторием 30.07.2026 — прошлая версия описывала намерения мая: советовала Point там, где у нас Bilinear, snake_case там, где прижился PascalCase, и настройки Unity Audio, которых нет, потому что звук ушёл в FMOD.


1. Git LFS — не настроен, и это уже стоило истории

Факт на 30.07.2026: LFS в репозитории не заведён. .gitattributes держит только Linguist-оверрайды и правило -diff -merge для TMP-SDF-атласов; git lfs track пуст. При этом в репозитории уже 7431 .png, а .git весит 645 МБ.

И заводить его не нужно — это замерено 30.07.2026, числа и разбор в записи Journal - LFS Does Not Pay Here. Коротко: половина веса .git — статичные нативные библиотеки (.a, .dll, .so) и YAML-ассеты, а им LFS не помогает (статичный бинарник и так лежит в истории однократно, текст в LFS гнать нельзя). При этом lfs: true в CI качал бы объекты на каждый из ~69 прогонов в месяц и выжег бы бесплатную квоту трафика примерно в пятнадцать раз. Флаг из ci.yml снят.

Если однажды вернёмся к вопросу — варианты и их цена:

ВариантЧто даётЧем платим
LFS только для новых файловистория перестаёт пухнуть дальшепрошлые 645 МБ остаются в каждом клоне
Переписать историю (git filter-repo)репозиторий худеет по-настоящемувсе клоны и форки несовместимы, ветки перевыпускать
Оставить как есть (текущий выбор)ноль работы и ноль трафикаклон долгий

Два условия на тот случай: не частично и не молча (когда часть файлов в LFS, а часть нет, git lfs status перестаёт что-либо значить) и только вместе с кэшем Actions, иначе квота сгорит в первый день.

Паттерны, если дойдёт до дела (и никогда не гонять через LFS .meta, .asset, .prefab, .unity: это YAML, ему нужен нормальный diff и merge):

*.png filter=lfs diff=lfs merge=lfs -text
*.aseprite filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.bank filter=lfs diff=lfs merge=lfs -text

2. Куда класть

Assets/_Project/
├── Art/Sprites/     ← спрайты: юниты, части тела (Bone Animations), иконки, окружение
├── Art/Animations/  ← .anim и контроллеры
├── Audio/           ← служебное; сэмплы живут НЕ здесь (см. §4)
├── UI/              ← UXML/USS, шрифты, UI-спрайты
├── Prefabs/ · ScriptableObjects/ · Scenes/ · Tests/

Всё наше — только под Assets/_Project/. Остальное в Assets/ — вендор (Plugins, Shapes, Settings, TextMesh Pro), туда не пишем.

3. Импорт спрайтов: Bilinear и мипы ВЫКЛЮЧЕНЫ

Проектный стандарт, а не вкусовщина: 2298 наших спрайтов на Bilinear против 143 на Point (вендорные паки, которые не вращаются).

ПараметрЗначениеПочему
Filter ModeBilinearстиль — «стилизованный пиксель-арт», нецелый скейл разрешён, а части тела вращаются: на Point кромка рвётся ступенями
Generate Mip MapsOff, обязательномипы съедают контур — на удалении силуэт расплывается; это ловили на живом риге
Pixels Per Unitпо пайплайну: у экспортов частей тела 1000 (экспорт ×10 под вращение)запас разрешения под поворот; PPU согласован с масштабом рига, «просто 100» ломает размеры
CompressionNone для UI и иконокартефакты видны на мелком
Sprite ModeMultiple для листов, Single для частей

Point оставляем там, где спрайт статичен и рисуется 1:1 — вендорные паки-плейсхолдеры.

Провенанс решения — memory pixel-rotation-supersampling и visual-style-stylized-not-pixelperfect; размерная сетка (тиры 64/96/128) — unit-sprite-size-grid.

4. Звук: в Assets/ его нет

AudioClip’ов в проекте ноль. Звук идёт через FMOD: сэмплы и микс живут в FMOD Studio-проекте (FMOD Project/), в Unity приезжают банкиAssets/StreamingAssets/Master.bank и Master.strings.bank. Поэтому import-настроек Unity Audio (Load Type, Vorbis, Force To Mono) у нас нет вовсе — они относятся к пути, которым мы не идём.

Заводка звука — не «положить файл в Assets/», а пайплайн scripts/audio (карта звука → нормализация → сборка банков) плюс ключи {contentId}.{action} в AudioCatalog. Контур целиком — скилл xgaida-x-nixi-audio; реестр «что звучит» — Audio Inventory (генерируется скриптом, руками не правится).

5. Анимации

Спрайтовые клипы и контроллеры — в Art/Animations/. Скелетная анимация собирается из частей тела (Art/Sprites/Bone Animations/) через риг из трансформов, клипы авторятся риг-API — контур в скилле xgaida-x-nixi-animation. Тяжёлые 3D/FBX-риги не тащим: проект 2D.

6. Имена: PascalCase у файлов, domain.name у id

Прижилось не то, что обещал прошлый док. По факту:

  • Файлы ассетов — PascalCase, пробелы и уточнение в скобках допустимы: Antimage.asset, Arcanist.asset, Arm (Down).png, Body.png. Имя ассета совпадает с именем типа/сущности, поэтому читается рядом с кодом.
  • Строковый id контента — отдельная сущность, domain.name в нижнем регистре: relic.base, enemy.training_dummy. Он живёт внутри SO и в сейвах, и не обязан повторять имя файла.
  • Кириллицы в путях Assets/ нет и не должно быть (в вики — можно).

Правило snake_case из прошлой версии не соблюдалось ни разу за два месяца — оно снято, а не «не выполнено».

7. Ассет — это данные, на которые ссылается SO

  • Спрайт и звук не прописываются путём в коде: ссылка или id лежит в SO-определении.
  • Сейвы хранят строковые id, а не ссылки на ассеты — визуал можно менять, не ломая сейвы.
  • Локализация уже подключена (com.unity.localization): текст в SO — только ключи, EN + RU, сразу. Правка таблиц — исключительно через Editor API (ручная правка YAML теряется и рвёт таблицу).
  • Addressables прямой загрузки по адресу у нас нет — пакет живёт только как основа Localization. Resources/ не использовать.

8. Коммит

  • Ассет = два файла: сам файл и .meta. Всегда вместе — потеря .meta рвёт GUID-ссылки во всех префабах и SO.
  • Папочные .meta Unity кладёт на уровень выше новой папки (Navigation.meta рядом с Navigation/) — добавлять отдельно, иначе папка приедет без своего мета-файла.
  • Стейджить перечислением файлов, не каталогом: ветка общая с параллельными сессиями.

Чек-лист перед партией ассетов

  • Filter Mode Bilinear, мипы off, PPU согласован с пайплайном
  • Файлы в нужной подпапке Assets/_Project/, имена PascalCase
  • Под контент заведено SO с id domain.name; текст — ключи локализации
  • Ассет и .meta уходят в коммит вместе (папочные .meta — не забыть)
  • Звук не кладётся в Assets/ — идёт через FMOD-пайплайн