Как сделать ландшафт в юнити
Перейти к содержимому

Как сделать ландшафт в юнити

  • автор:

Создание и редактирование terrain’ов

Вы можете добавить объект terrain’а в сцену, выбрав GameObject > Create Other > Terrain из меню (это также добавит соответствующий ассет terrain’а в окно Project). При этом, ландшафт изначально будет ничем иным, как просто большой, плоской равниной. Однако, если вы посмотрите на инспектор при выделенном объекте terrain’а, вы увидите, что там представлен ряд инструментов, которые вы можете использовать для создания любых нужных вам ландшафтов.

Инструменты редактирования terrainа, появившиеся в инспекторе

За исключением инструмента размещения деревьев и панели настроек, все остальные инструменты на панели инструментов обеспечивают набор “кистей” и настроек для размера и прозрачности кисти. То что, эти кисти похожи на кисти из графических редакторов — не совпадение, т.к. именно так создаются детали у terrain’а, с помощью их “рисования” на ландшафте. Если вы выберете первый слева инструмент на панели инструментов (Raise/Lower Terrain) и передвинете мышь над terrain’ом в окне Scene, вы увидите, что курсор напоминает прожектор на поверхности. Кликая кнопку мыши, вы можете нарисовать постепенные изменения в высоте ландшафта в точке расположения мышки. Вы можете менять форму кисти в панели Brushes. Опции Brush Size и Opacity влияют на область кисти и силу “нажима” соответственно.

Подробное описание для каждого из инструментов можно найти в соответствующих разделах. Однако, все они основаны на концепте рисования деталей и, за исключением инструмента размещения деревьев, все они имеют одинаковые настройки кистей, размер кисти и “нажим”. Инструменты можно использовать для изменения высоты terrain’а, для добавления окраски, для размещения растительности и других объектов.

Быстрые клавиши terrain’а

Вы можете использовать следующие сочетания клавиш в инспекторе terrain’а:-

  • Нажатия на клавиши от Q до Y с зажатой клавишей shift выбирают соответствующий инструмент (например, Shift-Q выбирает инструмент Raise/Lower).
  • Запятая (,) и точка (.) циклично переключают доступные кисти.
  • Shift-запятая (<) и Shift-точка (>) циклично переключают доступные объекты для деревьев, текстур и деталей.

Кроме того, стандартная клавиша F работает несколько иначе для terrain’ов. Обычно, она показывает в кадре окна Scene выбранный объект, если мышка располагается в окне Scene. Однако, так как terrain’ы обычно очень крупные объекты, нажатие F будет фокусировать вид окна Scene на области terrain’а, над которой в данный момент находится мышь/кисть. Это обеспечивает очень быстрый и интуитивный способ перепрыгивания к области terrain’а, которую вы желаете отредактировать. Если вы нажимаете F, когда мышка удалена от объекта terrain, клавиша работает в обычном режиме, как описано выше.

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

Технологичная помощь

Создание ландшафтной местности в игровых движках всегда требует большого объема работ и затрат времени, тем более если вы пытаетесь создать ландшафт с какой-нибудь реальной местности. Для упрощения этих работ в 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

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

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

На этом все удачных проектов.

�� Видео

Создаем землю, ландшафт (terrain) в Unity 3D #3 Скачать

Создаем землю, ландшафт (terrain) в Unity 3D #3

Unity 5,уроки для новичков,создание ландшафта,как создать лес Скачать

Unity 5,уроки для новичков,создание ландшафта,как создать лес

Как создать Terrain в Unity? Скачать

Как создать Terrain в Unity?

Unity 3D. Создание ландшафта. Terrain. Скачать

Unity 3D. Создание ландшафта. Terrain.

Unity terrain. Как создавать ландшафт в unity3d. Скачать

Unity terrain. Как создавать ландшафт в unity3d.

Уроки Unity / Как сделать ландшафт (terrain) Скачать

Уроки Unity / Как сделать ландшафт (terrain)

ЛАНДШАФТ за 5 МИНУТ! | UNREAL ENGINE | СОЗДАНИЕ ЛАНДШАФТА Скачать

ЛАНДШАФТ за 5 МИНУТ! | UNREAL ENGINE | СОЗДАНИЕ ЛАНДШАФТА

Земля и окружение в Unity | Выживание #1 Скачать

Земля и окружение в Unity | Выживание #1

Создавайте красивые ландшафты в UNITY 2019 — Новые инструменты для создания террейна Скачать

Создавайте красивые ландшафты в UNITY 2019 - Новые инструменты для создания террейна

Реальный ландшафт в игре — Unreal Engine (UE4, UE5) Скачать

Реальный ландшафт в игре - Unreal Engine (UE4, UE5)

Генератор ландшафта #1 — Создание 2D (PixelArt) RPG в Unity #5 Скачать

Генератор ландшафта #1 - Создание 2D (PixelArt) RPG в Unity #5

Как сделать красивый Terrain в Unity 3D // Легко и быстро Скачать

Как сделать красивый Terrain в Unity 3D // Легко и быстро

Blender GIS или создаем ландшафт и город с помощью карт Google Скачать

Blender GIS или создаем ландшафт и город с помощью карт Google

Как сделать игру на Unity 5 #27 Создание деревьев Скачать

Как сделать игру на Unity 5 #27 Создание деревьев

Процедурная генерация карт в Unity. Алгоритм diamond-square Скачать

Процедурная генерация карт в Unity. Алгоритм diamond-square

Создание ландшафта при помощи Google Maps и карты высот Скачать

Создание ландшафта при помощи Google Maps и карты высот

Unity 3D — Создание оптимизированного Terrain( Редактирование ландшафта, его параметры) Скачать

Unity 3D - Создание оптимизированного Terrain( Редактирование ландшафта, его параметры)

Создание ландшафта Terrain в Unity. #13 Скачать

Создание ландшафта Terrain в Unity. #13

Unity урок по генерации ландшафта Скачать

Unity урок по генерации ландшафта

Unity — прорисовка ландшафта Скачать

Создание террейна в Unity 3D

Отличительной чертой Unity является его гибкость, адаптивность к разработке как небольших 2D-паззлов или аркад, так и к разработке больших-серьезный стратегий, RPG или игр других жанров. В то же время, одной из парадигм Unity является простота освоения и удобство работы.

Создание ландшафта в Unity сравнимо с работой в редакторе ландшафта Warcraft 3. Немногим сложнее, зато предоставляются возможности по созданию действительной красивых ландшафтов.

Часть первая. С чего начать?

Начать следует, конечно, с установки и запуска редактора.
Процесс установки пропустим, так как он не вызовет затруднений ни у кого.
Итак, редактор запущен. Создаем или загружаем проект, в котором предстоит делать ландшафт. Если вы уверены, что не используете никаких ассетов с графикой, то следует выбрать ассет Environment из стандартной комплектации.
Следующее действие — добавить в проект этот самый «террейн», который будем создавать.
Для этого в верхнем (главном) меню выбираем GameObjects — > 3D Objects — > Terrain.

Появляется непонятный грязновато-белый квадрат с сеткой.
Выбираем новосозданный террейн на панели иерархии сцены (слева). Там же его можно переименовать, копировать, или удалить, но это не то, что нам нужно для создания. Итак, после этого в инспекторе (панель справа от сцены или вкладка. Кстати, её можно перетаскивать, чтобы расположить так, как вам удобно) появится символическое изображение стилизованного кубика как земля в майнкрафте с подписью террейн и несколькими инструментами.

Эта панелька будет с нами до конца статьи

Часть вторая. И что это за кнопки?

Первый инструмент, на иконке которого изображены горы со стрелочкой вверх (и который выделен на рисунке бирюзовым)- это создание неровностей. Им можно создавать возвышения (кликнув на террейне в нужном месте) или впадины (то же самое, но с зажатым шифтом).
Обратите внимание , что для получения эффекта нужно настроить кисть — её форму, размер и «силу» (Opacity — непрозрачность).
Обратите внимание также, что для создания полноценных впадин террейн нужно сначала поднять. В противном случае ландшафт лишь выровняется до минимального уровня.
В этом уроке не будет рекомендаций по созданию красивого ландшафта. Не будет даже советов по использованию созданного ландшафта. Цель урока — помочь освоиться с базовыми функциями редактора и, может быть, помочь преодолеть так называемый «ступор незнакомого интерфейса», возникающий у многих людей при запуске незнакомой программы или знакомой с изменившимся интерфейсом.

Наверняка после недолгих экспериментов вы получили некие резкие перепады высот, которые смотрятся «не очень». Для их устранения нам поможет Smooth terrain, расположенный справа через одну. Выглядит он как всё та же горка с каплей воды рядом (На рисунке выделен желтым). Это отнюдь не создание воды, как может показаться. Это сглаживание.
Левее, кстати, расположен инструмент для создания плато ( выделен зеленым ) — он выравнивает высоту. Для захвата необходимой высоты зажимаем Shift, после чего «рисуем» плато без зажатого шифта.
Следующие инструменты позволяют наложить на ландшафт текстуры, расположить деревья и декорации. Последняя кнопка на этой панели — настройки.

Для добавления текстуры (иконка — кисть, выделена красным ), нужно сначала добавить тайлы. Ниже настроек кистей будет панель текстур. Нажимаем Edit textures — > Add texture и подбираем нужную (и как Normal, и как Smoothness) из списка предложенных (к слову, их можно добавлять самостоятельно, но об этом в другой раз). Для наглядности можно создать первой текстурой GrassRockyAlbedo, а второй — GrassHillAlbedo, после чего поэкспериментировать с настройками кисти и текстуры, порисовав травой.
Преимуществом Unity является обилие кистей и довольно высокая гибкость их настроек, что после небольшой практике позволяет с легкостью создавать интересные ландшафты с минимумом усилий.

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

Также, на панельке можно найти кнопку «Mass Place Trees«, которая позволяет заполнить весь террейн указанным количеством деревьев.
Последний инструмент ( выделен синей рамкой) — расположение деталей, то есть всяческих украшений, вроде травы. Опять же, в изначальной поставке их не то, чтобы много.
К примеру, выбираем Edit Details -> Add Grass Texture и выбираем текстуру GrassFrond01AlbedoAlpha после чего испытываем её кистью.

Заключение

Создание ландшафта в Unity3D — это не трудно. Конечно, использование Unity не гарантирует запредельный уровень графики без приложения каких-либо усилий, да и модели и текстуры, вероятно, придется делать самостоятельно или с привлечением художников и 3D-артистов, искать в сети, либо покупать. Охватить все тонкости в рамках одной статьи решительно невозможно. Более того, статья рассматривает лишь одну грань работы с Unity.

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

Генерация ландшафтов в Unity3d

Думаю все заметили, что сейчас стало появляться множество всяких бродилок с выживанием в стиле Minecraft. Сделать такую решился и я. Начало было лёгким — Unity3d имеет огромный функционал для сознания простеньких игр (и не только). Персонаж, игровые объекты, в общем основу сделать быстро. Но какой minecraft без рандомно генерируемого мира? Это стало первой трудной задачей. И думаю не только для меня. Просмотрев весь гугл и потратив кучу времени на эту бесполезную вещь я решил написать эту статью дабы сократить страдания других.

Дальше вас ждёт описание алгоритмов (и код) создания более менее реалистичных ландшафтов. Уточню, что все примеры на C#.

План действия

Для начала хорошо бы было разобраться, что подразумевается под генерацией ландшафта:

  1. Генерация карты высот. Это самая главная часть, по карте высот строится terrain (или mesh). Её можно также использовать для окрашивания terrain в зависимости от высоты
    и для расстановки игровых объектов.
  2. Построение ландшафта. Есть два способа выполнения этого пункта, в зависимости от того не хотите ли вы сложностей и используете ли вы unity3d, или же вам плевать на производительность, но вам важно, чтоб было красиво. В первом случае советую использовать встроенный в unity3d редактор ландшафта (terrain).
    Простенький код для этого:

 Terrain terrain = FindObjectOfType (); // Находи наш terrain float[,] heights = new float[resolution,resolution]; // Создаём массив вершин // . // Делаем с heights всё, что хотим // . terrain.terrainData.size = new Vector3(width,height,length); // Устанавливаем размер нашей карты terrain.terrainData.heightmapResolution = resolution; // Задаём разрешение (кол-во высот) terrain.terrainData.SetHeights(0, 0, heights); // И, наконец, применяем нашу карту высот (heights) 
Shader "Custom/TerrainShader" < Properties < _HTex ("heightMap texture", 2D) = "white" <>_GTex ("grass texture", 2D) = "white" <> _RTex ("rock texture", 2D) = "white" <> > SubShader < Tags < "RenderType"="Opaque" >LOD 2048 CGPROGRAM #pragma surface surf Lambert sampler2D _GrassTex; sampler2D _RockTex; sampler2D _HeightTex; struct Input < float2 uv_GTex; float2 uv_RTex; float2 uv_HTex; >; void surf (Input IN, inout SurfaceOutput o) < float4 grass = tex2D(_GTex, IN.uv_GTex); float4 rock = tex2D(_RTex, IN.uv_RTex); float4 height = tex2D(_HTex, IN.uv_HTex); o.Albedo = lerp(grass, rock, height); >ENDCG > FallBack "Diffuse" > 

Итак, поняв общий план действий, надо приступать к делу.

Частые ошибки

С самого начала я думал, что всё будет очень просто и для рандомной генерации ландшафта можно обойтись обычной функцией Random(). Но это самый неправильный способ. Его результат это вовсе не красивая карта, а расчёска в приближении.

Шум Перлина

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

Perlin noise (Шум Перлина, также иногда Классический шум Перлина) — математический алгоритм по генерированию процедурной текстуры псевдо-случайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использоваться для генерации эффектов дыма, тумана и т.д.

Думаю многих испугала приставка псевдо, но от неё легко избавиться. Далее представлен способ реализации шума в Unity3d:

 using UnityEngine; using System.Collections; public class PerlinNoisePlane : MonoBehaviour < public float power = 3.0f; public float scale = 1.0f; private Vector2 startPoint = new Vector2(0f, 0f); void Start () < MakeNoise (); >void MakeNoise() < MeshFilter mf = GetComponent(); // Ищем mesh Vector3[] vertices = mf.mesh.vertices; // Получаем его вершины for (int i = 0; i < vertices.Length; i++) < float x = startPoint.x + vertices[i].x * scale; // X координата вершины float z = startPoint.y + vertices[i].z * scale; // Z координата вершины vertices[i].y = (Mathf.PerlinNoise (x, z) - 0.5f) * power; // Задаём высоту для точки с вышеуказанными координатами >mf.mesh.vertices = vertices; // Присваиваем вершины mf.mesh.RecalculateBounds(); // Обновляем вершины mf.mesh.RecalculateNormals(); // Обновляем нормали > > 

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

Алгоритм diamond-square

После долгих часов скитаний по интернету наткнулся на этот алгоритм, и он оправдал все мои ожидания. Он даёт прекрасные результаты. Для расчитывания вершин есть очень простая формула.
Представим себе плоскость, её 4 вершины и точку по центру. Её высота будет равна сумме высот 4 вершин, делённая на их кол-во и некого случайного числа с коэффициентом. Вот код для unity3d (халява копи-пастерам):

using UnityEngine; using System.Collections; public class TerrainGenerator : MonoBehaviour < public float R; // Коэффициент скалистости public int GRAIN=8; // Коэффициент зернистости public bool FLAT = false; // Делать ли равнины public Material material; private int width=2048; private int height=2048; private float WH; private Color32[] cols; private Texture2D texture; void Start () < int resolution = width; WH = (float)width+height; // Задаём карту высот Terrain terrain = FindObjectOfType(); float[,] heights = new float[resolution,resolution]; // Создаём карту высот texture = new Texture2D(width, height); cols = new Color32[width*height]; drawPlasma(width, height); texture.SetPixels32(cols); texture.Apply(); // Используем шейдер (смотри пункт 3 во 2 части) material.SetTexture ("_HeightTex", texture); // Задаём высоту вершинам по карте высот for (int i=0; i > // Применяем изменения terrain.terrainData.size = new Vector3(width, width, height); terrain.terrainData.heightmapResolution = resolution; terrain.terrainData.SetHeights(0, 0, heights); > // Считаем рандомный коэффициент смещения для высоты float displace(float num) < float max = num / WH * GRAIN; return Random.Range(-0.5f, 0.5f)* max; >// Вызов функции отрисовки с параметрами void drawPlasma(float w, float h) < float c1, c2, c3, c4; c1 = Random.value; c2 = Random.value; c3 = Random.value; c4 = Random.value; divide(0.0f, 0.0f, w , h , c1, c2, c3, c4); >// Сама рекурсивная функция отрисовки void divide(float x, float y, float w, float h, float c1, float c2, float c3, float c4) < float newWidth = w * 0.5f; float newHeight = h * 0.5f; if (if (w < 1.0f && h < 1.0f)) < float c = (c1 + c2 + c3 + c4) * 0.25f; cols[(int)x+(int)y*width] = new Color(c, c, c); >else < float middle =(c1 + c2 + c3 + c4) * 0.25f + displace(newWidth + newHeight); float edge1 = (c1 + c2) * 0.5f; float edge2 = (c2 + c3) * 0.5f; float edge3 = (c3 + c4) * 0.5f; float edge4 = (c4 + c1) * 0.5f; if(!FLAT)< if (middle else if (middle > 1.0f) < middle = 1.0f; >> divide(x, y, newWidth, newHeight, c1, edge1, middle, edge4); divide(x + newWidth, y, newWidth, newHeight, edge1, c2, edge2, middle); divide(x + newWidth, y + newHeight, newWidth, newHeight, middle, edge2, c3, edge3); divide(x, y + newHeight, newWidth, newHeight, edge4, middle, edge3, c4); > > > 

Материалы по теме
  • Realtime Procedural Terrain Generation (PDF). Очень ценный документ, где рассказано всё про генерацию ландшафтов. Единственный минус — на английском
  • Статья про фрактальные ландшафты
  • Отличная статья про шум Перлина
  • Вики про diamond-square

Добавить комментарий

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