Come posso fare enormi terreni in Unity?


Risposte:


21

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


Grazie! Bella risposta. Solo una domanda, quando imposto i vicini dei terreni, cosa accadrebbe se i terreni non fossero alla stessa altezza sui bordi?
Daniel Pendergast,

1
@ Dan: otterrai buchi nel paesaggio. Esistono diversi modi per gestirlo, approssimativamente lungo le linee di "assicurati che il paesaggio abbia la stessa altezza ai bordi", "aggiungi gonne che scorrono verticalmente dai bordi verso il basso per una certa altezza per mascherare i fori" e "aggiungi strisce triangolari generate per ricucire i fori ". Quale utilizzi dipende da te (e dal motore, in parte). Il secondo, con le gonne, è quello che ho visto più spesso.
Martin Sojka,

1
o come ho detto, ti piacerebbe usare una sceneggiatura per
cucire

Qualcuno ha degli script?
Daniel Pendergast,

@Dan: ci sono alcuni script nel link Unity Answers nella risposta. Oltre a ciò, al momento non posso aiutarti con il codice di Unity, tutta la mia programmazione di gioco (a livello di hobby) viene eseguita con Ogre3D come motore di rendering.
Martin Sojka,

3

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.)?


2

Abbiamo implementato enormi terreni in Unity5 elaborando i dati SRTM per l'intera terra in mappe di altezza per TerrainDataoggetti con diversi livelli di dettagli [1]. Ci sono un paio di cose da considerare:

  1. I bordi delle mappe di altezza devono sovrapporsi di almeno un campione e devi posizionare i tuoi terreni di conseguenza. Terrain.SetNeighborsnon collegherà la mesh, tiene conto solo dei diversi livelli di dettaglio eseguiti da Unity.

  2. È necessario necessariamente 2 ^ n + 1 campioni di altezza per TerrainDataoggetto, altrimenti Unity assegnerà solo un'altezza di 0 alle parti non impostate.

  3. Se hai meno di 2 GB di TerrainData, puoi cavartela come risorse in una cartella di risorse e Resource.Loadin 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' WWWoggetto. Questo ha l'effetto collaterale indesiderato di chiamare Shader.Parseciascuno 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.

  4. 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 /


0

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


Esiste un codice sorgente per quello? Tutto quello che vedo è un gioco di plugin di unità.
Attaccando

ho il codice sorgente, mi ci è voluto un po 'di tempo per scrivere. sono alla formica d0t stewart a yahoo d0t com
com.prehensible

0

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.


Si noti che questo consiglio è già presente nella risposta accettata da Martin Sojka di 6 anni fa. Se desideri semplicemente condividere un link pertinente, un commento su quella risposta potrebbe essere più appropriato.
DMGregory

In futuro lo farò. Grazie. Sono ancora nuovo a pubblicare post in cambio di stack :)
Hudson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.