Как сделать карту в unity

Обновлено: 02.07.2024

В этой статье я расскажу о том, как мы с Питером за 24 часа собрали крутую демку с большим открытым миром. Надеюсь, это руководство поможет вам создавать более красивые ландшафты (terrain) в Unity. Для демонстрации мы использовали 2 x 2 ландшафта Unity (суммарно — четыре ландшафта) с параметрами, указанными ниже, и общим для всех ландшафтов разрешением.

  • разрешение карты высот — 4097 пикселей (рекомендованный максимум для игр — 2048 пикселей);
  • разрешение сплат-карты (splatmap) — 1024 пикселя;
  • разрешение базовой карты ландшафта (basemap resolution) — 256 пикселя;
  • разрешение карты расстановки травы — 8192 пикселя (рекомендованный максимум для игр — 2048 пикселей);
  • параметр grass per patch — 8.

Разрешение текстур для RTP:

  • карта цвета (colormap) — 8192 пикселя;
  • карта нормалей — 4096 пикселей;
  • карты распределения — 4096 пикселей.

Следует понимать, что эти настройки — для высокопроизводительного железа. В TerrainComposer вы можете менять разрешение ландшафтов на лету, это позволяет подобрать настройки и для более слабого железа. Мы не сделали этого во второй версии проекта, но планируем сделать в третьей.

Чтобы наши деревья выглядели красивее, мы применили пакет Advanced Foliage Shader от Forst. Преимущество пакета состоит в том, что с ним билборды деревьев могут отбрасывать тени и сам переход от билборда в 3D-дерево выглядит намного лучше, чем при использовании стандартного шейдера Unity, что обеспечивает отсутствие скачков при движении камеры (в тех местах, где дерево заменяется на билборд).

Кроме этого, в AFS есть много чего ещё, — например, изгибание растительности при проходе персонажа рядом. О том, как использовать AFS, можно подробно почитать в идущей к нему сопроводительной документации.

Мы использовали следующие ассеты Unity:

Сначала мы выбрали в WorldComposer область размером 30,107 x 30,107 км вокруг горы MountRanier. Мы установили значение Image Zoom равное 17, что обеспечило суммарное разрешение 36x36K (36000 х 36000 пикселей) для фото со спутника. 36K — слишком высокое разрешение для непосредственного использования в Unity, поэтому позднее мы уменьшили изображение в Photoshop до 8K.

После выбора области мы нажали на Export Heightmap, а затем на Export Images. Для экспорта изображения был выбран формат Raw, чтобы можно было удалить тени. После экспорта на выходе мы получили карту высот размером 4K и 9 x 9 изображений с разрешением 4K.

Возможность удаления теней делает WorldComposer (WC) уникальным по сравнению с другими программами и существенно улучшает качество изображений, полученных со спутника. Я потратил много дней, создавая алгоритм удаления теней, а также работая над стримингом, так как в Unity (по-крайней мере, в Unity 4.x) есть ограничения по количеству и размеру изображений, которые мы одновременно можем загрузить в память.

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

После экспорта изображений мы кликнули кнопку Combine Images. Она собирает все изображения в формате RAW выделенной области в одно большое изображение, сохраняя его под именем area name+_combined.raw в папке для экспортируемых изображений. После этого мы выбрали вкладку Image Editor в верхней части окна WorldComposer.

В данном режиме мы можем видеть одновременно два изображения. Левое изображение представляет собой оригинальный спутниковый снимок текущего участка на карте WorldComposer, а правое — превью изображения после удаления теней. В настройках вкладки Image Editor есть два цвета. Эти цвета определяют диапазон, в котором будет работать алгоритм работы с тенями.

Мы задали радиус, равный 1500, и число повторов (параметр Repeat), равное 4. Алгоритм удаления теней просматривает все теневые пиксели и находит ближайший пиксель без тени, а затем переносит его в какой-то из теневых пикселей в пределах заданного радиуса. Если значение параметра с радиусом слишком мало, вы можете увидеть повторяющиеся участки. Это происходит потому, что алгоритм делает несколько проходов по изображению, чтобы обработать все теневые пиксели.

После выбора настроек мы нажали кнопку Apply во вкладке Image Editor. Обработка занимает много времени ввиду большого размера изображения, но это во много раз быстрее, чем если бы мы делали то же самое в Photoshop. К тому же, Photoshop имеет ограничение по памяти, так как в нём нет стриминга. Мы сохранили полученное изображение в папке экспортируемых изображений под именем Combined2.raw.


Продолжаем цикл статей, рассказывающих о процедурной генерации в Unity.

В прошлый раз мы применили Шум Перлина в качестве основы для генерации поверхности. Этот подход позволяет довольно легко и быстро получить приближённую к реальности карту высот, а добавление цветов в зависимости от высоты делает её похожей на реальную карту. Следующим шагом является использование карты высот для задания собственно самих высот и построение при их помощи объёмного пространства.

Предыдущая статья базировалась на серии видео от Sebastian Lague, который применил данный алгоритм для генерации трёхмерных поверхностей, но это не единственный доступный вариант визуализации. Очень популярными среди создателей игр являются такие виды отображения пространства как сайд-скролл, топ-даун и изометрический, которые с развитием трёхмерной графики не утратили свою актуальность и позволяют придать проекту уникальный стиль и атмосферу. В свою очередь, Unity постоянно работает над расширением доступных для девелоперов инструментов и работа с тайловыми картами является одним из таких относительно новых инструментов, который облегчает создание перечисленных выше видов представления пространства.

Тайловые карты

В 2017 году Unity добавила в движок возможность работы с 2d тайлами, что определённо упростило создание топ-даун и сайд-скроллеров. Годом позже также добавили шестиугольные тайлы и изометрические карты, применение которых вызывает большой интерес, ведь шестиугольники давно является основой для серии Civilization, а изометрический вид является базовым для большинства представителей жанра RPG =) Так что попробуем сделать первый шаг в сторону своей ролевой игры и перенести сгенерированную с помощью Шума Перлина карту в изометрическое пространство.

Отобразить сгенерированную Шумом Перлина карту высот при помощи изометрической тайловой карты Unity.

Подготовка

В качестве основы для реализации послужит генератор Шума Перлина из предыдущей статьи.

Для отображения поверхностей использовался ассет с тайлами от Devil’s Work.shop, из которых были выбраны девять подходящих под требования уровней высот.

Настройка работы с изометрическими картами довольно специфический процесс, который очень хорошо описала Alice Hinton-Jones в своей статье Isometric 2D Environments with Tilemap, так что не имеет смысла её переписывать.

Перечислим шаги, которые были проделаны для настройки данного проекта:

  1. Выставить тип сортировки прозрачности Edit > Project Settings > Graphics > Camera Settings > Transparency Sort Mode - Custom Axis
  2. Настроить оси сортировки прозрачности Edit > Project Settings > Graphics > Camera Settings > Transparency Sort Axis - X=0 Y=1 Z=-0.289 - Z зависит от размеров тайла и алгоритм её вычисления можно прочитать в статье Alice. Возьмите размер вашего объекта Grid по шкале Y, умножьте на 0.5 и вычтите 0.01
  3. Импортировать ассеты тайлов как текстуры
  4. Выставить им Pixels Per Unit в 863 - реальный размер тайла в текстуре
  5. Выставить Pivot в 0.4921, 0.7452 - по центру верхней грани тайла, как описывается в статье от Alice
  6. Разрешить Чтение/запись текстуры в тестовых целях
  7. Создать объект Isometric Z as Y tilemap
  8. Выставить в объекте Grid Y Cell size в 0.577 - зависит от размеров тайла, правила вычисления в статье Alice. Для определения корректного значения шкалы Y возьмите высоту основания(или верхней грани) ваших тайлов и разделите их на ширину
  9. Создать изометрическую палитру тайлов с Y Cell Size в компоненте Grid также равным 0.577
  10. Изменить настройку батчинга в компоненте Tilemap Renderer > Mode на Individual . Эта настройка позволит обойти баг расчёта перекрытия тайлов друг с другом, в случае, если текстуры тайлов находятся в разных атласах. Для использования опции Chunk необходимо, чтобы текстуры тайлов были запечены в один атлас, что можно проделать на стадии подготовки продакшн билда.

Шум Перлина

Генератор шума из прошлой статьи не требует каких-либо доработок и полностью перекочевал из прошлой статьи

Предпросмотр

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

NoiseMapEditorGenerate - добавление кнопки генерации тестовой текстуры в редактор объекта отвечающего за создание тайловой карты(подробнее о расширении редактора Unity можно почитать в нашей статье):

NoiseMapRenderer - класс отвечающий за создание цветной текстуры из Шума Перлина, который позволяет легко настроить параметры и протестировать результаты работы генератора без перехода в Play Mode:

Генерация изометрии

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

Результат

Open Test Runner

Тестовая текстура сгенерированной карты выглядит так:

Open Test Runner

Сгенерированная из этих же координат изометрическая карта:

Open Test Runner

Open Test Runner

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

Заключение

Базовое использование тайловых карт не представляет из себя большой проблемы. Но не стоит забывать, что для приведения карты к визуально приемлемому уровню потребуется очень много работы с ассетами. Да и работа с самими картами в нашем примере далека от завершения. Необходимо добавить возможность увеличения высотности карты, что потребует заполнения свободного пространства при перепадах высот больше 2z . Для свободного перемещения необходимо добавить систему блочной загрузки карты. Добавление динамических объектов потребует создания системы перемещения с учётом перепадов высот, возможно, с использованием стандартных коллайдеров. А для визуального улучшения также необходимо проработать механизм стыка тайлов с разными типами поверхностей. Всеми этими вопросами мы займёмся в следующих статьях цикла о процедурной генерации. Пока! =)

2D Тайлмап. Работа с контентом: от изображения к уровню

В Unity 2017.2 к возможностям работы с 2D добавили Тайлмапы (Tilemap). Используя карты тайлов, ты можешь быстро компоновать и создавать 2D-уровни с помощью комбинации спрайтов и контролировать такие свойства, как порядок слоёв, тайлмапные коллайдеры, анимированные тайлы и многое другое! В этой записи я постараюсь рассказать о всём рабочем процессе, начиная с импорта файлов изображений в Unity и до создания уровня для 2D-платформера!

Коротко процесс работы можно описать так:

Sprite -> Tile -> Palette -> Brush -> Tilemap

Для новичка эти термины Unity могут показаться немного запутанными. Но мы представим это как рисование на настоящем холсте:

Тюбик с краской -> Краска -> Палитра-> Кисть -> Холст

К концу мы соберём уровень из этих кусочков так, что 2D-персонаж сможет бегать по уровню.

1) Спрайты (Sprites)

Импортировать изображения в Unity можно разными способами:

После того как мы импортировали изображение в проект, его тип текстуры (Texture Type) определяется в зависимости от режима твоего проекта 2D или 3D.

Создание 2D проекта в Unity

Настройка проекта в Unity

Тип текстур в Unity

Режим спрайта Single или Multiplee

Окно редактора спрайтов позволяет нарезать изображение на несколько спрайтов; так что ты сможешь сделать одно изображение со множеством рисунков (spritesheet) в любом программном обеспечении для редактирования изображений и определить, какие области изображения рассматриваются как отдельные спрайты прямо в Unity. Не надо плодить и управляться с сотнями отдельных файлов изображения!

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


Тайлы (плитки) в Unity

В Unity 2017.2 появилось новое окно: палитра плиток (Tile Palette). Это окно является неотъемлемой частью использования тайлмап-системы, организуя интерфейс для выбора плиток (Tiles).

Палитра плиток (тайлов)

Палитра тайлов

Чтобы не таскать по одному изображению, есть вариант перетащить лист спрайтов (Spritesheet), который содержит нарезанные спрайты, чтобы автоматически создать набор плиток (Tiles) на палитре.

4) Grid & Tilemap

Для начала нам нужно создать новый тайлмап на нашей текущей сцене; это можно сделать в выпадающем меню: GameObject -> 2D Objects -> Tilemap. Это не только создаст тайлмап, также создаётся игровой объект сетка (Grid), для которой новый тайлмап автоматически станет дочерним.

Сетка для тайлов в Unity

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

5) Рисование на тайлмапе!

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

Выбор карт тайлов

На скриншоте сложная сцена со множеством тайлмапов

Второе, что нужно выбрать — текущую кисть. Она определяет, как плитка (или плитки) будут размещены на тайлмапе.

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

Настройка пикселей на юнит в Unity

6) Тайлмап коллайдер (Tilemap Collider) и составной коллайдер (Composite Collider)

Сейчас у тебя есть все знания, чтобы нарисовать готовый уровень.

Тайлмап коллайдер в Unity

Когда ты добавишь персонажа с физикой и войдёшь в режим игры, он провалится сквозь землю. Вместе с тайлмап-системой появился очень полезный 2D-компонент тайлмап коллайдер (Tilemap Collider). При применении к тайлмапу, он будет автоматически создавать коллайдер вокруг плиток. Тогда в режиме игры, наш персонаж сможет бегать и прыгать на тайлмапе!

Если ты решишь изменить планировку уровня (например, добавить больше плиток или удалить некоторые), то тайлмап коллайдер автоматически обновится!

Создание игр основывающихся на тайлах — хорошая практика, но надо помнить, что это не единственный вариант. Иногда, лучше нарисовать всё целиком, в этом поможет статья как выбрать разрешения для 2D-контента.

Еще один полезный компонент, который добавили в 2D набор физики — составной коллайдер (Composite Collider). Добавление его к тайлмап коллайдеру объединит все коллайдеры плитки в более оптимальную геометрию сетки коллайдера.

Если после этой подробной статьи у тебя остались вопросы, оставляй комментарий ниже, обсудим!


Уроки

Создаем ландшафт реальной местности.

Создание ландшафтной местности в игровых движках всегда требует большого объема работ и затрат времени, тем более если вы пытаетесь создать ландшафт с какой-нибудь реальной местности. Для упрощения этих работ в Unity5 есть функция импорта ландшафтной местности из других программ. Давайте попробуем создать ландшафт реальной местности при помощи сайта terrain.party и программы GeoControl v2.

Делаем карты высот.

Для на чала перейдем на сайт и сохраним участок какой-нибудь местности.

terrain.party

Выберете участок местности и увеличьте масштаб до максимума, далее уменьшите размеры квадрата до минимальных (8 км) и нажмите на облачко.

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

Далее установите программу GeoControl v2. Настройки установки программы можно оставить стандартные. Запустите программу, потребуется ввести имя Team GRB и затем ключ 323825dc6fe6784994206bf8b9db2b45.

Теперь нам нужно импортировать нашу текстуру в эту программу, сделать это очень просто нажмите Generation — Terrain import — Image import .

Import

Выберете нашу текстуру и посмотрите какая карта высот у вас получилась.

terrain

Осталось только экспортировать все это в Unity. Нажимаем Generation — Terrain export — Raw(16bit)fot Carrara, напишем имя и укажем место сохранения.

export

Открываем Unity5 и создаем террейн (если у он вас еще не создан). переходим в настройки Terrain и в самом низу нажмем import raw. Выберите ту карту высот которую мы сохранили и нажмите Import.

unity terrain settings

import raw

При сохранении карты высот в программе GeoControl v2 были указаны размеры карты 2048 х 2048, по этому и в настройках terrain в Unity желательно указать такие же параметры (тут на ваше усмотрение я указал размер карты 3000 х 3000)

terrain unity 5

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

Это введение в карты освещения в Unity. Для получения подробностей смотрите in-depth description of lightmapping in Unity.

Unity располагает встроенным инструментом для создания карт освещения: это Beast от Illuminate Labs. Он полностью интегрирован в Unity. Это значит, что Beast запекает карты освещения для вашей сцены, основываясь на том, как ваша сцена настроена в Unity, какие содержит меши, материалы, текстуры и источники света. Это также значит, что карты освещения теперь являются неотъемлемой частью рендеринга — после их создания вам не придётся ничего больше делать, они автоматически применятся к объектам.


Подготовка сцены к запеканию карт освещения

Выбор ____Window__ – Lightmapping__ из меню откроет окно Lightmapping:

  1. Убедитесь, что все меши, которые будут участвовать в создании карт освещения, имеют корректные UV координаты. Проще всего выбрать опцию ____Generate Lightmap UVs____ в настройках импорта меша.
  2. Во вкладке Object, отметьте любой Mesh Renderer, Skinned Mesh Renderer, или Terrain как ____static____ – это скажет Unity, что эти объекты будут неподвижны и не будут изменяться, таким образом к ним смогут применяться карты освещения.
  1. Для управления разрешением карт освещения, перейдите во вкладку ____Bake____, и отрегулируйте значение ____Resolution____ (для лучшего понимания того, как вы тратите тексели в картах освещения, посмотрите на маленькое окно ____Lightmap Display____ в Scene View, и выберите ____Show Resolution____).
  1. Press Bake
  2. В строке состояния Unity в нижнем правом углу появится полоса прогресса.
  3. Когда запекание будет завершено, вы сможете увидеть все готовые карты освещения внизу окна Lightmap Editor.

Scene View и Game View будут обновлены — теперь ваша сцена оснащена картами освещения!

Настройка запекания карт освещения

Окончательный вид вашей сцены зависит во многом от настройки освещения и настроек запекания карт освещения. Рассмотрим для примера некоторые основные настройки, которые помогут улучшить качество освещения.

This is a basic scene with a couple of cubes and one point light in the centre. The light is casting hard shadows and the effect is quite dull and artificial.


Selecting the light and opening the Object pane of the Lightmapping window exposes Shadow Radius and Shadow Samples properties. Setting Shadow Radius to 1.2, Shadow Samples to 100 and re-baking produces soft shadows with wide penumbra - our image already looks much better.


В Unity Pro можно сделать ещё один шаг вперёд, активировав Global Illumination (глобальное освещение) и добавив Sky Light (свет от небесного свода). Во вкладке Bake задайте параметру Bounces значение 1, а параметру Sky Light Intensity — значение 0.5. В результате получится намного болеее мягкое освещение с эффектами смешивания — намного красивее, и это всего лишь три куба и один источник света!


Подробности о картах освещения

Для получения подробностей о различных настройках, связанных с картами освещения, смотрите in-depth description of lightmapping in Unity.

Читайте также: