Решили: границы 9-slice у рамок и пластин живут В САМОЙ ТЕКСТУРЕ — textureType: Sprite плюс
spriteBorder в импортёре, — а не в USS свойствами -unity-slice-*. Считает их
scripts/find_slice_borders.py замером; применяются они вызовом AssetImporter на стороне
редактора.
Почему: UITK умеет и то, и другое, но -unity-slice-left в USS означало бы, что одно и то же
число живёт в двух местах — в теме и в голове того, кто резал текстуру. Такая пара расходится
молча: правку размера текстуры USS не заметит. У спрайта же граница едет вместе с картинкой.
Замером, а не на глаз, — потому что сторон сорок. Профиль сравнивает срез с профилем середины грани и ищет, где декор кончается; дальше идёт та однородная полоса, которую 9-slice и тянет.
Грабли: пять заходов, и каждый провалился по своей причине — все они про то, что метрика меряла не то, что я думала.
- Обрезки по фигуре не хватало в конвейере. Первый расчёт дал пластинам T/B в 118-152 при
высоте 408: детект честно нашёл границу ПУСТОГО ПОЛЯ над лентой. Пустота в слайсе означает, что
тянуть нечего, — лечится не порогом, а
cropпо bbox альфы; заодно пластины ужались вдвое. - Сравнение по всей глубине кадра слепо к угловому декору. У рамки центральный столбец почти такой же, как краевой — и там, и там «линия рамки плюс заливка». Смотреть надо в приграничных полосах, где угол и живёт.
- Усреднение по столбцу теряет структуру: «перо в углу» давало то же число, что «линия на грани». Сравнивать надо профили поточечно.
- Поиск от края внутрь находит не ту границу. У самой кромки рамка начинается тонкой линией, и первое падение ниже порога случалось ДО начала угла — отсюда границы по 2 px. Сканировать надо от середины наружу, до последнего подъёма над порогом.
- Порог по максимуму профиля съедал сам себя. После обрезки на нулевом пикселе стоит резкий скачок альфы; он и становился максимумом, а на его фоне весь угловой декор оказывался ниже порога. Считать порог надо по перцентилю зоны без кромки.
- Медиана из четырёх сторон не гасит пару промахов. Промахи здесь бывают только вверх —
профиль цепляет соседний декор, — и у
Frame_Steppedверх дал 290 против 151 по бокам, из-за чего медиана вывела 220. Устойчив второй снизу.
Сквозной вывод захода: числа, которые «выглядят правдоподобно», ничего не доказывают. Каждый из шести промахов давал симметричные и аккуратные значения; неверными их показал только кадр с границами, нарисованными поверх текстур. Проверка визуального замера — картинка, а не таблица.
Владелец правды: scripts/find_slice_borders.py, значения — spriteBorder в .meta каждой
текстуры, сводка — Reference - UI Texture Inventory.