Цвет боевых эффектов

Правило одной строкой: яркость тратим щедро, насыщенность — как валюту. Внутри одного эффекта они обратны: чем ярче точка, тем она белее.

Стилевая рамка — Vision - Visual Direction. Технический контракт полей, потребители и числа — Reference - VFX Color.


Почему не «всё на максимум»

Соблазн понятный: VFX должен сверкать, значит ставим предельно яркий и предельно насыщенный цвет, а где перебор — потом занизим. Так делать нельзя, и вот три причины.

Яркость и насыщенность — не два независимых ползунка. Горячее ядро всегда белее каймы: так устроено пламя, так работает пересвет, так ведёт себя bloom. Чистый насыщенный цвет на большой интенсивности упирается в один канал — красный (4, 0, 0) не имеет градаций внутри пятна, форма исчезает, остаётся плоская клякса с цветным ореолом. «Максимально ярко И максимально насыщенно» — два взаимоисключающих требования к одному пикселю.

Максимум съедает шкалу. Мы уже говорим яркостью: автоатака тише, каст ярче, смерть пробивает экран. Если базовая планка стоит на максимуме, ульте некуда расти. Стайлгайд League формулирует это прямо: слабая атака обязана выглядеть иначе, чем ультимативная способность.

«Потом занизим» не работает на нашем жанре. Перебор не виден на одном эффекте — он вылезает, когда на арене восемь юнитов бьют одновременно, а в кооперативе вчетверо больше. Авторить на максимум значит калибровать в вакууме и платить в бою кашей, где не видно, кто кого убивает. Правильный порядок обратный: спокойная база, подъём по конкретному поводу.

Внешний канон говорит то же: держаться подальше от 100% и 0% насыщенности (иначе эффект сливается со средой), избегать крайностей по светлоте, работать средним диапазоном, а высокую насыщенность тратить там, где нужно притянуть взгляд.


Два поля на юните

Цвет эффектов живёт на юните, а не в префабе эффекта: один префаб служит всем, иначе холод Криоманта и свет Пастыря одинаковы просто потому, что летят из одного префаба.

ПолеЧто этоЧем красит
Vfx ColorГЛАВНЫЙ цвет, там где цвет ровно одинтело снаряда, его след, контур каста
Vfx PaletteДИАПАЗОН случайного разбросаискры, частицы удара, осколки смерти

Почему два, а не один градиент: хвост следа — это тот же свет, теряющий прозрачность, а не переход во второй цвет. Читать голову и хвост из палитры разброса — логическая ошибка, мы её уже один раз совершили.

Палитра читается по двум концам. Начало — около-белый пересвет в оттенке юнита, конец — насыщенный цвет юнита. Частица берёт случайное значение между ними, и рой выходит живым («жёлто-белые вразнобой», а не одинаково белые). Промежуточные ключи градиента никто не читает — ставить их можно для наглядности, но работы они не делают.


Числовые границы

  • Насыщенность главного цвета — 70–90%. Не 100 (сливается и теряет форму), не ниже 60 (перестаёт быть узнаваемым цветом персонажа). Исключения осмысленные: сталь Копейщика ~45%, свет Пастыря ~25% — это и есть их характер.
  • Ни один канал не в нуле. Иначе после bloom в пятне не остаётся формы.
  • Яркость выше порога свечения. Порог bloom стоит на 1.0, поэтому главный цвет живёт около вдвое ярче обычного, насыщенный конец палитры — чуть выше, пересвет — ещё выше. Конкретные множители — в тех-справке.

Насыщенность как язык важности

Шкала, снизу вверх: автоатака → способность → каст за ману → смерть. Рядовое событие приглушённее, редкое и дорогое — на полную. Это не украшение, а читаемость: в реальном времени игрок понимает, что происходит, по яркости пятна раньше, чем разберёт форму.


Что цветом юнита НЕ красится

  • Пыль под ногами, земля, дым — принадлежат миру, а не персонажу. Красить их цветом юнита значит стирать границу между тем, что делает герой, и тем, из чего сделана арена.
  • Каркас интерфейса живёт по своему правилу — тёплая приглушённая палитра. На VFX оно не распространяется: эффекты имеют право звенеть на фоне латуни, в этом их работа. Речь только о том, что звенеть не должны все сразу.

Цвет говорит о личности, а не о стороне

Враждебность носит полоса HP, а не оттенок эффектов (решение Макса 30.07.2026). Прежнее правило «враги — единая красная семья» снято: оно решало опознание, которое уже решено интерфейсом, и заодно запрещало гоблину быть зелёным — то есть тем, кто он есть.

  • Герои разведены по спектру: у каждого свой сектор, соседи не сталкиваются оттенком. Огонь оранжевый, Защитник золотой, Следопыт лаймовый, Треант травяной, Друид изумрудный, Монах циановый, Криомант ледяной, Копейщик стальной, Убийца фиолетовый, Пастырь тёпло-белый.
  • Враги различаются по НАСЫЩЕННОСТИ, а не по сектору: приглушены, потому что герои должны звенеть громче. Рядовой почти бесцветен, самый выразительный в пачке — тот, у кого есть характер (яд головореза).
  • Повторять оттенок между юнитами можно. Одиннадцать героев уже занимают весь круг, и требование уникальности заставляло бы врагов лезть в чужие сектора ради самой уникальности. Совпадение читается как родство («у головореза тот же яд, что у Следопыта»), а не как ошибка.

Одна цена принята сознательно: искры удара красятся палитрой БЬЮЩЕГО, и в свалке «по мне попали» больше не читается цветом брызг. Это работа направленного фидбэка — отброса тела и вспышки на своём юните, — а не цветовой семьи.


Ростер: кому какая роль

Юнит хранит роль, а не цвет: значение живёт в палитре проекта (UI/Theme/tokens.*.uss → снимок GuildmasterPalette), поэтому смена оттенка правится в одной строке и подхватывается всеми носителями. Здесь — дизайн-решение «кому какая роль»; сами значения и множители яркости — в тех-справке.

Герои.

ЮнитРоль оттенкаЧем читается
relic.flame_swordsman — The PyreFireгорячий оранжевый, самый «физический» огонь ростера
relic.defender — The BulwarkGoldзолото щита: тёплое, но не огонь
relic.light_shepherd — The ShepherdLightпочти белый — свет, а не цвет; низкая насыщенность и есть характер
relic.ranger — The HunterLimeядовитая зелень выстрела, холоднее травы
relic.treant — The ThornGrassживая зелень: дерево, а не яд
relic.druid — The BloomEmeraldизумруд с уходом в бирюзу — лечение, не природа вообще
relic.whirl_monk — The GaleWindветер: холодный, но не лёд
relic.cryomancerFrostледяная синь, глубже ветра
relic.iron_spearman — The SpearSteelсталь: приглушённо, металл не звенит цветом
relic.assassin — The FangShadowединственный на своём краю спектра — тень читается мгновенно
relic.baseNeutralWarmболванка: тёплый нейтральный, никого не изображает

Враги — приглушены (насыщенность до 45%), оттенок по существу, а не по «семье».

ЮнитРоль оттенкаЧем читается
enemy.goblin_gruntDustпыльная охра: рядовой никого не изображает
enemy.goblin_warriorIronтёплое железо: тяжелее рядового, ближе к оружию
enemy.goblin_archerBogболотная зелень: выстрел заметен, но не звенит
enemy.goblin_cutthroatVenomяд — единственная выразительная роль в пачке, это его лицо
enemy.training_dummyNeutralCoolпочти бесцветный: манекен не должен читаться как боец

Палитра разброса отдельного решения на юнита не требует — она выводится из его роли: конец 0 это пересвет в том же оттенке, конец 1 — насыщенный конец. Два числа, которые нельзя выбрать независимо, были бы вторым владельцем одного факта.

Дев-болванки роль не выбирают: BoneDevDuelist носит Gold вслед за Защитником — это дубль под стенд, а не элемент ростера.

Тело красится тем же оттенком, что и эффекты

Цвет юнита один, и владелец у него один — его оттенок. Тем же цветом, которым юнит светит (снаряд, след, искры, контур каста, осколки), окрашены его ВОЛОСЫ и всё, что он держит в руках — оружие любого вида и щит. В бою, на карточке инвентаря и в витрине это один и тот же цвет.

Остальное тело носит цвет, каким нарисовано: кожа, лицо, одежда, руки, ноги. Так решено 05.08.2026, и причина в природе тинта — см. ниже.

Тинт УМНОЖАЕТСЯ на готовый спрайт, поэтому он затемняет и уводит оттенок, но не перекрашивает нарисованное: синий рыцарь под оранжевым тинтом станет тёмно-серым, а не огненным. Настоящая перекраска — работа Palette Remapper.

Ступень приглушения тела (Ash / Verdant / Tan) снята 05.08.2026 — целиком, вместе с полем в данных. Она была вторым владельцем цвета и стояла главнее оттенка у тридцати китов из сорока восьми: тело шло пеплом, пока его же эффекты летели своим цветом. Задача, ради которой её заводили — развести тех, кто носит один арт, — исчезла с переездом ростера на общий скелет: арт делят все, и четыре ступени серого сорок восемь китов не разводят. Решение — 4.


Связь: Vision - Visual Direction (треки 5 и 6 — gamefeel и death-джус), Reference - VFX Color (контракт полей и потребители).