Como posso criar terrenos enormes no Unity?


Respostas:


21

Divida o terreno em "pedaços" quadrados, carregue os que mais lhe interessam (principalmente: os que estão próximos à câmera atualmente ativa) na Atualização () e - se você precisar de espaço (provavelmente será), descarregue os que não são necessários longe .

Use modelos de baixo poli pré-calculados para LoD em terrenos distantes, a menos que você não se importe em ter uma distância de visão baixa. Além disso, se você precisar do mapa de altura do terreno distante para qualquer coisa (como movimento do NPC ou alguma outra simulação), crie uma variante de baixa resolução ou resolução variável do seu terreno para manter na memória; não use os dados completos do terreno para isso. Isso pode ser feito automaticamente no carregamento do jogo, mas geralmente é uma idéia melhor criar uma ferramenta que crie esses dados pré-gerados durante a compilação ou pacote.

Finalmente: para evitar problemas de precisão de ponto flutuante, você terá que reposicionar a cena inteira toda vez que a câmera principal se afastar (0.0f, 0.0f, 0.0f).

Pergunta possivelmente relevante sobre o Unity Answers http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html


Obrigado! Ótima resposta. Apenas uma pergunta, quando eu definir os vizinhos dos terrenos, o que aconteceria se os terrenos não estivessem na mesma altura nas bordas?
Daniel Pendergast

1
@ Dan: Você terá buracos na paisagem. Existem diferentes maneiras de lidar com isso, mais ou menos ao longo das linhas de "verifique se a paisagem tem a mesma altura nas bordas", "adicione saias que correm verticalmente das bordas para baixo, para alguma altura, para mascarar os buracos" e "adicione faixas triangulares geradas" costurar os orifícios ". Qual você usa depende de você (e do mecanismo, em parte). O segundo, com as saias, é o que eu mais vejo.
Martin Sojka

1
ou como eu disse, você gostaria de usar um script para costurar os terrenos :-)
Valmond

Alguém tem algum script?
precisa

@ Dan: Existem alguns scripts no link do Unity Answers na resposta. Além disso, não posso ajudá-lo com o código do Unity no momento, toda a minha programação de jogos (no nível do hobby) é feita com o Ogre3D como o mecanismo de renderização.
Martin Sojka

3

Você precisará dividir os terrenos em pedaços, ie. vários terrenos menores. Você precisará "costurar" esses objetos novamente (com um script) para que não haja "buracos" entre eles, mas, caso contrário, você pode começar a fazê-los imediatamente.

Você também pode querer saber que, desde o Unity3D ~ 3.0, você não pode mover itens (leia terrenos e itens) muito longe (como +/- 100000 etapas IIRC), portanto isso influenciará o tamanho máximo do seu mundo.

De qualquer maneira, estou usando isso no meu jogo de RPG online (com a exceção de que eu só uso o Unity3D para design de níveis, não para o jogo real).

Só porque estou curioso, gostaria de compartilhar algumas informações sobre o seu jogo (como avanço, tipo, gráficos, estilo etc.)?


2

Implementamos terrenos enormes no Unity5, processando dados SRTM para toda a Terra em mapas de altura para TerrainDataobjetos com diferentes níveis de detalhes [1]. Há algumas coisas a considerar:

  1. As próprias bordas dos mapas de altura precisam se sobrepor por pelo menos uma amostra e você precisa posicionar seus terrenos de acordo. Terrain.SetNeighborsnão conectará a malha, apenas levará em conta os diferentes níveis de detalhes realizados pelo Unity.

  2. Você, necessariamente, precisa de 2 ^ n + 1 amostras de altura por TerrainDataobjeto; caso contrário, o Unity atribuirá apenas uma altura de 0 às partes não configuradas.

  3. Se você tiver menos de 2 GB TerrainData, poderá usá-los como Ativos em uma pasta Recurso e Resource.Loadem tempo de execução. Se você tiver mais de 2 GB, essa abordagem não funcionará mais, pois não poderá haver mais de 2 GB de recursos com as compilações do Unity. Nesse caso, você precisará criar AssetBundles e carregá-los de forma assíncrona com o WWWobjeto. Isso tem o efeito colateral indesejado de chamar Shader.Parsecada um com uma sobrecarga de aproximadamente 500ms. Eu relatei isso nos fóruns [2] e ainda estou esperando uma resposta. Vou enviar um relatório de erro eventualmente.

  4. Não pense em usar AssetDatabase.LoadAssetAtPath, ele está disponível apenas no editor e não nas compilações do Unity.

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


0

Existem soluções de terceiros.

esse código pode criar terrenos com 99.999 metros de largura, as montanhas são quaisquer fórmulas de ruído, mas você pode misturar 100 fórmulas de ruído em um mapa, se desejar. por exemplo, nesse terreno, o número total de triângulos disponíveis em um mapa está entre 66 milhões, baixa resolução e 200 milhões de resolução média. Aqui está um mapa de 66 milhões de triângulos, em que triângulos de 0,7 milhão são atualizados ao redor da câmera. terreno gigante unityplayer, WASD e espaço


Existe código fonte para isso? Tudo o que vejo é um jogo de plugins de unidade.
AttackingHobo

Eu tenho o código fonte, demorei um tempo para escrever. estou no ant d0t stewart no yahoo d0t com
com.prehensible

0

Eu recomendaria carregar o seu terreno em pedaços. Usando terrenos menores, e talvez seu script possa verificar se você está em uma certa proximidade do terreno usando transform.position - terrain.transform.position. Na verdade, escrevi um post sobre como otimizar seu jogo como um todo e falei sobre o carregamento de blocos. Espero que isto ajude.


Observe que este conselho já está presente na resposta aceita por Martin Sojka de 6 anos atrás. Se você deseja compartilhar um link relevante, um comentário sobre essa resposta pode ser mais apropriado.
DMGregory

No futuro eu irei. Obrigado. Eu ainda sou novo para postar em troca de pilha :)
Hudson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.