Статус: Planned (замысел; детали обговариваются). Кода освещения ещё нет — слой презентации (код Assets/_Project/Scripts/Presentation/) свет не упоминает. Это план направления и тулинг-контур, не «как есть».


План динамического 2D-освещения: как хотим, чтобы свет читался в бою и на экранах, и каким пайплайном получаем normal-карты, НЕ рисуя их руками на каждый кадр анимации.

Связано: слой презентации (код Assets/_Project/Scripts/Presentation/) · Planning - Roadmap (Фаза 7, презентация) · Meta - Tech Changelog & Decisions.


Намерение (дизайн)

  • Динамический 2D-свет в бою и на экранах — не плоская равномерная засветка, а свет с направлением и цветом, дающий сцене объём и настроение.
  • Иногда — тёмные/затемнённые сцены, где свет читается интереснее: контраст, акценты на источниках (факелы, заклинания, ауры), драматургия боя через освещение. Не вся игра тёмная — это инструмент под отдельные арены/моменты.
  • Свет должен работать с боевым фидбэком (вспышки удара, VFX-искры, death-эффекты как источники света) — стык с слой презентации (код Assets/_Project/Scripts/Presentation/) и джусом.

Дизайн-намерение Макса. Конкретика (какие арены тёмные, палитра, сила теней) — позже.

Технологическая база (proposed)

  • URP 2D Renderer — уже в проекте (Assets/Settings/Renderer2D.asset). Light2D (Freeform / Spot / Global / Point) и тени доступны из коробки, отдельный пакет не нужен.
  • Normal maps заводятся как secondary textures спрайтов (_NormalMap) → Light2D даёт объём «по форме» спрайта. Обязателен point-фильтр и тот же импорт, что у диффуза, иначе на пиксель-арте свет «поедет» по пикселям.
  • Открытый вопрос: нужны ли normal-карты вообще на всех юнитах, или части сцен хватит плоского Light2D + rim/emission. На мелких юнитах в движении эффект normal часто теряется. Решаем пробой на одном герое до раскатки на всех. (proposed)

Тулинг: генерация normal-карт (не рисуем руками)

Ключевая проблема — не рисовать normal вручную на каждый кадр анимации. Решается генерацией, не рисованием.

ИнструментРольСтатус
Laigter (azagaya, opensource)Автогенератор normal + specular + occlusion + parallax из спрайтов/атласов. Есть CLI (--no-gui) и пресеты → батч по папке.Принято (Макс одобрил)
Aseprite (уже в проекте)Точечный контроль normal конкретного кадра через Lua-скрипты, если генератор где-то фейлит.Запасной, по нужде
SpriteIlluminator (Codeandweb)Платная альтернатива Laigter с бОльшим ручным контролем.Не берём без нужды

Пайплайн Laigter (разделение труда)

  1. Макс (один раз): в GUI Laigter настраивает вид normal на одном типовом спрайте → Save preset.
  2. Никси (батч): PowerShell-скрипт зовёт laigter.exe --no-gui -d "<папка/спрайт>" --r "<preset>" -n по всем спрайтам → рядом кладутся <name>_n.png. Новый юнит = закинул спрайты, перегнали батч.
  3. Никси (импорт): normal-текстуры заводятся как secondary textures с point-фильтром и цепляются к Light2D (автоматизируется через Unity MCP, не руками по каждой).

CLI-флаги Laigter: --no-gui (без окна), -d (диффуз/папка), --r (пресет-профиль), -n/-c/-o/-p (normal / curvature / occlusion / parallax). Источник: Laigter docs.

Отложено / за скобками

  • 3D→2D bake-пайплайн («путь Dead Cells»: 3D-модель → рендер спрайтов + запечённые normal автоматически). Идеальный свет, но смена всего арт-контура на 3D — оверкилл для соло-инди-масштаба. Не берём, если не решим уходить в 3D-контур персонажей. (proposed)
  • Точная драматургия тёмных сцен, палитра света, конфиги теней — дизайн, обговаривается отдельно.

Порядок работ (черновой, proposed)

  1. Проба на одном юните end-to-end: пресет Laigter → батч-скрипт → secondary normal → Light2D на тест-герое → play-QA Макса: «стоит ли овчинка выделки».
  2. Если да — батч-скрипт на все спрайты + авто-импорт secondary-текстур.
  3. Свет сцен/арен (Global + локальные источники), тёмные арены как отдельный пресет.
  4. Стык с боевым фидбэком: VFX/удары/смерти как источники света.

Верстается после того, как обсудим детали. Сейчас — зафиксированное направление.