Система суточного цикла (день-ночь) Unity HDRP 2022
Шепард на мостике!
Вы наверное видели что я сейчас разрабатываю проект, любовное послание EX-Machina - Road Citizen, в нем одна из ключевых механик суточный цикл и я хочу поделиться с вами своим опытом создания системы управления циклом дня и ночи в Unity с использованием HDRP.
Я разработала два скрипта: DayCycleSettings и CircadianSystem, и хочу рассказать, как я их писала шаг за шагом, а также объяснить, зачем нужны каждое из использованных решений.
Шаг 1: Создание ScriptableObject для настроек
Я решила начать с создания ScriptableObject, чтобы отделить настройки от логики и сделать их более управляемыми и переиспользуемыми. Это позволит мне легко настраивать параметры цикла дня и ночи, а также создавать разные пресеты для разных сцен или условий.
Создаем DayCycleSettings.cs
Что здесь происходит?
- [CreateAssetMenu]: Эта атрибута позволяет нам создать экземпляр этого ScriptableObject через меню Unity.
- Параметры времени: Мы задаем текущее время и скорость его течения.
- Продолжительность дня и ночи: Здесь я добавила возможность настраивать время начала и окончания дня и ночи. Это дает гибкость в управлении циклом.
- Настройки солнца и луны: Задаем параметры для позиции, интенсивности и температуры цвета, а также кривые для их изменения в течение времени.
- Настройки звездного неба: Аналогично, задаем параметры для управления звездами.
Шаг 2: Создание основного менеджера цикла дня и ночи
Теперь, когда у нас есть настройки, нам нужен скрипт, который будет управлять изменением состояния сцены в зависимости от времени суток.
Пояснения к коду:
- Ссылки на объекты сцены: Поскольку ScriptableObject не может содержать ссылки на объекты сцены, мы держим ссылки на солнце, луну и профиль объема в основном скрипте.
- InitializeComponents(): Здесь мы получаем компоненты света и дополнительные данные HDRP для солнца и луны.
- Update(): В этом методе мы обновляем время, свет, статус теней и звездное небо каждый кадр.
- SkyStars(): Обновляем интенсивность и вращение звездного неба в зависимости от времени суток.
- CheckShadowsStatus(): Определяем, является ли текущее время днем или ночью, и соответственно включаем или отключаем тени и объекты солнца и луны.
- UpdateLight(): Обновляем параметры света (интенсивность, температуру цвета, позицию) для солнца и луны на основе текущего времени и настроек.
- UpdateTimeText(): Обновляем строковое представление текущего времени для отображения или отладки.
- IsTimeBetween(): Утилитарный метод для проверки, находится ли текущее время между двумя заданными значениями, учитывая переход через полночь.
Шаг 3: Настройка и использование
Теперь, когда скрипты готовы, нужно их настроить и использовать в сцене.
1. Создаем экземпляр DayCycleSettings:
- В Unity переходим в меню Assets > Create > ScriptableObjects > DayCycleSettings.
- Настраиваем параметры в созданном объекте: устанавливаем кривые, интенсивности, времена начала и окончания дня и ночи и т.д.
Настройка настроек (0_о)
Мои варианты кривых, но вы можете экспериментировать
2. Настраиваем CircadianSystem :
- Добавляем скрипт CircadianSystem на пустой объект в сцене.
- В инспекторе привязываем созданный ранее DayCycleSettings к полю settings.
- Привязываем ссылки на объекты сцены: солнце (sunLight), луну (moonLight) и профиль объема (VolumeProfile).
С объемом есть один нюанс, после его создания нужно нажать на кнопку New строки Profile, это создаст scriptable object настроек профиля объема.
И в поле Volume Profile скрипта CircadianSystem, перетащить именно scriptable object профиля настроек объема.
3. Настраиваем объекты солнца и луны:
- Убедитесь, что объекты солнца и луны имеют компоненты Light и HDAdditionalLightData.
- Настройте их начальные параметры по необходимости.
Начальные настройки для солнца и луны
Настройка профиля объема
Обязательные компоненты
Необязательные но добавляющие красивости и тормозов)))
Шаг 4: Тестирование и отладка
Запускаем игру и наблюдаем, как меняется время суток, положение солнца и луны, интенсивность света и звездного неба.
Советы по отладке:
- Проверьте кривые: Убедитесь, что кривые интенсивности и температуры цвета правильно настроены и дают ожидаемые результаты.
- Следите за логами: При необходимости добавьте Debug.Log для отслеживания значений и поведения скрипта.
- Изменяйте параметры на лету: Во время игры можно изменять параметры в DayCycleSettings для мгновенного эффекта и подбора нужных значений.
Заключение
Создание системы цикла дня и ночи с использованием ScriptableObject и менеджера позволяет легко управлять настройками и логикой, обеспечивая гибкость и модульность.
Преимущества такого подхода:
- Разделение данных и логики: Настройки хранятся отдельно от кода, что облегчает их управление и переиспользование.
- Гибкость: Можно создавать различные пресеты настроек для разных сцен или условий.
- Удобство настройки: Изменения в настройках сразу отражаются в поведении сцены, без необходимости править код.
HDRP
Способен творить настоящую магию, но расплачиваться вам придется производительностью, хотя при должном упорстве вы сможете получать потрясающее изображение минимизируя тормоза)
Примечание - URP
К сожалению данный подход нельзя использовать в рендер процессе URP, по причине отсутствия применяемых в HDRP компонентов, но если вы проявите интерес к данному руководству (потешите мою мотивацию сердечками и комментариями), я могу написать альтернативное решение для URP, специально для вас)
Напоследок
Надеюсь, мой опыт и этот рассказ помогут вам в создании собственной системы цикла дня и ночи в Unity! Если у вас есть вопросы или вы хотите поделиться своими идеями, буду рада обсудить их!
Приходите в гости в ToryGames
помните
Зачем вам один мир? Вы можете создать тысячи!
Это Шепард
Конец связи.