В любой выбранной вами игре можно найти такой элемент как локация. Что такое локация? Это место разворачивания действий в игре. Это может быть далекий космос, безлюдная пустыня или же центр мегаполиса. В зависимости от этого локация будет содержать в себе элементы графической и смысловой нагрузки: здания, озера, реки и так далее. River Raft не является исключением, игра насыщена красивыми пейзажами самых разнообразных горных и пустынных рек.
В игре для реки представлен 3D художником ландшафт без воды, с видимым руслом.
Все просчитано так, чтоб игрок при прохождении трассы не мог упасть «под локацию». Но, какая же река без воды? Вода конечно присутствует, и в нашем проекте воды имеет форму прямоугольника.
Первая проблема с которой мы сталкиваемся – это как разместить «квадратную воду» на извилистом русле реки.
С помощью шаманского бубна, расставляем «квадратную воду» пол локации. Почему не использовать один большой квадрат воды? Потому что уклон реки разный, есть спуски и подъемы, это делает невозможным размещение одного большого квадрата по всей плоскости реки. Поэтому было принято решение разделить все на несколько больших квадратов. В этот же момент как визуально соединять эти квадраты воды?
Первым что мы пробовали были плоские меши, которые ставили на стыках воды, но это выглядело просто ужасно и когда начинались волны были заметны пробелы в меше воды, что было в свою очередь недопустимо. Из-за своеобразного поведения воды на не плоской (кубичной) плоскости использовать что либо другое было невозможно. После некоторых модификаций кода WaterFX.cs появилась возможности использовать не только плоскую поверхность для воды, но и цилиндрическую. Вначале мы использовали для создания порогов сферу, и добавляли ей текстуру воды, но вскоре сфера стала не актуальна и мы перешли на использование цилиндра с текстурой воды, вот как это выглядит.
Сами цилиндрические пороги не имеют никакого функционала в плане физики.
Далее речь пойдет о том как оптимизировать выполнение скриптов для «квадратов воды». Так как мы разделяем воды на несколько участков, то соответственно на каждом из участков должны работать скрипты, и они будут выполнять все действия в функции update, что для нас есть очень ресурсоемко. В некоторых локациях этих частей воды было не много и оптимизация была не нужна, а вот в некоторых количество воды переваливало за дюжину. Было принято решение использовать принцип «скроллинга по локации». Будет вычисляться только тот участок воды , в котором находится игрок, а все остальные будут выключены, но только на уровне скриптов.
У каждого участка воды было 2 триггера, входной на активацию воды , и выходной – на выключение функционала, то же самое касается и включение и выключения эффектов и буйков которые плавают на воде.
Этот принцип позволяет повысить фпс до 80-100 кадров в секунду, что делает игру очень даже играбельной.