Решили: длина рабочей части предмета объявляется числом на UnitHeldItem (DeclaredLength + DeclaredAxisDeg), замер по мешу переезжает в редакторную кнопку, гизмо показывает объявленное рядом с фактическим, а расхождение свыше 15% роняет DeclaredReachTests.

Почему: заказ Макса — «создать отдельные элементы (например, рекомендуемый размер оружия Х), который используется в логике и никак не зависит от конечной графики». Форму он же и назвал: «Скорее это GO с нужными размерами? Или класс с гизмо для отрисовки, как у нас у арены зона расстановки сделана». Отвергнуто: держать длину в RigProfile (он редакторный, рантайм его не видит) и считать по мешу с кэшем (владельцем числа всё равно остаётся картинка).

Грабли:

  • Замер, читающий собственный ответ, — не замер. И кнопка, и гизмо сначала звали UnitPartGeometry.TryGetTip, а он уже предпочитает объявленное значение. Кнопка переписывала бы число им же самим, а зелёная линия гизмо всегда совпадала бы с жёлтой — то есть инструмент, заведённый ловить расхождение, показывал бы его отсутствие всегда. Обе меряют меш НАПРЯМУЮ.
  • Объявлять надо в БАЗЕ, а не в варианте. Первая запись легла в BoneUnit_Storybook — вариант, — и создала там override. Хуже того: в этом файле лежала чужая незакоммиченная работа, и коммит утащил бы её с собой. Значения переехали в BoneUnit_SwordShield, override сняты PrefabUtility.RevertPropertyOverride.
  • Порог мягкий намеренно. Совпадение бит в бит вредно: художник вправе подвинуть пиксель, не пересчитывая геометрию. А вот четверть длины — это уже другое оружие, чем видит игрок.
  • В симуляции этой величины НЕТ и не должно быть. Боевой reach считается декларативно (Size × BodyRadiusPerSize плюс ступень AttackRange), а вылет предмета нужен показу: дуге за клинком и направлению удара. То есть «логика» в заказе Макса — это слой показа, и развязка нужна ровно там, где картинку перерисовывают.
  • Прецедент уже был в проекте. LocomotionStrideMeter меряет подошву офлайн и пишет темп числом в поле префаба; рантайм меш не спрашивает. Схема не изобреталась — её стоило найти раньше.

Владелец правды: UnitHeldItem.DeclaredLength/DeclaredAxisDeg (число), кнопка «Замерить вылет по мешу» (как оно получено), DeclaredReachTests (что оно не разошлось с артом).