Решили: атака перестаёт быть стейтом базового слоя и переезжает на надстройку. База держит тело
(локомоция, стан, смерть), слой Attack (Override, маска Mask_Attack — руки, торс, голова) держит
свинг, а слой AttackHips (Additive, маска Mask_Hips) добавляет просадку таза ДЕЛЬТОЙ поверх bob’а
локомоции. Порядок слоёв: Base → Attack → AttackHips → Cast → Block.
Почему: удар с разбега теперь физически едет вперёд весь замах, и свинг, занимающий всё тело,
вёз бы юнита на неподвижных ногах. Тем же швом закрывается стрельба на ходу у будущего кайтера и
толчок сепарации посреди замаха — костыль simInSwing в UnitAnimationSelector.AttackClipPlaying
существует ровно потому, что свинг сегодня забирает тело целиком.
Отвергли «выбрать, кому достанется таз». Override-слой отдал бы его одному владельцу: маска только на руки роняет вес удара (он держится на наклоне корпуса и просадке таза), маска со включённым тазом роняет bob бега. Аддитивный слой снимает выбор — дельта складывается с тем, что дала база. Замер на живом риге (Unity 6000.4.8f1): таз бега 0.038, с аддитивным слоем 0.001, применённая дельта −0.037 — ровно дельта клипа; Override поставил бы абсолютные −0.022 и стёр бы bob. Старый форумный баг про additive + Generic не воспроизводится.
Отвергли и копию структуры во втором слое: AttackHips синхронизирован с Attack, поэтому машина
состояний остаётся в одном владельце.
Ноги в стоячих ударах не теряются: базу выбираем по тому, чем юнит занят ногами — локомоция, если сим его везёт, и тот же клип атаки, если он стоит. Решение принимается на входе в свинг и до конца свинга не меняется.
Грабли: синхронизированный слой НЕ наследует клипы источника. Первый замер после сборки дал
дельту таза ровно 0.000 при, казалось бы, правильной раскладке — слой играл пустоту. Нужен явный
AnimatorControllerLayer.SetOverrideMotion на каждый стейт источника; только после этого появились
те самые −0.037.
Второе: Mask_Arms переименована в Mask_Attack через AssetDatabase.RenameAsset — guid
ed6cf07a... сохраняется, ссылка из контроллера не рвётся. Имя маски обязано говорить, что она
пускает, а не какую часть тела: слой несёт весь верх, а не только руки.
Расписка: маски на generic-риге держатся на валидном аватаре, а аватар инвалидируется переименованием
узлов. С четырьмя слоями вместо одного цена случайного переименования выросла — только RigMigrate.
Владелец правды: BoneUnit_Standart.controller (раскладка слоёв), Mask_Attack.mask,
Mask_Hips.mask, docs/attack-layers-progress.md (ход захода).