Как я могу сделать огромные территории в Unity?

19

Как я могу сделать чрезвычайно огромные территории в Unity? Кажется, я могу установить ширину и длину для больших значений. Но разрешение карты высот достигает только 4097, а разрешение деталей - только до 4048.

Есть идеи?

Даниэль Пендергаст
источник
Я извиняюсь за то , что buzzkill: sol.gfxile.net/mmorpg.html
Nailer

Ответы:

21

Разделите местность на квадратные «куски», загрузите те, которые вам интересны (в основном: те, которые находятся рядом с активной в данный момент камерой) в Update () и - если вы ограничены в пространстве (вероятно, так и будет), выгрузите ненужные из них далеко ,

Используйте заранее рассчитанные низкополигональные модели для LoD на дальнем ландшафте, если только вы не возражаете против небольшого расстояния обзора. Кроме того, если вам нужна карта высот местности для далекой местности (например, перемещение NPC или другое моделирование), создайте вариант ландшафта с низким или переменным разрешением, чтобы сохранить его в памяти; не используйте полные данные местности для этого. Это может быть сделано автоматически при загрузке игры, но обычно лучше создать инструмент, который создает эти предварительно сгенерированные данные во время сборки или пакета.

Наконец: чтобы избежать проблем с точностью с плавающей запятой, вам придется перемещать всю сцену каждый раз, когда ваша основная камера перемещается далеко от (0,0f, 0,0f, 0,0f).

Возможно актуальный вопрос по Unity ответы http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html

Мартин Сойка
источник
Спасибо! отличный ответ. Только один вопрос, когда я устанавливаю соседей по рельефу, что произойдет, если рельеф не будет одинаковой высоты по краям?
Даниэль Пендергаст
1
@Dan: Вы получите дыры в ландшафте. Есть разные способы справиться с этим, примерно по линиям «убедитесь, что ландшафт имеет одинаковую высоту по краям», «добавить юбки, идущие вертикально от краев вниз для некоторой высоты, чтобы замаскировать отверстия» и «добавить сгенерированные треугольные полосы чтобы сшить отверстия вместе. " Какой из них вы используете, зависит от вас (и от двигателя, частично). Второй, с юбками, это тот, который я видел чаще всего.
Мартин Сойка
1
или, как я уже сказал, вы хотели бы использовать сценарий для сшивания местности :-)
Valmond
У кого-нибудь есть какие-нибудь сценарии?
Даниэль Пендергаст
@Dan: Есть несколько сценариев по ссылке «Ответы Unity» в ответе. Кроме того, в настоящий момент я не могу помочь вам с кодом для Unity, все мое программирование (на уровне хобби) выполняется с Ogre3D в качестве движка рендеринга.
Мартин Сойка
3

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

Вы также можете знать, что начиная с Unity3D ~ 3.0, вы не можете перемещать предметы (читать местности и предметы) слишком далеко (например, +/- 100000 шагов IIRC), так что это повлияет на максимальный размер вашего мира.

В любом случае, я использую это в своей онлайн-игре RPG (за исключением того, что я использую Unity3D только для дизайна уровней, а не для реальной игры).

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

Valmond
источник
2

Мы реализовали огромные ландшафты в Unity5, обработав данные SRTM для всей Земли в карты высот для TerrainDataобъектов с различными уровнями детализации [1]. Есть несколько вещей для рассмотрения:

  1. Сами края карт высот должны перекрываться как минимум на одну выборку, и вам необходимо соответствующим образом расположить свою местность. Terrain.SetNeighborsне будет соединять сетку, только учитывать различные уровни детализации, выполняемые Unity.

  2. Вам обязательно нужно 2 ^ n + 1 выборка высоты на TerrainDataобъект, в противном случае Unity просто назначит высоту 0 неустановленным частям.

  3. Если у вас менее 2 ГБ TerrainData, вы можете избежать использования их в качестве ресурсов в папке ресурсов и Resource.Loadих во время выполнения. Если у вас более 2 ГБ, этот подход больше не будет работать, поскольку в сборках Unity не может быть более 2 ГБ ресурсов. В этом случае вам нужно будет собрать AssetBundles и асинхронно загрузить их вместе с WWWобъектом. Это приводит к нежелательному побочному эффекту вызова Shader.Parseдля каждого с накладными расходами приблизительно 500 мс. Я сообщил об этом на форумах [2] и все еще жду ответа. Я представлю сообщение об ошибке в конце концов.

  4. Не думайте об использовании AssetDatabase.LoadAssetAtPath, оно доступно только в редакторе, а не в сборках Unity.

[1] https://www.youtube.com/watch?v=2UsyVuWoFbQ
[2] http://forum.unity3d.com/threads/shader-parse-delays-loading-of-assetbundle-contained-no-shader 0,358235 /

sradomski
источник
0

Есть сторонние решения.

этот код может создавать ландшафты шириной 99 999 метров, горы - это любые формулы шума, но вы можете смешать 100 формул шума в одну карту, если хотите. например, в этой местности общее количество треугольников, доступных на карте, составляет от 66 миллионов в низком разрешении до 200 миллионов в среднем разрешении. вот карта треугольника 66 миллионов, где 0,7 миллиона треугольников обновляются вокруг камеры. Unipplayer гигантская местность, WASD и Космос

com.prehensible
источник
Есть ли исходный код для этого? Все, что я вижу, это игра плагинов единства.
AttackingHobo
у меня есть исходный код, мне потребовалось время, чтобы написать. Я нахожусь в муравейнике Стюарта на Yahoo DOOT Com
com.prehensible
0

Я бы порекомендовал загружать вашу местность кусками. Используя меньшую территорию, и, возможно, ваш сценарий может проверить, находитесь ли вы в определенной близости от вашей местности, используя transform.position - terrain.transform.position. На самом деле я написал пост в блоге о том, как оптимизировать вашу игру в целом, и я говорил о загрузке чанка. Надеюсь это поможет.

Гудзон
источник
Обратите внимание, что этот совет уже присутствует в принятом ответе Мартина Сойки от 6 лет назад. Если вы просто хотите поделиться релевантной ссылкой, комментарий к этому ответу может быть более подходящим.
DMGregory
В будущем я буду. Спасибо. Я все еще новичок в размещении на стеке обмена :)
Гудзон