Як я можу зробити величезні місцевості в Unity?


19

Як я можу зробити надзвичайно величезні місцевості в Unity? Здається, я можу встановити величину ширини та довжини. Але роздільна здатність Heightmap досягає лише 4097, а роздільна здатність - до 4048.

Будь-які ідеї?


Вибачте за те, що я був buzzkill
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
або, як я вже говорив, ви хочете використовувати сценарій для
зашивання

У когось є якісь сценарії?
Даніель Пендергаст

@Dan: Є кілька сценаріїв за посиланням Unity Answers у відповіді. Крім того, на даний момент я не можу допомогти вам з кодом для Unity, все моє ігрове програмування (на рівні хобі) виконується з Ogre3D як двигуна візуалізації.
Мартін Сойка

3

Вам потрібно буде розбити місцевості по шматках, тобто. кілька менших місцевостей. Йому потрібно буде «зашивати» тих, хто перебуває один раз (із сценарієм), щоб між ними не було «дірок», але в іншому випадку ви можете просто почати робити їх відразу.

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

Я все-таки використовую це в своїй онлайн-грі RPG (за винятком того, що я використовую тільки Unity3D для рівня дизайну, а не для фактичної гри).

Просто тому, що мені цікаво, чи хотіли б ви поділитися якоюсь інформацією про вашу гру (наприклад, просування, тип, графіка, стиль тощо)?


2

Ми реалізували величезні місцевості в Unity5, обробляючи дані SRTM для всієї Землі, у карти висоти для TerrainDataоб'єктів з різними рівнями деталей [1]. Є кілька речей, які слід врахувати:

  1. Самі краї карт висоти потрібно перекривати хоча б одним зразком, і ви повинні розташовувати свої місцевості відповідно. Terrain.SetNeighborsне з'єднає сітку, лише враховуйте різні рівні деталізації, зроблені Unity.

  2. Вам, обов'язково, потрібно 2 ^ n + 1 зразка висоти на один TerrainDataоб'єкт, інакше Unity просто призначить висоті 0 нульовим частинам.

  3. Якщо у вас менше 2 Гб TerrainData, ви можете піти від того, щоб мати їх як "Активи" у папці "Ресурси" та Resource.Loadїх під час виконання. Якщо у вас більше 2 Гб, такий підхід більше не працюватиме, оскільки не може бути більше 2 ГБ ресурсів з Unity build. У цьому випадку вам потрібно буде скласти 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-contain-no-shader .358235 /


0

Є сторонні рішення.

цей код може зробити місцевості шириною 99 999 метрів, гори - будь-які формули шуму, але ви можете змішати 100 формул шуму на одній карті, якщо хочете. Наприклад, у цій місцевості загальна кількість трикутників, наявних на карті, становить від 66 до мільйонів, низької роздільної здатності та 200 мільйонів середньої роздільної здатності. ось 66-мільйонна трикутна карта, де навколо камери оновлюється 0,7 млн ​​трикутників. єдність гравця гігантського рельєфу, WASD та Space


Чи є для цього вихідний код? Все, що я бачу, - це плагін єдності.
AttackingHobo

У мене є вихідний код, щоб писати мені знадобився час. я в мурашці d0t stewart в yahoo d0t com
зрозуміло,

0

Я рекомендую завантажувати свою місцевість шматками. Використовуючи менші місцевості, і, можливо, ваш сценарій міг би перевірити, чи ви знаходитесь у певній близькості від вашої місцевості, використовуючи transform.position - terrain.transform.position. Я фактично написав допис у блозі про те, як оптимізувати свою гру в цілому, і я говорив про завантаження шматка. Сподіваюся, це допомагає.


Зауважте, що ця порада вже присутня у прийнятій відповіді від Мартіна Сойка від 6 років тому. Якщо ви просто хочете поділитися відповідним посиланням, коментар до цієї відповіді може бути більш підходящим.
DMGregory

В майбутньому я буду. Дякую. Я все ще нова у публікаціях на обміні стеками :)
Хадсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.