[Unity] Generación aleatoria de mosaicos empalmados
Un intento de unir parcelas de tierra para generar un mapa aleatorio. Personalmente, creo que el efecto no es muy satisfactorio. De todos modos, lo registraré primero.
Aunque es una escena 3D, los bloques del mapa generados están todos en el mismo plano. Estrictamente hablando, sigue siendo una idea 2D. Para la generación de mazmorras 3D similares, hay un artículo oficial que presenta: Entorno de mazmorra generado mediante programación en Unity.
Idea general:
Desventajas:
Construya varias tramas en una escena:
Debido a que el plan requiere hornear mapas de luz, la apertura La orientación de la parcela debe ser fija. Girar la parcela y quitar las paredes conducirá a la penetración. Por supuesto, también es posible configurar algunas paredes dinámicas y eliminarlas cuando sea necesario para crear aberturas.
Entre las parcelas construidas en la imagen de arriba, las dos columnas de la derecha son las parcelas principales, con aberturas en 2 a 4 direcciones las cuatro pequeñas parcelas en el medio están divididas en direcciones horizontales y verticales; conexión.La trama principal; las cuatro en la esquina superior izquierda son aberturas individuales. Una vez generada la trama, utilícelas para cerrar las aberturas restantes.
Una vez construidas las parcelas, se convierten en cuerpos prefabricados y se hornean. Aquí se utiliza el complemento Unity Lightmap Prefab Baker, que hornea toda la escena de acuerdo con la configuración de iluminación actual, mueve el mapa de luz horneado a la carpeta especificada y luego registra el mapa de luz asociado a través de un script colgado debajo de la casa prefabricada. la casa prefabricada está cargada. Conéctalos cuando llegues a una nueva escena.
Después de instalar el complemento, cada cuerpo prefabricado del trazado se cuelga con el script PrefabBaker:
Ventana -gt; Prefab Baker abre el panel, ajusta la configuración correspondiente y hace clic en hornear. :
Los mapas de luz predeterminados se colocan en el directorio Activos/Recursos/Mapas de luz y se pueden colocar aquí temporalmente durante la fase de desarrollo. Si la versión 2019 informa un error "Error al crear el activo", puede intentar modificar Plugins/PrefabBaker/Scripts/EditorUtils.cs, en la línea 200:
Después de completar la cocción:
Para dejar espacio Para que las aberturas entre los bloques se conecten suavemente, se debe colocar un objeto vacío en cada abertura del bloque como punto de conexión, de modo que los puntos de conexión de los dos bloques coincidan. completar el empalme. La trama también debe tener un tipo, que se divide en Habitación (habitación, abertura única), Corredor (corredor, abertura este-oeste o norte-sur), Esquina (esquina), Forma de T (en forma de T), Sala (pasillo , abriéndose por todos lados).
Puntos de conexión, eje Z hacia la dirección de apertura:
Cuerpo prefabricado de la parcela:
Al realizar el empalme es necesario poder obtener la conexión indique información de la trama y agregue Método relacionado:
Genere un mapa en una nueva escena y escriba el script LevelGenerator.cs:
Primero clasifique las casas prefabricadas de la trama:
Después de clasificar Comience a generar y escriba el método GenerateLevel para generar el mapa. Dado que es necesario colocar objetos que cumplan las condiciones en la lista muchas veces para la extracción aleatoria, prepare algunas listas con anticipación para evitar la creación repetida:
Primero genere un trazado inicial, aquí seleccione el corredor como trazado inicial, también se pueden utilizar otros tipos de trazado:
Método GetRandom:
Es necesario prestar atención al Requisitos de iluminación (principalmente luz direccional) y escena de horneado en la nueva escena. Sea coherente.
El algoritmo actual consiste en empalmar y generar gráficos uno por uno y, finalmente, utilizar gráficos de apertura única para cerrar todas las aberturas vacías. Para controlar el número de parcelas, la cantidad actual de parcelas es la cantidad de parcelas generadas más la cantidad de parcelas que se generarán.
Generación de bucle de escritura:
El método GenerateMatchingCell se utiliza para encontrar prefabricados de trazado que coincidan con el puerto de conexión de trazado actual y unirlos después de encontrarlos:
Para Para encontrar gráficos coincidentes, primero busque el tipo de punto de conexión que coincida con el punto de conexión actual:
Luego busque gráficos que contengan este tipo de punto de conexión en el gráfico prefabricado:
Efecto: p>
Finalmente, en el método GenerateLevel, los gráficos con puntos de conexión libres se sellan:
Efecto:
Cuando se generen más gráficos, se producirán conflictos:
. p>
Dado que los gráficos se generan uno por uno, la detección de conflictos solo se puede juzgar cuando se va a generar el siguiente gráfico. Si ya existe un gráfico dentro de una cierta distancia frente al punto de conexión actual, el punto de conexión no puede. Para continuar generando, es necesario cerrarlo; además, si no hay un gráfico frente al punto de conexión, también es necesario determinar si existe un gráfico al frente, a la izquierda o a la derecha. , sólo se pueden generar parcelas con aberturas hacia otro lado.
Agregue un cuerpo de colisión a cada gráfico:
LevelGenerator.cs Agregue configuración relacionada con la detección de conflictos:
En el método GenerateLevel:
Método CheckConflict:
Si no hay conflicto directo, siga la lógica anterior para determinar si hay un paquete al frente, a la izquierda o a la derecha. Si existe, registre la lista de tipos de conexión inesperada y luego pásela. en por GenerateMatchingCell Vaya a GetMatchingCell:
Efecto:
Dirección del proyecto de demostración:
Procedural-Map-Demo