El terreno de Unity esta disenado para juegos de mundo abierto en primera persona: heightmaps, splatmaps, colocacion de arboles. Nada de eso encaja en un RPG hack-and-slash basado en tiles con mazmorras procedurales. Asi que construi uno personalizado.
Puntos y Celdas
El terreno esta construido sobre una cuadricula 2D de TerrainPoint. Cada punto es un struct que contiene un valor de altura, un nivel de agua (0 = sin agua, niveles mas altos para profundidad creciente), un indice de textura y una flag de caminabilidad. Cada punto ocupa unos 6 bytes. Una sala tipica tiene una cuadricula de 30x30, asi que unos 5.4KB de datos de terreno crudos.
Entre cuatro puntos adyacentes esta un TerrainCell, la unidad real de terreno con la que interactua el jugador. Una celda hereda sus propiedades de las cuatro esquinas: se vuelve no caminable si algun punto esta marcado como no caminable, calcula su nivel de agua promedio y determina si necesita un acantilado.
El Atlas de Texturas
Cuando cuatro puntos de esquina comparten la misma textura, renderizar la celda es simple. Pero cuando los puntos adyacentes usan texturas diferentes (hierba junto a piedra, por ejemplo), el sistema necesita renderizar una transicion. En lugar de usar splatmaps, Warman usa un atlas de texturas dinamico.
El atlas empieza en 1024x1024 y crece segun sea necesario. Cuando aparece una nueva combinacion que no tiene una tile de transicion en cache, el sistema genera una nueva textura mezclada y la escribe en el atlas. Las celdas indexan directamente en el atlas mediante coordenadas UV. El resultado: transiciones suaves sin muestreo de texturas en tiempo de ejecucion.
Acantilados
Los acantilados aparecen donde puntos de terreno adyacentes tienen diferentes alturas. La capa de acantilados escanea cada celda, calcula que bordes tienen transiciones de altura y coloca la malla de acantilado apropiada. Hay tilesets especificos para caras de acantilado que manejan esquinas internas, esquinas externas y bordes rectos. 15 variantes en un tileset de acantilado estandar, basadas en cuales de las cuatro esquinas estan elevadas.
El sistema de pathfinding conoce las rampas y subdivide cada celda en una cuadricula mas densa de nodos dentro de la zona de rampa. La posicion Y de cada nodo se interpola entre los niveles de altura de inicio y fin, asi que los agentes suben y bajan rampas suavemente sin saltar entre capas.
Agua
El agua se renderiza como una capa separada por encima del terreno. Si un punto de terreno tiene un nivel de agua > 0, el renderizador dibuja un plano de agua semitransparente a la altura del agua. La caminabilidad se determina por la configuracion del tipo de superficie del bioma. Algunos biomas tratan el agua como caminable (agua poco profunda), otros no (agua profunda). El sistema de efectos de sonido de pasos verifica si el jugador esta en una celda de agua y cambia a sonidos de chapoteo.
Doodads
Doodads son objetos decorativos y funcionales colocados en el terreno. La mayoria son GameObjects estandar, instanciados con una posicion, rotacion y escala. Pero los doodads de alto volumen (hierba, rocas, arboles pequenos) usan instanciado GPU para rendimiento. El editor de niveles permite colocar, rotar y escalar doodads directamente en la superficie del terreno, proyectando hasta la cuadricula de terreno para el posicionamiento Y.