Rooten. Дневник разработки, часть 3
Всем привет! Вчера я, наконец, доделал полноценную смену дня и ночи в Rooten, а значит, пора рассказать вам, как это сделано. Только, пожалуй, сразу предупрежу читателя, что эта часть дневников посвящена скорее техническим, чем нарративным решениям.
Кстати, если вы не знакомы с этим проектом, то можно почитать вот эту часть дневников, чтобы составить для себя представление, о чём вообще речь. Также можно подписаться на КАНАЛ ИГРЫ в Телеграме: там я довольно часто выкладываю небольшие посты о проделанной работе.
Ну а мы продолжим!
Мне очень важно было добиться ощущения течения времени в игре. На протяжении дня должно меняться не просто освещение, но и вообще всё настроение Леса. При этом перемены должны быть плавными. В идеале игрок даже не должен обратить внимание, что утро сменилось днём, а просто в какой-то момент обнаружить, что сумрак-то уже развеялся, светит солнышко и поют птички.
Как же этого добиться, особенно с учётом того, что я вообще не программист, а аниматор? Конечно же, анимациями! В Unity аниматоре нашлось всё, что мне было нужно: и возможность управлять практически любыми параметрами объектов, и плавные переходы между анимациями (они же состояния), где длительность этого перехода задаётся просто числом, без необходимости анимировать переходное состояние.
Короче говоря, я решил разрулить всё unity-анимациями. И начал, конечно, с солнышка.
Как вы видите, у солнца есть 4 состояния на все 4 времени суток. В каждом из состояний глобальное освещение имеет разную яркость, оттенок и наклон (чтобы тени удлинялись к ночи). Переходы между состояниями (на скриншоте показанные стрелочками) я сделал довольно долгими. Сейчас это 70 секунд. Таким образом, темнеет и светает настолько медленно, что занятый игрой человек может этого и не заметить.
Ну а сейчас о звуке. Сперва я нашёл общий эмбиент, который должен служить своего рода подложкой, связывая все оттенки атмосферы воедино. Потом нашёл и доработал отдельные эмбиенты для утра, дня, вечера и ночи (всё взято с freesound и довольно сильно переработано в audacity).
Я не придумал ничего лучше, как сразу разместить все нужные эмбиенты, и просто управлять их громкостью тем же unity-аниматором. Скорее всего, это не очень изящное и дорогое по ресурсам решение… Но я не программист, и просто делаю, как умею.
Идея в том, что, к примеру, днём громкость утреннего, вечернего и ночного эмбиента нулевая. Вечером уже дневной уходит в ноль, и проявляется вечерний. Кстати, скорость перехода одного эмбиента в другой гораздо выше, чем «скорость солнца». Получается, что животные замечают, что наступает ночь раньше, чем игрок. И сова начинает ухать несколько раньше, чем солнце окончательно сядет. Что, в принципе, выглядит и звучит реалистично: сначала начинает меняться звуковое настроение, и потом — освещение.
Ну а тот самый общий эмбиент (служащий для придания зловещего настроения) почти не слышен днём, но начинает играть тем громче, чем ближе к ночи.
Теперь всё готово, осталось только научить игру с этим всем работать. Переключать освещение и музыку. И тут на помощь пришла такая замечательная штука, как Event system (надеюсь, я правильно сказал и не перепутал определения). Короче, ивенты. События. Можно буквально парой строк кода запустить событие в любой нужной ситуации. Самое прекрасное, что «наполняем» мы эти события уже без кода, из редактора. И можно много чего сделать: включить-выключить какой-либо объект, вызвать скрипт. Или, что мне и нужно сейчас, переключить анимацию.
У меня вот, например, тикает таймер, в котором отдельно задана продолжительность каждого времени дня. По окончанию срабатывает ивент. И ивент переключает состояние анимации. Вроде всё просто.
А главное — работает, и создаёт именно тот эффект, которого я и добивался!
Если вы дочитали до этого момента — надеюсь, вам было интересно, а может быть, даже полезно. Если же есть вопросы или пожелания, то добро пожаловать в комментарии. Я всегда рад ответить и пообщаться.
Спасибо за внимание, и до новых встреч!