Сезонные вариации: одна локация, четыре погоды
Мне предложили сделать «деревню в четыре сезона». Я прикинул: четыре сцены, четыре набора текстур, четыре раза свет — полгода работы, если честно. В итоге собрал всё за три недели, и геометрию не тронул ни разу. Секрет банальный: сезон — это не новая локация, это новая настройка старой.
Что меняется на самом деле
Зима — это лето, у которого: температура света холоднее, небо серее, трава спрятана под снегом, на крышах лежит белая шапка, а на дороге каша из грязи. Ни одна стена не сдвинулась. Дерево не стало другим деревом. Это те же объекты, одетые в другую погоду.
Отсюда главный принцип: разделяй статику и «погоду». Геометрия, коллизия, модульные kit'ы — неизменны. Всё сезонное выносим в три слоя:
- Материалы. Не новые материалы, а вариации старых. У меня каждый шейтер окружения принимает параметр
season_maskили просто переключается на другой набор текстур через Material Instance (Unreal) / Node Group override (Blender). Трава: летом зелёный альфа-лист, зимой — тот же меш с маской снега. Тот же куст, те же координаты. - Декали и доп. меши. Снег на крышах — это не изменённая крыша, а отдельный тонкий меш-«шапка» поверх, включаемый слоем
WINTER. Лужи, грязь, иней на окнах — декали. Осенние листья на дороге — те же самые billboard-кусты, перекрашенные в рыжий. - Свет и атмосфера. Лето: солнце 5500K, небо голубое, экспозиция обычная. Зима: 7000K, солнце ниже, туман плотнее. Ночь: тот же комплект, только солнце выключено, луна + lamp-посты горят, экспозиция минус два стопа.
Material swap без боли
Чтобы перекраска не превратилась в ад, с самого начала:
- Единый UV на всю локацию. Если у каждого дома свой развёрнутый мир, снег ляжет криво. Мой выбор — world-space признаки: высота, нормаль, «вверх» (
dot(N, Z)), а не UV-координаты. Тогда снег ложится на все горизонтальные поверхности автоматически, на любой крыше из kit'а. - Палитра через параметры, а не через «впечённые» текстуры. Бетон, дерево, кровля — базовые альбедо нейтральные, оттенок меняется параметром. Осенняя листва — HSL-сдвиг зелёного, а не новая карта.
- Слой = кнопка. В движке держу четыре префаба-«сезона», каждый включает свой набор декалей, подменяет инстансы материалов и выставляет свет. Переключение — одна строка кода, а не ручная пересборка сцены.
Грабли
- Снег там, где его не бывает. Каша на дороге, но сухая скала? Снег по нормали: всё, что круче 60°, обязан быть чистым — иначе выглядит как белая краска. Проверяйте маску «по вверх» строго.
- Ночь = выключить солнце. Получается чёрный экран. Ночью нужны источники: луна как key, небо как fill, окна и фонари как акценты. И глаз адаптируется: экспозицию поднимайте, иначе игрок слепнет.
- Четыре набора текстур вместо четырёх инстансов. Классика: художник делает «зимнюю траву» отдельной текстурой — и через полгода забыл, где какая. Держите одну базу и маску.
Сезонность — это не про контент, а про архитектуру материалов. Постройте слой «погоды» отдельно от слоя «геометрии» — и пятый сезон обойдётся вам в пару вечеров. А не в полгода.
Комментарии (1)
Материал-своп через параметр «снег 0..1» — взял в продакшн, зима в игре стала дешевле в 4 раза.
Форма для гостей комментариев пока не принимается — писать можно автору (expeot@outlook.com) или через владельца блога. Все записи выше настоящие, никто их не модерирует молча.