Решили: части скелетного юнита импортируются с filterMode: Bilinear и выключенными мипмапами. Настройка держится в двух местах и оба обязательны: .meta десяти частей в Art/Sprites/Bone Animations/Bone Animation Sprites - Standart/ и пресет BonePartSprite.preset, привязанный к папке через PresetManager (glob:.../Bone Animations/**). Правка одного .meta без пресета означает, что следующая нарисованная часть придёт с другим фильтром.

Почему: спрайты экспортируются из Aseprite в ×10 как запас разрешения под вращение костей, и Point этот запас обнуляет — он берёт один тексель из блока 10×10 и выбрасывает остальные, поэтому кромка остаётся рваной, а при повороте выбранный тексель меняется скачком. Целочисленный скейл нам недоступен: боевая камера ведёт зум непрерывно (CameraModeController.DriveActionZoom), в ровное кратное на экране не попасть.

Мипмапы сначала выглядели обязательным дополнением к Bilinear и были включены, затем отвергнуты по замеру. Проба: инстанс BoneUnit_Standart под вращением меча и руки плюс субпиксельный дрейф корня, ортокамера, фигура ~48 px на экране (боевой масштаб), четыре варианта — Point, Bilinear без мипов, Bilinear+мипы, Trilinear+мипы. Мипы размывают тёмный контур: он занимает один арт-пиксель (10 текселей), на мип-уровне 3 (÷8) сжимается почти до текселя и смешивается с телом в серое. Контур — признак стиля (docs/art/ТЗ_пиксель-арт_юниты.md §0: «жирный тёмный контур»), терять его нельзя. Trilinear не спасает: усреднение то же, он лишь сглаживает переход между уровнями.

Отсутствие мипмапов не даёт алиасинга, хотя минификация ×10: алиасинг требует высокочастотного содержимого, а исходник блочный — арт-пиксель это 10×10 одинаковых текселей, четыре текселя билинейной выборки почти всегда лежат внутри одного блока. Вывод действителен именно для блочного исходника: часть, нарисованная в реальном высоком разрешении, или заметно более далёкая камера потребуют пересмотра.

Грабли:

  • Настройка фильтрации у части два владельца.meta и пресет папки. Пресет нашёлся не сразу, и без него правка держалась бы только на уже существующих файлах.
  • Sprite Atlas перекрывает настройки отдельных текстур (свои Filter Mode и Generate Mip Maps). Атласов в проекте нет; когда появятся, фильтрация переедет на атлас и эту правку надо будет повторить там, иначе она молча обнулится.
  • Проба ставилась в редакторе, где параллельно работает человек: SaveAndReimport и запуск тестов дают domain reload, а он уничтожает временный стенд с HideFlags.HideAndDontSave. Стенд нужно создавать и снимать одним вызовом execute_code, а не цепочкой.
  • Первая проба снималась при фигуре ~72 px и была не тем масштабом: в бою фигура 30–55 px, а чем сильнее минификация, тем выше мип-уровень и тем больше мыла. Масштаб замера — часть замера.

Владелец правды: .meta частей и BonePartSprite.preset (значения), этот файл (почему).