Решили: проверку «разводка тела не сделана» в SkeletalBodyVisual.Awake считаем по ЖИВЫМ
ссылкам, а не по длине списка, а сам инвариант («каждая часть жива и несёт спрайт, и их столько же,
сколько рендереров в риге») держит тест BoneRigLayoutTests.
Почему: переезд арта в контейнеры Visual Part (Кость) пересоздал узлы спрайтов, и все
шестнадцать ссылок вида умерли разом. Через этот список идёт ВСЁ тело — тинт, вспышка удара,
инвиз, силуэт, границы, осколки смерти, — поэтому юнит перестал краситься и вспыхивать, а умирал
без осколков: PlayShatter насчитывал ноль живых частей и сразу звал завершение. Ни одной строки в
консоли: страховка в Awake смотрела на _parts.Count, а список из шестнадцати трупов не пуст.
Грабли: дефект нашёлся не там, где болело. Красным был тест политики тинта — он считал, что
дев-дуэлянт делит арт с реликвией. На самом деле он читал у скелетного юнита выключенный
легаси-узел Visual Sprites/Body, унаследованный от базового UnitView, — просто потому что
скелетный путь возвращал пустоту. Починка ссылок погасила оба красных теста сама.
Порядок отрисовки уцелел только потому, что у прежнего владельца — поля sortingOrder на каждом
спрайте — значения никуда не делись: SortByCurrentOrder вернул список в прежний вид (щит 8,
голова 7, руки 6–4, сапоги 3, меч и голени 2, бёдра 1, тело 0). Правь список в риг-префабе:
UnitView_BoneStandart — вариант поверх него, и починка в варианте стала бы оверрайдом.
Владелец правды: SkeletalBodyVisual.cs (LiveParts, RebuildParts), тест
BoneRigLayoutTests.EveryBodyPartReferenceStillPointsAtArtwork, префаб
Assets/_Project/Prefabs/Bones/BoneUnit_Standart.prefab.