Решили: у скелетного рига появился свой UnitVisual (Visuals/BoneStandart.asset), и кадр
контакта его юниты берут из маркера клипа, как все остальные. Доля WindupShare у дев-бойца
обнулена, а из UnitView убрано поле _attackClip — источник маркера теперь один.
Почему: исключение завела прошлая сессия, а не дизайн (прямое указание Макса 2026-07-31: «у скелета
должно быть как у всех, я ничего по нему отдельного не давал»). Механика исключения была такая:
UnitVisual скелетному юниту не завели, симуляция его клипа не видела, AttackFrameCount давал ноль —
и дыру закрыли числом. Число при этом оказалось тем же самым маркером, пересчитанным руками: маркер
стоит на 0.467 с при длине клипа 1.167 с, а 0.45 × 30 тиков дают ровно 0.467 с. То есть один факт жил
в двух местах, и второй экземпляр никто не заказывал.
Отвергнутая альтернатива — оставить долю и расширить её до списка позиций под будущую серию Ударов. Она выглядела дешевле (не трогать ассеты), но закрепляла второго владельца позиции контакта именно там, где серия сделает расхождение видимым: показ скрабил бы клип по своему маркеру, а урон приходил бы по числам из данных.
Грабли: перевод на общий путь вскрыл три несоответствия, которые валидатор контента раньше не
проверял — просто потому, что у юнита не было визуала и он выпадал из выборки. Способность указывала на
пустой слот клипа; собственный арт был приглушён тинтом, хотя у единственного владельца арта
приглушения быть не должно; и у рига нет клипа смерти вовсе. Первые два починены, третий закрыт
заглушкой (Idle в слоте Death) по решению Макса и записан долгом —
Meta - Tech Debt §3.11.
Отсюда общее наблюдение, которое стоит помнить при любой такой унификации: исключение прячет юнита от валидаторов целиком, и цена возврата в общий строй — не одна правка, а весь список правил, которым он не соответствовал всё это время.
Владелец правды: Visuals/BoneStandart.asset (клипы рига), UnitView.ResolveAttackMarker
(<remarks> — почему источник один), долг по клипу смерти — tech-debt §3.11, тесты
AnimationValidationTests и UnitTintPolicyTests.