Решили: границы 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.