Come posso fare terreni estremamente enormi in Unity? Sembra che posso impostare larghezza e lunghezza su valori grandi. Ma la risoluzione di Heightmap arriva solo a 4097 e la risoluzione di dettaglio arriva solo a 4048.
Qualche idea?
Come posso fare terreni estremamente enormi in Unity? Sembra che posso impostare larghezza e lunghezza su valori grandi. Ma la risoluzione di Heightmap arriva solo a 4097 e la risoluzione di dettaglio arriva solo a 4048.
Qualche idea?
Risposte:
Dividi il terreno in "blocchi" quadrati, carica quelli che ti interessano (principalmente: quelli vicino alla telecamera attualmente attiva) in Update () e - se sei a corto di spazio (probabilmente lo sarai), scarica quelli non necessari lontano .
Usa modelli low-poly pre-calcolati per LoD di terreni lontani, a meno che non ti dispiaccia avere una distanza di visione bassa. Inoltre, se hai bisogno della mappa di altezza del terreno di un terreno lontano per qualsiasi cosa (come il movimento NPC o qualche altra simulazione), crea una variante a bassa o variabile risoluzione del tuo terreno da tenere in memoria; non utilizzare i dati del terreno completo per questo. Questo può essere fatto automaticamente al caricamento del gioco, ma in genere è meglio creare uno strumento che crei questi dati pre-generati durante la compilazione o il pacchetto.
Infine: per evitare problemi di precisione in virgola mobile, dovrai riposizionare l'intera scena ogni volta che la tua fotocamera principale si sposta lontano da (0,0f, 0,0f, 0,0f).
Domanda forse pertinente su Unity Answers http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html
Dovrai rompere i terreni in pezzi, ad es. diversi terreni più piccoli. Avrai bisogno di 'cucire' quei due di nuovo (con una sceneggiatura) in modo che non ci siano 'buchi' tra loro, ma altrimenti puoi semplicemente iniziare a farli subito.
Potresti anche sapere che da Unity3D ~ 3.0 non puoi spostare oggetti (leggi terreni e oggetti) troppo lontano (come +/- 100000 passi IIRC), quindi questo influenzerà la dimensione massima del tuo mondo.
Lo sto usando comunque nel mio gioco di ruolo online (con l'eccezione che utilizzo Unity3D solo per la progettazione di livelli, non per il gioco reale).
Solo perché sono curioso, vorresti condividere alcune informazioni sul tuo gioco (come avanzamento, tipo, grafica, stile ecc.)?
Abbiamo implementato enormi terreni in Unity5 elaborando i dati SRTM per l'intera terra in mappe di altezza per TerrainData
oggetti con diversi livelli di dettagli [1]. Ci sono un paio di cose da considerare:
I bordi delle mappe di altezza devono sovrapporsi di almeno un campione e devi posizionare i tuoi terreni di conseguenza. Terrain.SetNeighbors
non collegherà la mesh, tiene conto solo dei diversi livelli di dettaglio eseguiti da Unity.
È necessario necessariamente 2 ^ n + 1 campioni di altezza per TerrainData
oggetto, altrimenti Unity assegnerà solo un'altezza di 0 alle parti non impostate.
Se hai meno di 2 GB di TerrainData
, puoi cavartela come risorse in una cartella di risorse e Resource.Load
in fase di esecuzione. Se hai più di 2 GB questo approccio non funzionerà più perché non possono esserci più di 2 GB di risorse con build Unity. In questo caso dovrai creare AssetBundles e caricarli in modo asincrono con l' WWW
oggetto. Questo ha l'effetto collaterale indesiderato di chiamare Shader.Parse
ciascuno con un overhead di circa 500ms. L'ho segnalato sui forum [2] e sto ancora aspettando una risposta. Alla fine invierò una segnalazione di bug.
Non pensare all'utilizzo AssetDatabase.LoadAssetAtPath
, è disponibile solo nell'editor e non nelle build di Unity.
[1] https://www.youtube.com/watch?v=2UsyVuWoFbQ
[2] http://forum.unity3d.com/threads/shader-parse-delays-loading-of-assetbundle-contain-no-shader 0,358,235 mila /
Esistono soluzioni di terze parti.
questo codice può creare terreni con una larghezza di 99.999 metri, le montagne sono qualsiasi formula di rumore, ma se vuoi puoi mescolare 100 formule di rumore in una mappa. ad esempio, in questo terreno, il numero totale di triangoli disponibili in una mappa è compreso tra 66 milioni, bassa risoluzione e 200 milioni di media risoluzione. ecco una mappa triangolare di 66 milioni, in cui i triangoli di 0,7 milioni vengono aggiornati attorno alla telecamera. terreni giganti per giocatore di unità, WASD e spazio
Consiglierei di caricare il terreno in pezzi. Usando terreni più piccoli, e forse il tuo script potrebbe verificare se ti trovi in una certa vicinanza al tuo terreno usando transform.position - terrain.transform.position. In realtà ho scritto un post sul blog su come ottimizzare il tuo gioco nel suo insieme e ho parlato del caricamento dei blocchi. Spero che sia di aiuto.