Решили: риг разложен в три уровня — кость → Visual Part (Кость) → узлы спрайтов. Масштаб и
подмена арта живут на контейнере, поза и калибровка — на кости.
Почему контейнер пустой: первый заход положил рендерер на сам контейнер, и Макс это отверг (30.07). У части бывает больше одного спрайта — броня поверх торса, перо на шлеме; рендерер на контейнере делает первый спрайт привилегированным, а остальные — его детьми. Пустой контейнер держит их равными сиблингами.
Почему: до этого узел нёс и своё изображение, и суставы под собой — спрайт предплечья буквально
родительствовал над хватом, а хват над мечом. Отмасштабировать предплечье под перерисованный арт
было нельзя, не увезя вместе с ним хват и оружие. Отвергли обратную раскладку — «вынуть кости
из-под спрайтов»: она меняет пути анимируемых узлов, а на путях висят клипы, три маски и generic-аватар,
и ни один из них при расхождении не жалуется. Контейнер ставится НИЖЕ кости, поэтому не двинулся
ни один анимируемый путь: в диффе профиля изменились ровно два поля, ItemPath меча и щита.
Грабли: трое потребителей читали рендерер прямо с кости, и каждый сломался бы по-своему, молча.
RigProfile.MeasureHeld брал калибровку предмета как локальный угол узла с рендерером — после
переезда прочитал бы ноль вместо −89.39 (теперь считается разницей с хватом, что верно при любом
числе промежуточных узлов). RigSweep.MeasureCoverage искал тело по имени узла и нашёл бы ноль
рендереров, то есть отчитался бы, что щит не закрывает ничего (теперь сверяется с именем КОСТИ через
RigVisualParts.BoneNameOf). Дальний конец кости считался от трансформа кости, а не рендерера —
при отмасштабированном контейнере вернул бы длину без скейла. Приёмка была числовая: пересобранный
профиль дал те же 15 длин костей и обе калибровки до знака.
Владелец правды: RigVisualParts.cs (раскладка и хелперы FindVisual / BoneNameOf),
RigProfile.HeldItem.Resolve (как от хвата дойти до предмета), префаб
Assets/_Project/Prefabs/Bones/BoneUnit_Standart.prefab.