¿Cómo puedo hacer grandes terrenos en Unity?

Respuestas:

21

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

Martin Sojka
fuente
¡Gracias! gran respuesta. Solo una pregunta, cuando configuro los vecinos de los terrenos, ¿qué pasaría si los terrenos no están a la misma altura en los bordes?
Daniel Pendergast
1
@Dan: Obtendrás agujeros en el paisaje. Hay diferentes maneras de lidiar con esto, más o menos a lo largo de las líneas de "asegúrese de que el paisaje tenga la misma altura en los bordes", "agregue faldas que se extienden verticalmente desde los bordes hacia abajo para cierta altura para enmascarar los agujeros" y "agregue las tiras triangulares generadas para unir los agujeros ". El que uses depende de ti (y del motor, en parte). El segundo, con las faldas, es el que vi con más frecuencia.
Martin Sojka
1
o como dije, te gustaría usar un script para
unir
¿Alguien tiene algún guión?
Daniel Pendergast
@Dan: Hay algunos scripts en el enlace de Respuestas de Unity en la respuesta. Además de eso, no puedo ayudarte con el código de Unity en este momento, toda mi programación de juegos (de nivel hobby) se realiza con Ogre3D como motor de renderizado.
Martin Sojka
3

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

Valmond
fuente
2

Implementamos enormes terrenos en Unity5 procesando datos SRTM para toda la tierra en mapas de altura para TerrainDataobjetos con diferentes niveles de detalles [1]. Hay un par de cosas a considerar:

  1. Los bordes de los mapas de altura deben solaparse con al menos una muestra y debe colocar sus terrenos en consecuencia. Terrain.SetNeighborsno conectará la malla, solo tendrá en cuenta los diferentes niveles de detalle realizados por Unity.

  2. Necesitará necesariamente 2 ^ n + 1 muestras de altura por TerrainDataobjeto, de lo contrario, Unity solo asignará una altura de 0 a las partes no configuradas.

  3. Si tiene menos de 2 GB TerrainData, puede salirse con la suya como Activos en una carpeta de Recursos y Resource.Loaden 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 el WWWobjeto. Esto tiene el efecto secundario no deseado de llamar Shader.Parsea 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.

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

sradomski
fuente
0

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

comprensible
fuente
¿Hay código fuente para eso? Todo lo que veo es un juego de plugin de la unidad.
AttackingHobo
Tengo el código fuente, me tomó un tiempo escribir. estoy en ant d0t stewart en yahoo d0t com
com.prehensible
0

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.

Hudson
fuente
Tenga en cuenta que este consejo ya está presente en la respuesta aceptada de Martin Sojka de hace 6 años. Si solo desea compartir un enlace relevante, un comentario sobre esa respuesta podría ser más apropiado.
DMGregory
En el futuro voy a. Gracias. Todavía soy nuevo en publicar en el intercambio de pila :)
Hudson