Como posso criar terrenos extremamente grandes no Unity? Parece que posso definir largura e comprimento para valores grandes. Mas a resolução do Mapa de Altura só sobe para 4097 e a resolução de detalhes apenas para 4048.
Alguma ideia?
Como posso criar terrenos extremamente grandes no Unity? Parece que posso definir largura e comprimento para valores grandes. Mas a resolução do Mapa de Altura só sobe para 4097 e a resolução de detalhes apenas para 4048.
Alguma ideia?
Respostas:
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
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.)?
Implementamos terrenos enormes no Unity5, processando dados SRTM para toda a Terra em mapas de altura para TerrainData
objetos com diferentes níveis de detalhes [1]. Há algumas coisas a considerar:
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.SetNeighbors
não conectará a malha, apenas levará em conta os diferentes níveis de detalhes realizados pelo Unity.
Você, necessariamente, precisa de 2 ^ n + 1 amostras de altura por TerrainData
objeto; caso contrário, o Unity atribuirá apenas uma altura de 0 às partes não configuradas.
Se você tiver menos de 2 GB TerrainData
, poderá usá-los como Ativos em uma pasta Recurso e Resource.Load
em 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 WWW
objeto. Isso tem o efeito colateral indesejado de chamar Shader.Parse
cada 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.
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 /
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
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.