Решили: частица рождается в ПОЛНЫЙ размер — кривая sizeOverLifetime теперь 1.0 → 0.25 (спад к смерти), а не 0.40 → 0.20; сверху startSize поднят в 2–2.5 раза во всех шести префабах Prefabs/Vfx. Минимум бёрста поднят с нуля до 60% максимума. Пиковый размер искры удара: 0.036 → 0.216 мировых единиц, то есть с ~2 пикселей до ~13 при юните высотой 1.61.

Почему: боевых эффектов не было видно, и причина оказалась не в слоях, не в блендинге и не в подключении — всё это исправно (шесть VfxData заполнены, OverheadFX/GroundFX существуют и упорядочены верно, тумблеры включены, эффект в упор даёт maxDelta 0.90 на тёмном фоне). sizeOverLifetime умножал размер на 0.40 в момент рождения, поэтому заявленный в инспекторе startSize не наступал никогда. Альтернатива «просто поднять startSize, кривую не трогать» отвергнута: она оставляет множитель-душилку и требует вписывать в поле числа вдвое больше реальных — после этого из ассета нельзя прочитать фактический размер частицы, а именно этой слепоты нам и хватило, чтобы не замечать проблему.

Грабли:

  • sizeOverLifetime не виден ни из startSize, ни из VfxData. Аудит, считающий размер по startSize, врёт в 2.5 раза — сначала я так и посчитала и назвала причиной «контраст на белом теле». Контраст — вторичен: после правки площадь эффекта выросла в 2–4 раза, а средняя дельта на белом силуэте у hit_spark осталась 0.09, потому что светлое поверх белого добавить нечего. Это отдельная, ещё не закрытая задача (цвет/тёмное ядро/спавн по кромке силуэта).
  • Кривую нельзя переписывать всем подряд. У Vfx_CastBurst/Core она РАСТЁТ (0.35 → 0.90) — это расширяющееся ядро вспышки, и спад ломает замысел; у Ring она гасла в ноль осмысленно. Обе сломаны единым проходом и возвращены отдельной правкой. Правило: трогать только кривые, душащие старт, то есть curve.Evaluate(0) < 1.
  • Замер делался контактными листами в preview-сцене вне play mode: ParticleSystem.Simulate там и симулирует, и рендерится. Детерминизм — только принудительным useAutoRandomSeed = false + randomSeed: у всех префабов на диске стоит autoRandomSeed: 1, и без этой правки два прогона дают разный рой, а лист «до/после» становится нечитаемым.

Владелец правды: Assets/_Project/Prefabs/Vfx/*.prefab (значения размеров и бёрстов), Assets/_Project/Scripts/Presentation/PooledVfx.cs (рантайм-множители количества и тинта), Assets/_Project/ScriptableObjects/Configs/CombatFeelConfig.asset (_vfxHitCountMin/Max, _vfxHitIntensityMin/Max).