Приложение к Reference - Asset Inventory. Собрано разведкой 2026-07-20.

Наша папка Art

Инвентаризация Assets/_Project/Art/ — папки, которую делаем мы сами (в отличие от покупных/скачанных паков в Assets/Honeti, Assets/Kenney, Assets/Feel, Assets/Cainos).

Что внутри по объёму:

ПодпапкаФайлов (без .meta)На дискеВ git
Sprites244929 MBда, 5219 записей
Arena127879 KBда, 256
UI19145 KBда, 41
Shaders16108 KBда, 32
Materials424 KBда, 8
Animations0 (только .gitkeep)01

Главный дисбаланс виден сразу: 29 из 30 мегабайт папки — это пул скачанных спрайт-паков, из которого в игре реально задействовано 12 файлов. Всё, что мы нарисовали/написали руками, занимает меньше 1 MB.


Sprites

Верхнеуровневая карта. Детальный разбор боевой пригодности — в sprite-packs-audit и sprite-recommendations, здесь не дублируется.

Две корневые папки — Pixel Art Heroes (114 файлов) и New FREE Pixel Art Heroes (2334). Деление историческое: это два разных «залива» с itch, а не осмысленная классификация. Часть паков лежит в обеих (см. дубликаты ниже).

Pixel Art Heroes/

ПапкаФайловСтилевая семьяРазбор
EVil Wizard 29LuizMomo / Heroesразобрана
Fantasy Warrior10LuizMomo / Heroesразобрана — используется в игре
Huntress12LuizMomo / Heroesразобрана
Huntress 211LuizMomo / Heroesразобрана
Martial Hero 29LuizMomo / Heroesразобрана (дубликат)
Medieval Warrior Pack 212LuizMomo / Heroesразобрана — используется в игре
Medieval Warrior Pack 311LuizMomo / Heroesразобрана
Monster_Creatures_Fantasy(Version 1.3)8LuizMomo / мобыпомечена как неполный фрагмент (дубликат)
Monsters Creatures Fantasy 227LuizMomo / мобыразобрана (Bat/Mimic/Rat/Slime)
Nneshan4одиночныйисключена (статика)

New FREE Pixel Art Heroes/

ПапкаФайловСтилевая семьяРазбор
ArcherHero8graphic-novel одиночныйразобрана
AxeWarriors189Bandits / AxeWarriors (per-frame)разобрана (3 палитры одного архетипа)
Bandits83Bandits / AxeWarriorsразобрана
Characters 500+ (by batareya)526портретыисключена (статика). 8.8 MB — крупнейший кусок папки
Evil Wizard6LuizMomoразобрана
Evil Wizard 312LuizMomoразобрана
FREE_Kobold Warrior 2D Pixel Art8одиночный, cuteразобрана (дырки: нет Death/Hit)
Forest_Monsters_FREE14LuizMomo / мобыразобрана
Goblin Monsters 4 Colors45статичные силуэтыисключена (не анимации)
Goblin_Fighter2атлас-листразобрана
Goose8мемразобрана (пасхалка)
Hero Knight 29LuizMomoразобрана
HunterOrc12LuizMomoразобрана
Martial Hero10LuizMomoразобрана
Martial Hero 29LuizMomoразобрана (дубликат)
Martial Hero 311LuizMomoразобрана
Martial Hero 3(1)11LuizMomoчистый дубликат предыдущей
Monster_Creatures_Fantasy(Version 1.3)8LuizMomo / мобынеполный фрагмент (дубликат)
Ranger cat - spritesheets32одиночный, зверолюдразобрана (два масштаба одного дизайна)
SkeletonKnight10high-polish undeadразобрана
Slime_Pixel_Monsters_Vol_1_COLOR_OUTLINE759per-frame мобыразобрана. 5.7 MB, избыточная плотность кадров
Tiny RPG Pack 01 (Soldier&Orc)38Ansimuz / Tiny RPGразобрана
Tiny RPG Pack 02 (Demon_A&Blood Monster_A)32Ansimuz / Tiny RPGразобрана
Warrior-V1.3143LuizMomo, платформерный наборразобрана
Wizard Pack8LuizMomoразобрана
Wizardgooseassets14мемразобрана
imp_axe_demon101per-frame low-fantasyразобрана
pack_loreon_knight47per-frame low-fantasyразобрана
skeleton_sword53per-frame low-fantasyразобрана
swordman pack1атлас-листразобрана
vagabond77одиночныйисключена (нет боевого набора). 1.2 MB за один кадр jump/landing
viking_axe_pack48per-frame low-fantasyразобрана

Не разобранных папок нет — оба документа покрывают весь пул. Но покрытие «разобрана» означает «оценена на пригодность», а не «используется».

Что из пула реально живое

Из 2770 ассетов (по GUID) в игре задействовано 12 листов из 2 паков:

  • Pixel Art Heroes/Medieval Warrior Pack 2/Sprites/ — Idle, Run, Attack1–4, Take Hit, Death (7 листов). Идёт в Prefabs/UnitView.prefab и в клипы ScriptableObjects/Visuals/MedievalWarrior/*.anim.
  • Pixel Art Heroes/Fantasy Warrior/Sprites/ — Idle, Run, Attack1, Death (4 листа). Идёт в ScriptableObjects/Visuals/FantasyWarrior.asset + клипы.

Остальные ~2758 файлов не имеет ни одной ссылки. Это не мусор в смысле «удалить сегодня» — это референс-пул под будущий ростер, и оба research-документа именно им и оперируют. Но он лежит в git и весит 29 MB.

Отдельно к удалению без потерь:

  • Martial Hero 3(1) — побайтный дубликат Martial Hero 3.
  • второй экземпляр Monster_Creatures_Fantasy(Version 1.3) (лежит в обеих корневых папках, и обе версии — неполный фрагмент без Idle/Hit/Death).
  • второй экземпляр Martial Hero 2.
  • Characters 500+ (by batareya) (8.8 MB) и vagabond (1.2 MB) — по обоим разборам не боевые; 10 MB репозитория за материал, который в лучшем случае референс.

Ещё: аудит утверждает «спрайт-паки по git-конвенции пока не коммитятся». Это не такgit ls-files показывает 5219 записей под Art/Sprites. Либо конвенцию не применили, либо документ устарел. Стоит развести явно.

Если вектор действительно уходит в скелетную анимацию (Spine / Unity 2D Animation), весь этот пул превращается из «кандидатов в ростер» в «референс силуэтов», и держать его в репо становится тем более трудно оправдать.


Animations

Пусто. Только .gitkeep.

Не используется — точнее, папка-заглушка, которая никогда не наполнялась. При этом анимации в проекте есть, но лежат в другом месте: Assets/_Project/ScriptableObjects/Visuals/ (UnitBase.controller, FantasyWarrior/*.anim, MedievalWarrior/*.anim).

Это прямая структурная ошибка: .anim и .controller — это арт-ассеты, а не ScriptableObject’ы, и в ScriptableObjects/ им не место. Либо переносить их в Art/Animations/, либо удалять пустую папку и признавать, что визуальные клипы живут рядом с VisualData. Сейчас — худший вариант: заведена папка под цель, цель реализована мимо неё.


Materials

Четыре материала, все живые.

ФайлШейдерГде используетсяСтатус
MAT_SegmentedHealthBar.matGuildmaster/UI/SegmentedHealthBarPrefabs/UI/HealthBar.prefabживое
MAT_SegmentedManaBar.matтот же шейдер, без щитаPrefabs/UI/ManaBar.prefabживое
MAT_Sprite_HitFlash.matGuildmaster/Sprite/HitFlashPrefabs/UnitView.prefab (на Body-спрайте, _FlashAmount гонится через MPB из UnitView.cs)живое
TMP_NameLabel_Outline.matTMP SDFPrefabs/UI/NameLabel.prefab, Prefabs/UI/FloatingText.prefabживое

Замечание к структуре: ещё четыре материала лежат не здесь, а в Art/Shaders/ (MapBackdrop, MapFog, MapIcon, MapTable). Папка Materials при этом существует и ровно для этого предназначена. Развести.


Shaders

Восемь шейдеров + четыре .hlsl-инклуда + четыре материала (которым здесь не место, см. выше). Заголовочные комментарии написаны по делу — из них видно не только «что», но и «почему именно так».

Карта акта (свежий слой, ветка feat/act-map-overhaul)

ФайлЧто делаетСтатус
SH_Map_Backdrop.shader (68 стр.)Лист «старой бумаги» под узлами. Готовой текстуры пергамента нет, фактура собирается из одного grayscale-шума (Feel/MMTools/.../MMCloudsNoise.png), взятого дважды с разным тайлингом: крупно — волокно, мелко — зерно. Рваный край считается в шейдере по периметру. Виньетка тут же, а не постобработкой — иначе боевой Volume задел бы арену.живое: MapBackdrop.matConfigs/MapStyle.asset
SH_Map_Table.shader (64 стр.)Поверхность под листом, видна за рваными краями. Тайл — Kenney/kenney_pattern-pack/pattern_63.png, пятно света — Kenney/kenney_light-masks-1.0/circle_a_streaks_noise.png. Непрозрачный и самый дальний по Z: он закрывает пустоту, которую камера иначе заливает цветом очистки.живое: MapTable.matMapStyle.asset
SH_Map_Icon.shader (77 стр.)Иконки узлов в едином цветовом решении: спрайт обесцвечивается и красится по рампе тень→свет (gradient map). Разномастные иконки Honeti читаются как один набор. Состояние узла приходит через SpriteRenderer.color = vertex color. Обвязка (_Flip, _MainTex_ST, инстансинг) скопирована с HitFlash.живое: MapIcon.matPrefabs/Map/MapNode.prefab
SH_Map_Fog.shader (66 стр.)Атмосферный туман над непройденной частью акта: два слоя шума ползут в разные стороны, растворение — дизерингом по матрице Байера (гладкая дымка поверх пиксельных иконок читалась бы как фильтр из другой игры).дремлющее, но не мусор. Материал по-прежнему прописан в MapStyle.asset, код WorldMapView.PlaceFog жив; эффект гасится тумблером VisualToggles по решению Макса («вообще не то, мб позже вернёмся»). Удалять нельзя — это осознанно отложенное, а не забытое
MapBackdropCommon.hlsl / MapFogCommon.hlsl / MapIconCommon.hlsl / MapTableCommon.hlslТела пасс, вынесенные в общие файлы, чтобы правка не разъезжалась между пассами 2D и Forwardживое (подключаются #include, не GUID-ссылкой — поэтому в grep по GUID выглядят как «0 ссылок», это ложная тревога)

Готча, зафиксированная прямо в комментарии MapIconCommon.hlsl: в SH_Sprite_HitFlash код продублирован между пассами и не вынесен в инклуд. Пока не аукнулось, но помечено как мина.

Бой / VFX

ФайлЧто делаетСтатус
SH_Sprite_HitFlash.shader (177 стр.)Точная копия официального URP 2D Sprite-Unlit-Default + одна строка вспышки. Базироваться на официальном критично: он несёт _Flip (flipX/flipY!), _MainTex_ST, инстансинг — прежний «голый» шейдер их не имел, и спрайт рисовался криво. _FlashAmount подмешивает цвет поверх итогового (не множитель), поэтому «в белый» реально заливает, в отличие от SpriteRenderer.color.живое через MAT_Sprite_HitFlash.mat
SH_Sprite_Shatter.shader (153 стр.)Разлёт спрайта на треугольники одним дро-коллом. Меш — квад, триангулированный на разъединённые треугольники (ShatterMesh); каждый несёт центроид и случайные параметры. Vertex двигает тройку вершин как жёсткое целое: псевдо-3D кувыркание + 2D-спин + дрейф + гравитация. Цвет в три фазы: impact-вспышка → возврат исходного → выцветание в emissive-бирюзу (bloom подхватит).живое, но через Shader.Find, а не через материал-ассет: Presentation/DeathShatter.cs:182
SH_Pixel_Burst.shader (103 стр.)Пиксельный «брызг» частиц одним дро-коллом (hit-spark / muzzle / dust / heal). Общий меш PixelBurstMesh с запечёнными на частицу углом разлёта, рандомами скорости/жизни и порогом отсева.живое, тоже через Shader.Find: Presentation/PixelBurst.cs:98
SegmentedHealthBar.shader (149 стр.)Сегментированный HP/щит-бар для uGUI (world-space, надголовный). Всё за проход по UV.x: HP → щит → chip-дельта (догоняющий trail) → пустота. Насечки фиксированного значения: при росте EHP они сгущаются, а ширина бара не меняется (трюк LoL).живое через оба MAT_Segmented*.mat

Оба Shader.Find-шейдера — тот случай, когда grep по GUID даёт ноль, а ассет живее всех живых. Отдельная готча: Shader.Find не тянет шейдер в билд автоматически, если он не в Always Included Shaders или не в материале-ассете. Проверить, что они не отвалятся в плеере, стоит отдельно — по коду этого не видно.


UI

19 файлов в трёх местах. Пиксель-арт, производный от покупного пака Honeti.

UI/Honeti-gm/ — 9 файлов, всё живое

Результат работы Editor-тула Palette Remapper (Scripts/EditorTools/PaletteRemap/PaletteRemapWindow.cs, дефолтная выходная папка прописана буквально на эту директорию). Оригиналы Honeti перекрашены в нашу палитру — сверил побайтно, все девять отличаются от исходников, то есть ремап реально применён.

ФайлРазмерЧто это по факту
WindowStroke_gm.png48×48Рамка панели: тонкий тёплый золотисто-коричневый кант с внутренней тенью, центр прозрачный. 9-slice. Самый нагруженный ассет темы — панели, диалоги, поля поиска, топбар
GoldOutlined_gm.png16×16Кнопка secondary: скруглённый прямоугольник, оливково-золотой контур в 1px, заливки нет
GoldOutlinedHover_gm.png16×16То же, светлее — hover
GoldOutlinedDown_gm.png16×16То же, притоплено — press
Gold2_gm.png16×16Кнопка primary: сплошная латунная заливка с bevel
Gold2Hover_gm.png / Gold2Down_gm.png16×16Её состояния
Inactive1_gm.png16×16Disabled / неактивный таб — тусклая плашка
Separator_gm.png4×4Разделитель

Подключены не через GUID, а по URL-пути в UI/Theme/components.uss — около 30 правил. Из-за этого поиск по GUID показывает по ним ноль ссылок; это ложное срабатывание, не мусор. Побочный эффект настоящий: переименование или перенос папки молча ломает тему, без ошибки компиляции.

Дыра: components.uss в двух местах (строки 1018 и 1440) тянет иконки напрямую из покупного пакаHoneti/PixelArtGUI/Textures/Icons/16/HeartRed.png и .../LockGold.png, мимо ремапа. Эти две иконки останутся в исходных цветах Honeti, когда всё вокруг перекрашено. Либо прогнать через тул, либо осознанно оставить.

UI/Icons-gm/Map/ — 9 иконок узлов карты

Вопреки суффиксу -gm, это побайтные копии оригиналов Honeti, а не перекраска (проверил cmp — все девять идентичны файлам из Honeti/PixelArtGUI/Textures/Icons/32/, кроме Help.png, который взят из /16/). И это правильно: перекраску делает SH_Map_Icon на лету через gradient map, потому что тон карты крутят десятки раз и перегенерировать набор на каждый поворот было бы дорого. Суффикс -gm тут вводит в заблуждение — он обещает ремап, которого нет.

ФайлЧто на картинкеУзелСтатус
CompassOutlined.png 32×32Латунный компас с синим лимбом и красной стрелкойIcon_Startживое
Sword01Outlined.png 32×32Прямой меч синеватой стали, золотая гарда, остриём вверхIcon_Battleживое
Sword03Outlined.png 32×32Меч крупнее и богаче: красное лезвие, золотая крестовинаIcon_Eliteживое
SkullOutlined.png 32×32Голубовато-серый череп анфасIcon_Bossживое
ScrollOutlined.png 32×32Свёрнутый пергаментный свитокIcon_TextEventживое
Chest01Outlined.png 32×32Сундук с золотыми оковками, закрытIcon_Chestживое
PouchGreenCoinsGoldOutlined.png 32×32Зелёный кошель с золотыми монетамиIcon_Shopживое
Help.png 16×16Бледный «?» — почти белый, без внутренней тениIcon_Unknownживое, но проблемное
Helmet02Outlined.png 32×32Сине-стальной шлем с забралом и гребнемне используется

Все восемь используемых прописаны в Prefabs/Map/MapNode.prefab (у него дети Icon_Start, Icon_Battle, Icon_Elite, Icon_Boss, Icon_TextEvent, Icon_Chest, Icon_Shop, Icon_Unknown — по одному на каждое значение MapNodeType из Scripts/Guild/RunState.cs).

Две реальные проблемы:

  1. Help.png — 16×16 против 32×32 у всех остальных. Взят не из той папки исходников. В ряду одинаковых узлов «?» будет либо вдвое мельче, либо растянут вдвое с разъездом пиксельной сетки. Чинится в одно действие: скопировать Honeti/PixelArtGUI/Textures/Icons/32/Help.png. Дополнительно: иконка почти сплошь белая, а SH_Map_Icon красит по яркости исходника — значит она ляжет целиком в _LightColor и останется плоской, без рельефа тень→свет, который вытягивает остальные иконки. Стоит взять вариант с контуром/тенью.
  2. Helmet02Outlined.png — сирота. Ни одной ссылки во всём Assets/. По смыслу это был кандидат на Elite, проигравший Sword03Outlined. Мусор — удалять.

UI/WhiteFill.png — 16×16

Ровный белый квадрат, лежит в корне UI/ без папки. Живое: используется как база под шейдерную заливку в Prefabs/UI/HealthBar.prefab и Prefabs/UI/ManaBar.prefab (SegmentedHealthBar рисует всё сам, спрайт нужен только чтобы Image было что растягивать). Технический ассет; лежать в корне рядом с тематическими папками ему не стоило бы, но это косметика.


Arena

127 файлов, все — один автоматический побочный продукт, ничего нарисованного руками.

Arena/
└── Grayscale/
    ├── TX Tileset Grass Gray.png   (256×256, атлас травы/земли/мостовой)
    ├── TX Tileset Wall Gray.png    (512×512, атлас стен и парапетов)
    └── Tiles/                      125 × TileBase (.asset)

Что на картинках по факту:

  • TX Tileset Grass Gray.png — обесцвеченный тайлсет Cainos: в верхней половине редкие мелкие детали-разбросы (травинки, камешки) на ровном сером; в нижней — блоки плитки/мостовой с фаской и трещинами и клинья переходов. Контраст очень низкий, всё сидит в узкой средней зоне серого.
  • TX Tileset Wall Gray.png — кирпичная кладка в сером: угловые блоки с проёмами, длинные стеновые панели, вертикальные тонкие парапеты, отдельный элемент с зарешёченным окном. Читается заметно лучше пола — кладка даёт рисунок.

Живое, полностью. 125 .asset — это TileBase-обёртки, каждая ссылается на свой спрайт из этих двух PNG; они уложены в Scenes/WorldScene.unity (grayscale-дубль тайлмапов). Переключением между цветным и серым корнем занимается Presentation/TestZoneArenaSkin.cs (_colorRoot / _grayRoot), реагируя на TestZoneChangedEvent — это визуал тест-зоны «Бой» вне боя.

Замечания:

  • Папка называется Arena, а содержит только Grayscale. Собственного арта арены у нас нет вообще — цветной пол берётся прямо из покупного пака Cainos. То есть Arena/ сейчас не «наша арена», а «наш дериватив чужой арены». Имя обещает больше, чем есть.
  • 125 сгенерированных .asset в git — приемлемо (они маленькие), но это машинный вывод. Если тайлсет когда-нибудь перегенерируют, всё переедет разом; полезно, чтобы скрипт генерации лежал рядом и был назван в истории (сейчас он упомянут только в коммитах 63dec900 / 08b7077e).
  • Grayscale-пол вышел очень блёклым и малоконтрастным. Под заявленную эстетику тест-зоны это скорее плюс (фон должен отступать), но если серый режим когда-нибудь понадобится как полноценная арена — читаемости не хватит.

Сводка

Живое и работает:

  • все 4 материала в Materials/;
  • все 8 шейдеров + 4 инклуда + 4 материала в Shaders/ (fog — дремлет по решению, не мусор);
  • вся Honeti-gm/ (9 файлов, через USS по путям);
  • 8 из 9 иконок в Icons-gm/Map/;
  • WhiteFill.png;
  • вся Arena/Grayscale/ (127 файлов);
  • 12 листов из 2 спрайт-паков.

Мусор / кандидаты на удаление:

  • Art/UI/Icons-gm/Map/Helmet02Outlined.png — сирота, ноль ссылок;
  • Sprites/.../Martial Hero 3(1) — побайтный дубликат;
  • вторые экземпляры Martial Hero 2 и Monster_Creatures_Fantasy(Version 1.3);
  • Characters 500+ (by batareya) (8.8 MB) и vagabond (1.2 MB) — не боевые по обоим разборам;
  • Art/Animations/ — пустая папка-обещание, которое реализовали в другом месте.

Дыры и расхождения:

  1. Help.png 16×16 в наборе 32×32 + плоская белая заливка под gradient-map шейдер.
  2. 4 материала карты лежат в Shaders/, а не в Materials/.
  3. .anim и .controller лежат в ScriptableObjects/Visuals/, а не в Art/Animations/.
  4. components.uss тянет две иконки (HeartRed, LockGold) напрямую из пака Honeti, мимо палитрового ремапа — они останутся в чужих цветах.
  5. Суффикс -gm у Icons-gm/ обещает перекраску, которой там нет (она в шейдере). Имя врёт.
  6. SH_Pixel_Burst и SH_Sprite_Shatter подключаются через Shader.Find — проверить, что они попадают в билд (Always Included Shaders или материал-ассет), иначе в плеере отвалятся молча.
  7. sprite-packs-audit.md утверждает, что паки не коммитятся; фактически в git 5219 записей и 29 MB.
  8. Дублирование кода между пассами в SH_Sprite_HitFlash — помечено самим автором в комментарии MapIconCommon.hlsl как мина на будущее.