Решили: части скелетного юнита импортируются с 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 (значения), этот файл (почему).