Решили: длина рабочей части предмета объявляется числом на 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 (что оно не разошлось с артом).