Решили: раскладка слоёв (Base → Action → ActionHips → Block) держится в ДВУХ контроллерах скелета, и править надо оба: BoneUnit_Standart — лабораторный, его носит голый риг BoneUnit_Standart.prefab; BoneUnit_Combatбоевой, его носит UnitView_BoneStandart, то есть то, что играет в игре.

Почему: контроллеров у скелета два, оба лежат в Prefabs/Bones, имена похожи, и по имени живой не угадывается: «Standart» звучит как основной, а в бою стоит «Combat». Вся сегодняшняя работа со слоями сначала легла в лабораторный — то есть в игре не изменилось бы ничего, и понять это по гизмо было бы невозможно, потому что гизмо сэмплит клипы напрямую и контроллер ему безразличен.

Вылезло случайно: замер точки удара пошёл через префаб ВИДА, и там нашлись два аниматора — выключенный Visual Sprites/Body с покадровым UnitBase и живой Visual Sprites/BoneVisual с BoneUnit_Combat.

Грабли: маска у обоих контроллеров ОДНА (общий guid). Переименование Mask_ArmsMask_Action вместе с расширением её состава (были только руки, стали руки + торс + голова) молча изменило смысл слоя Arms и в боевом контроллере — притом что правился лабораторный. В игре это не проявилось лишь потому, что вес слоя 0 и код его пока не трогает. Общий ассет между «песочницей» и «боем» означает, что правка песочницы способна поменять бой, ничего об этом не сказав.

Второе: искать риг в префабе вида через GetComponentInChildren<Animator> НЕЛЬЗЯ — первым найдётся выключенный покадровый. Отсюда же и NullReferenceException в замере: под тем аниматором был ровно один спрайт и ни щита, ни меча.

Владелец правды: BoneUnit_Combat.controller (боевая раскладка), BoneUnit_Standart.controller (лабораторная), UnitView_BoneStandart.prefab (какой из них живой — видно по нему).