Создание Динамически Меняющегося Ландшафта Для Rts На Unity3D

Давным-давно я имел радость поиграть в замечательную RTS под названием «Периметр: Воины Геометрии» от отечественного разработчика K-D Labs. Это игра о том, как огромные летающие города под названием «Рамки» бродят по просторам «Губки» — цепочки взаимосвязанных миров.

Сюжет довольно странный и абстрактный, но гораздо более интересной и новаторской частью игры были ее технические особенности, а не сюжет. В отличие от большинства RTS, где сражения происходят на статичной местности, в Perimeter одной из ключевых игровых механик было терраформирование.

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

Как известно, мир RTS в настоящее время переживает некоторый упадок.

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

точки зрения.

Имея некоторый практический опыт разработки игр (ранее я пытался кое-что сделать с помощью XNA), я подумал, что для достижения успеха самостоятельно мне придется использовать что-то более высокоуровневое и простое.

Мой выбор пал на Unity 3D, пятая версия которого только что вышла.

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



Что предлагает сообщество?

Как всегда, первый блин у меня вышел комом.

Недолго думая, я начал реализовывать ландшафт, используя плоскость и код, который поднимал или опускал вершины этой плоскости.

Многие читатели, хоть немного знакомые с Unity, могут возразить: «Но в Unity есть компонент Terrain, созданный специально для этой цели!» - и они будут правы.

Проблема только в том, что я, слишком увлекшись реализацией своей идеи, забыл об одной важной вещи: RTFM! Если бы я чуть внимательнее изучил документацию и форумы, то не стал бы решать проблему таким откровенно глупым способом, а сразу использовал бы готовый компонент. После двух дней бесполезного пота и алгоритмов (Самолет явно не предназначался для использования в таких целях) я наконец-то приступил к созданию ландшафта с помощью Terrain. Надо сказать, что среди некоторых членов сообщества Unity возникла идея создать динамичный ландшафт для своей игры.

Некоторые люди задавали вопросы на форумах и получали ответы.

Им было рекомендовано использовать метод SetHeights, который принимает на вход кусок карты высот, нормализованный от 0f до 1f, который будет установлен начиная с точки (xBase;yBase) на выбранном ландшафте.

Довольный результатами своих поисков, я приступил к разработке.

Первый рабочий прототип был готов через пару часов и включал в себя простой движок камеры (с помощью правой клавиши), простой генератор кратеров и фактическое добавление этих кратеров в ландшафт нажатием левой клавиши (можно взять билд и видеть Здесь ).

Сама деформирующая часть была до неприличия простой.

Это был скрипт примерно следующего содержания

   

void ApplyAt(DeformationData data) { currentHeights = data.terrainData.GetHeights(data.X - data.W/2, data.Y - data.H/2, W, H);

Теги: #разработка игр #Unity 3D #rts #разработка игр #unity
Вместе с данным постом часто просматривают: