Решили: форма удара, дуга за клинком и порезы на теле рисуются нашими шейдерами по параметрам — ни одной текстуры эффекта. Форма и дуга едут через готовый шов VFX (SO → префаб → пул), порез живёт состоянием тела рядом с тинтом и вспышкой.
Почему: пиксельная текстура эффекта конкурирует с пиксельным юнитом за детализацию и проигрывает, а свет живёт в другом измерении — в яркости — и с артом не спорит. Отвергнут спрайтовый лист форм: под процедурные архетипы (прогиб и толщина гуляют в коридоре, у звезды свои лучи) он превратился бы в атлас на сотню кадров, который всё равно не покрыл бы непрерывную зависимость размера от урона.
Сказано: «Всё сразу. Но помни что у нас у форм некоторых не просто текстурки. а именно генерация , хихи», «Мы делаем ток пока что для нашего bone спрайта защитника.», «Выстави пока сама в клипах, я потом поставлю что и где должно быть. И точку начала и точку конца» (01.08.2026, сессия e2afbb71).
Грабли:
- Массив в property block выключает SRP Batcher для всего материала. Порезы просились массивом
_Cuts[12], а материал тела стоит на каждой части каждого юнита — батчинг арены умер бы ради двенадцати ран. Порезы уехали в три ОТДЕЛЬНЫХ вектора (_Cut0.._Cut2), лимит на часть стал три при двенадцати на тело: они расходятся по силуэту, а не копятся в одном предплечье. - Сид вариации нельзя брать из
IRngService. Он — поток случайности симуляции, и вычерпывать его показом значит менять ход боя от того, что кто-то смотрит на экран. Сид выводится хешем из данных события (участники, место, урон): у всех клиентов кооператива он одинаков, а сим не тронут. - Угол дуги надо разворачивать вручную. Клинок за взмах проходит больше пи, и наивный
atan2даёт скачок через ±пи — сектор схлопывался бы в ничто ровно на середине удара. Mathf.Max(1f, count * k)не гасится нулём. Нижняя граница в одну частицу, поставленная ради слабых ударов, не давала выключить поток вскрытого на блоке — ноль теперь обрабатывается отдельно.- Длину взмаха заранее не знает никто: его ведёт скраб по сим-тикам, растяжение зависит от скорости атаки. Дуга возвращается в пул сама, догорев, а срок при спавне остался только страховкой.
- Кончик оружия — вычисление, а не узел рига. Берётся как самый дальний от точки крепления угол
спрайта; так же его считает офлайн
RigSweep, только длину предмета там даёт профиль.
Владелец правды: Art/Shaders/SH_Vfx_HitForm.shader, SH_Vfx_SwingArc.shader,
SH_Sprite_HitFlash.shader; Presentation/Effects/HitFormFactory.cs, HitFormVfx.cs,
SwingArcVfx.cs; Presentation/Body/BodyCut.cs, BodyShaderIds.cs; тесты
FeelToggleCoverageTests, PaletteSnapshotTests.