на главную
об игре

City Car Driving 2.0 - Дневники разработчиков #11

Динамическая система погоды и цикл смены дня и ночи, являются ключевыми элементами для создания атмосферного и правдоподобного мира.

Такие системы должны генерировать не только интересные геймплейные моменты, но и эстетические.

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

Значит, изменения состояний должны храниться в месте, к которому будет легко подключиться извне, и в любой момент можно получать необходимые данные.
Во вторых, это все должно визуально отображаться, причем максимально приближенно к реальности. Например, поверхности намокают при дожде, и и через некоторое время после дождя остаются мокрыми.

Облака плавно затягивают небо, вместе с чем, исчезают тени, от более рассеянного света. И это все должно отлично выглядеть в любое время суток.
В третьих, она должна быть легко настраиваемой, контролируемой и расширяемой. У нас должна быть возможность добавить новую погоду, для будущего развития проекта.

Ещё погода может потребоваться в определенных игровых ситуациях, значит должна быть возможность её менять из других классов. Также, художники должны иметь доступ ко всем необходимым параметрам в одном месте, для точечной настройки графики.

Хорошо, цель поставлена, что дальше?
Начнем с того, что, посмотрев на пункты, можно выдохнуть, и спокойно выкинуть все мысли о системе расчета изменения погоды относительно температуры, влажности, магнитных бурь и того факта, что игрок помыл машину.
И, посмотрев практику других компаний, взять себе идеи с заранее заданным прогнозом погоды. Так мы решаем сразу две проблемы: необходимость делать громоздкую систему с генерацией погоды и то, что в случайной генерации у нас могут возникнуть состояния, когда погода будет выглядеть недостаточно привлекательно.
Дальше необходимо продумать архитектуру данной системы. Тут на помощь приходят блок схемы.

Для соблюдения чистоты кода и распределения логики, вся система разбивается на четыре Blueprint класса.

  • BP_PlanetTime — отвечает за ход внутри игрового времени
  • BP_Biome — задает базовые настройки уровня, его географические координаты и возможную погоду
  • BP_WeatherSystem — рассчитывает текущую погоду и переходы между ее состояниями
  • BP_LevelVisualization — принимает в себя данные из всех трех предыдущих классов и на основании этих данных, задает визуализацию

BP_PlanetTime

Это класс, обязанности которого выходят далеко за границы системы погоды. Трафик, пешеходы и даже часы на телефоне, должны получать точное время, знать о прошедших минутах, а некоторые элементы должны иметь возможность перематывать время.
Для реализации подобного функционала хорошо подходят интерфейсы. Класс времени на старте проводит поиск по интерфейсам, передает всем, кого нашел ссылку на себя, а в момент игры вызывает событие, на которое подписываются те элементы, которым это необходимо.

Таким образом, каждый элемент сам будет решать, нужно ему что-то делать после вызова события или нет. А если будет необходимо остановить движение времени, у нас для этого будет одна точка входа.

Сам ход времени реализован через таймер в Blueprints, где за каждый его вызов прибавляется задаваемое время, после чего проводится округление секунд, минут и часов. Полученные значения хранятся в структуре и могут быть получены всеми, у кого есть ссылка на BP_PlanetTime

Дополнительно выведены параметры для настройки игрового времени, сколько секунд/минут/часов проходит в игре за реальную секунду. Плюс к этому введены функции для остановки, перемотки и получения времени в текстовом формате для внутриигровых часов.

Пример округления минут и вызов проверки состояния дня (утро, день, вечер, ночь)

BP_Biome

Данный класс самый простой в реализации, в нем задаются значения широты, долготы и смешение севера на уровне. Тут же могут задаваться фильтры возможной погоды в данной локации.

В плане архитектуры, он также передает ссылку на себя вместе с заданными нами данными.

BP_WeatherSystem

Данный класс, должен получать информацию из BP_PlanetTime и BP_Biome, определять состояние погоды, а главное, реализовывать переходы между ними.

Но где держать всю информацию о погоде в каждый момент времени каждого дня? Да так, чтобы это все не весело постоянно в памяти. Плюс система должна быть удобна для заполнения, чтобы быстро сделать месячный прогноз, ведь нам нужно достигнуть визуального разнообразия.
Для решения этих проблем, был введен прогноз погоды, в котором храниться список дней, а в каждом дне уже храниться набор временных отрезков со своими погодными значениями. У каждого отрезка есть время его начала и конца. Также есть стандартное состояние, в которое перейдет погода, если для какого-то времени, не будет найден прогноз погоды.
Хранить прогноз погоды было решено в формате Data Assets. Это способ хранения данных в Unreal Engine, включающий в себя не только значения, но и функции.
Первым делом создается Primary Data Assets, в котором объявляются все необходимые переменные и функции. А потом, на базе этого создаются Data Assets для заполнения их уникальными данными.

Здесь приведена функция из Primary Data Assets для поиска состояния погоды по дню и часам

Но сколько будет параметров в погоде? А скорее даже, насколько долго будет их задавать каждый раз для всех интервалов для каждого дня? Явно больше одного, что уже будет занимать много времени. Так пришла идея ввести пресеты погоды, которые в себе будут содержать информацию о дожде, облачности, намокании, тумане и тд. И здесь также были использованы Data Assets.

Пример прессетов погоды, созданных на базе Primary Data Assets

Осталось только решить вопрос с переходами между состояниями погоды. Моментальный переход точно не подходит, значит, вводим для каждого временного периода длительность перехода в новое состояние. Но линейный переход будет выглядеть скучно, поэтому добавляем кривую перехода.
Кривая должна идти от 0 до 1 по х и по у, что позволит её пересчитать для любых значений, умножая на длительность и на дельту между начальным и целевым значением.

Самая простая кривая перехода между состояниями

Только теперь переход из солнечной погоды в дождь будет состоять из одновременного появления облаков и дождя, значит, добавляем по кривой к каждому параметру внутри пресета. Это позволит нам настроить быстрое появление облаков с медленным появлением дождя.

Макрос перехода между состояниями внутри BP_WeatherSystem
Функция перехода между состояниями внутри пресета погоды

BP_LevelVisualization

Одновременно самый простой и самый сложный класс. С точки зрения архитектуры — он лишь получает данные со всех трех предыдущих классов и передает их в визуальные компоненты. Единственное, необходимо сопоставить выдаваемые значения состояния погоды и настройки облаков, частиц, неба и всего остального. Это настолько просто, что про это будет написан отдельный дневник.
Таким образом, у нас реализована динамическая погода, с возможностью гибкой настройки всех параметров, позволяющая получать совершенно разные комбинации и допускающая быстрое внесение правок и настроек.

Дневники разработки выходят раз в две недели. Не пропускайте!

Комментарии: 0
Ваш комментарий