Решили: части скелетного юнита пакуются в один Sprite Atlas V2 — Assets/_Project/Art/Sprites/Bone Animations/BoneParts.spriteatlasv2, packable — папка Bone Animations целиком, поэтому новые наборы частей подхватываются сами. Настройки: padding 4, Tight Packing выключен, Allow Rotation включён, Alpha Dilation включён, Filter Mode Bilinear, мипмапы выключены, Uncompressed.

Почему: атласов в проекте не было ни одного, а спрайтовый батчинг склеивает только то, что лежит в одной текстуре. На арене Y-сортировка перемешивает порядок отрисовки, поэтому без атласа батчи рвутся на каждой смене части. Выбор объёма — вердикт Макса 2026-07-30: один атлас на части скелета сейчас, деление по видам юнитов — когда появятся уникальные наборы; атлас переживёт перерисовку под сетку 96.

Tight Packing выключен намеренно: он делает меш спрайта обтянутым по альфе, а при билинейной фильтрации это срезает кромку. Alpha Dilation, наоборот, включён — он заливает прозрачные пиксели цветом соседа, и кромка не подмешивает пустоту при фильтрации. На рендере кромка вышла чище, чем у россыпи без dilation.

Грабли:

  • Настройки атласа V2 живут в импортере, а не в ассете. SpriteAtlasAsset.Save записывает только packables; SetPackingSettings / SetTextureSettings на объекте SpriteAtlasAsset в файл не попадают, и .meta молча остаётся на дефолтах импортера (Tight Packing и Rotation включены, Alpha Dilation выключен). Настраивать через AssetImporter.GetAtPath(...) as SpriteAtlasImporter, свойства packingSettings / textureSettings, затем SaveAndReimport.
  • Атлас перекрывает фильтрацию отдельных текстур. Bilinear и выключенные мипмапы пришлось повторить на атласе — иначе правка из 2026-07-30-sprite-filtering-bilinear-no-mips обнулилась бы молча.
  • Атлас сейчас дороже россыпи по памяти: страница POT 1024×1024 Uncompressed — 4 МБ, тогда как десять частей занимают 0.9 МБ, заполнение около четверти. Allow Rotation в 512 не уложил. Это осознанная цена: заполнение вырастет вместе с числом частей, а батчинг нужен уже сейчас. Если цена станет неудобной раньше — включать сжатие, а не Tight Packing.
  • SpriteAtlas.spriteCount возвращает 26 при десяти уникальных спрайтах, а GetSprites отдаёт клоны с суффиксом (Clone), которые надо уничтожать. Считать по уникальным именам.

Владелец правды: BoneParts.spriteatlasv2.meta (настройки упаковки и фильтрации), этот файл (почему так и чем оплачено).