¿Cómo puedo hacer terrenos extremadamente grandes en Unity? Parece que puedo establecer el ancho y la longitud en valores grandes. Pero la resolución del mapa de altura solo sube a 4097 y la resolución de detalle solo sube a 4048.
¿Algunas ideas?
unity
optimization
terrain-rendering
terrain
heightmap
Daniel Pendergast
fuente
fuente
Respuestas:
Divida el terreno en "trozos" cuadrados, cargue los que le interesan (principalmente: los que están cerca de la cámara actualmente activa) en la Actualización () y, si tiene poco espacio (es probable que lo esté), descargue los no necesarios muy lejos .
Utilice modelos pre-calculados de bajo poli para LoD de terreno lejano, a menos que no le importe tener una distancia de visión baja. Además, si necesita el mapa de altura del terreno del terreno lejano para cualquier cosa (como el movimiento de un NPC o alguna otra simulación), cree una variante de baja resolución o resolución variable de su terreno para mantenerla en la memoria; no use los datos completos del terreno para ello. Esto se puede hacer automáticamente en la carga del juego, pero generalmente es una mejor idea hacer una herramienta que cree estos datos pregenerados durante la compilación o el paquete.
Finalmente: para evitar problemas de precisión de coma flotante, tendrá que reposicionar toda la escena cada vez que su cámara principal se aleje de (0.0f, 0.0f, 0.0f).
Pregunta posiblemente relevante sobre Unity Answers http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html
fuente
Tendrás que dividir los terrenos en trozos, es decir. Varios terrenos más pequeños. Tendrás que 'unir' esos contra uno al otro (con un guión) para que no haya 'agujeros' entre ellos, pero de lo contrario puedes comenzar a hacerlo de inmediato.
Es posible que también desee saber que desde Unity3D ~ 3.0 no puede mover elementos (leer terrenos y elementos) demasiado lejos (como +/- 100000 pasos IIRC), por lo que esto influirá en el tamaño máximo de su mundo.
De todos modos, estoy usando esto en mi juego de rol en línea (con la excepción de que solo uso Unity3D para el diseño de niveles, no para el juego real).
Solo porque tengo curiosidad, ¿te gustaría compartir información sobre tu juego (como avance, tipo, gráficos, estilo, etc.)?
fuente
Implementamos enormes terrenos en Unity5 procesando datos SRTM para toda la tierra en mapas de altura para
TerrainData
objetos con diferentes niveles de detalles [1]. Hay un par de cosas a considerar:Los bordes de los mapas de altura deben solaparse con al menos una muestra y debe colocar sus terrenos en consecuencia.
Terrain.SetNeighbors
no conectará la malla, solo tendrá en cuenta los diferentes niveles de detalle realizados por Unity.Necesitará necesariamente 2 ^ n + 1 muestras de altura por
TerrainData
objeto, de lo contrario, Unity solo asignará una altura de 0 a las partes no configuradas.Si tiene menos de 2 GB
TerrainData
, puede salirse con la suya como Activos en una carpeta de Recursos yResource.Load
en tiempo de ejecución. Si tiene más de 2 GB, este enfoque ya no funcionará, ya que no puede haber más de 2 GB de recursos con las compilaciones de Unity. En este caso, deberá compilar AssetBundles y cargarlos asincrónicamente con elWWW
objeto. Esto tiene el efecto secundario no deseado de llamarShader.Parse
a cada uno con una sobrecarga de aproximadamente 500 ms. Informé esto en los foros [2] y todavía estoy esperando una respuesta. Enviaré un informe de error eventualmente.No piense en usar
AssetDatabase.LoadAssetAtPath
, solo está disponible en el editor y no en las compilaciones de 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 /
fuente
Hay soluciones de terceros.
este código puede hacer terrenos de 99,999 metros de ancho, las montañas son fórmulas de ruido, pero puede mezclar 100 fórmulas de ruido en un mapa si lo desea. por ejemplo, en este terreno, el número total de triángulos disponibles en un mapa está entre 66 millones, baja resolución y 200 millones de resolución media. Aquí hay un mapa de 66 millones de triángulos, donde se actualizan 0,7 millones de triángulos alrededor de la cámara. Unityplayer, terreno gigante, WASD y espacio
fuente
Recomendaría cargar su terreno en trozos. Mediante el uso de terrenos más pequeños, y tal vez su script pueda verificar si está en cierta proximidad a su terreno mediante el uso de transform.position - terrenos.transform.position. De hecho, escribí una publicación de blog sobre cómo optimizar el juego en su conjunto, y hablé sobre la carga de fragmentos. Espero que esto ayude.
fuente