Цвет боевых эффектов
Правило одной строкой: яркость тратим щедро, насыщенность — как валюту. Внутри одного эффекта они обратны: чем ярче точка, тем она белее.
Стилевая рамка — 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 Pyre | Fire | горячий оранжевый, самый «физический» огонь ростера |
relic.defender — The Bulwark | Gold | золото щита: тёплое, но не огонь |
relic.light_shepherd — The Shepherd | Light | почти белый — свет, а не цвет; низкая насыщенность и есть характер |
relic.ranger — The Hunter | Lime | ядовитая зелень выстрела, холоднее травы |
relic.treant — The Thorn | Grass | живая зелень: дерево, а не яд |
relic.druid — The Bloom | Emerald | изумруд с уходом в бирюзу — лечение, не природа вообще |
relic.whirl_monk — The Gale | Wind | ветер: холодный, но не лёд |
relic.cryomancer | Frost | ледяная синь, глубже ветра |
relic.iron_spearman — The Spear | Steel | сталь: приглушённо, металл не звенит цветом |
relic.assassin — The Fang | Shadow | единственный на своём краю спектра — тень читается мгновенно |
relic.base | NeutralWarm | болванка: тёплый нейтральный, никого не изображает |
Враги — приглушены (насыщенность до 45%), оттенок по существу, а не по «семье».
| Юнит | Роль оттенка | Чем читается |
|---|---|---|
enemy.goblin_grunt | Dust | пыльная охра: рядовой никого не изображает |
enemy.goblin_warrior | Iron | тёплое железо: тяжелее рядового, ближе к оружию |
enemy.goblin_archer | Bog | болотная зелень: выстрел заметен, но не звенит |
enemy.goblin_cutthroat | Venom | яд — единственная выразительная роль в пачке, это его лицо |
enemy.training_dummy | NeutralCool | почти бесцветный: манекен не должен читаться как боец |
Палитра разброса отдельного решения на юнита не требует — она выводится из его роли: конец 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 (контракт полей и потребители).