Решили: предмет сам объявляет свою рабочую часть (UnitHeldItem.ReachPart) — тот кусок арта,
чья длина и есть вылет: клинок у меча, полотно у щита. Длина и направление меряются по ВЕРШИНАМ
МЕША спрайта, а не по его рамке; направление берётся от точки хвата до дальней вершины силуэта.
Зона удара на гизмо заметается прямоугольником, ориентированным вдоль предмета.
Почему: угадывать нельзя ни в одну сторону. «Первый рендерер под хватом» зависит от порядка детей — у меча Storybook из клинка, гарды и рукояти первой оказалась рукоять, и профиль записал вылет 0.0736 вместо 0.36, а гизмо честно рисовало замах рукоятки. «Самый длинный кусок» ошибётся на копье, где древко длиннее наконечника. Рамка спрайта врёт дважды: у диагонального клинка (0.585 x 0.505) высота занижает вылет вдвое, а диагональ рамки задирает ось прямого меча базы до 109.9° вместо 90°. Меш обтягивает рисунок — 28 вершин у клинка против четырёх углов, — поэтому по нему видно и настоящий кончик, и настоящую ширину.
Сказано: «Мммм. Нам надо именно длину спрайта клинка. Нам ведь не надо считать рукоятку и guard? Нам ведь интересует замах КЛИНКА? Так ведь? … Просто явно задавать спрайт клинка и как-то считать по спрайту?» (04.08.2026, сессия ca4f0e10).
Грабли:
- Ось «пятка → кончик» по крайним вершинам тоже косит. Ближняя к хвату вершина — угол рукояти, лежащий в стороне от оси, и прямой меч базы получал 69.7° вместо 90°. Верное направление — от САМОГО ХВАТА к кончику: дуга растёт именно оттуда.
- Порядок детей я же и перевернула в тот же день, подняв каждый арт-узел первым ребёнком ради читаемости иерархии. Косметическая правка сменила замер — признак того, что замер держался не на том.
- Рамка спрайта раздувала и «перекрытие тела щитом»: площадь считалась по пустоте вокруг рисунка.
Владелец правды: UnitHeldItem.ReachPart (какая часть достаёт), RigProfile.cs (замер),
RigSweep.cs (зона по силуэту).