Решили: при схлопывании узла его поворот уходит ВВЕРХ, в сустав, если под костью есть суставы, и ВНИЗ, в арт, если под ней только рисунок. Мировые позы всех спрайтов снимаются до перестройки и возвращаются после — перестройка обязана быть тождественной по виду, и это проверяется числом, а не глазами.
Почему: 26.61° предплечья — это поза покоя, она обязана поворачивать кисть и меч вместе с рукой; 320.55° меча — калибровка рисунка, и уйди она вверх, анимируемый хват перестал бы быть чистым нулём, а все дуги атак начали бы отсчёт от кривого нуля. Одно правило на оба случая («вливать в родителя») ломает вторую половину молча — поза выглядит правильной, а дуга уезжает. Различие механическое: есть ли под костью суставы.
Восстановление по снимку выбрано вместо ручного пересчёта локальных координат ещё и потому, что оно
чинит варианты бесплатно: подгонка арта — это и ЕСТЬ мировая поза спрайта, поэтому 112 override-ов
Storybook не переносятся, а выводятся заново на новых узлах.
Грабли:
- Предмет варианта может быть ВЛОЖЕННЫМ префабом. Копьё — инстанс
Weapons/Spear.prefab, а не узел: код, разобравший его как обычную кость с предметом, снёс копьё целиком. Перед любой правкой поддерева —IsAnyPrefabInstanceRootвверх по цепочке. - Removed-override держится за КОНКРЕТНЫЙ объект, а не за то, что видно.
Spearудалял костьSword, и спрайт уходил вместе с ней; после схлопывания спрайт стал прямым ребёнком хвата — и меч со щитом воскресли. Правило-лекарство: спрайт, которого в варианте не было ДО прохода, удаляется после него. - Снимок не переживает границу вызова
execute_code. Переменные не живут между вызовами, и перестройка, разорванная на два вызова, теряет эталон — пришлось откатывать дважды. Снимок пишется в файл, тогда шаги можно делить. - Откат префаба через git при живом редакторе требует явного
Refresh— с выключенным Auto Refresh Unity иначе продолжает показывать своё.
Владелец правды: BoneUnit_Standart.prefab (структура рига), RigNaming.cs (конвенция имён),
кадры приёмки — рендер позы покоя до и после.