5

Generación Pseudo Aleatoria de Niveles

3109Puntos

hace 2 años

Hola a todos, les quiero compartir una forma fácil y relativamente rápida de generar un poco de aleatoriedad en el desarrollo de niveles.

Lo que vamos a obtener con este método de creación será un nivel que, a pesar de ser pseudo-aleatorio, nos permitirá tener un gran control en el diseño del nivel, en este caso niveles 2d.

Empezamos como siempre abriendo nuestro proyecto en Unity, por adelantado yo prepare un pequeño escenario con algunos tiles gratuitos de la Unity Asset Store: https://assetstore.unity.com/packages/2d/environments/2d-fantasy-forest-tileset-19553

Y también teniendo preparados los prefabs de los objetos con los que queremos llenar nuestro nivel:

Captura de pantalla 2018-11-25 a la(s) 17.14.08.png

El siguiente paso es muy sencillo, creamos un objeto (el cual será el padre de los objetos que vamos a instanciar, esto con el propósito de tenerlo todo ordenado) el cual llame “Generador” y dentro creamos un objeto hijo (este será el punto donde se instanciará el prefab), por comodidad podemos asignarle un gizmo y así poder identificar nuestros objetos más fácil:
Captura de pantalla 2018-11-25 a la(s) 17.21.15.png

Como ya dije, este objeto llamado “obj” será el lugar donde instanciemos los prefabs, por lo cual vamos a copiar este objeto tantas veces como queramos y en las posiciones que querramos:

Captura de pantalla 2018-11-25 a la(s) 17.24.16.png

Con esto ya casi tenemos todo preparado, ahora vamos a crear un script en el objeto padre “Generador” que se encargará de instanciar aleatoriamente los prefabs:

using UnityEngine;

publicclassGenerator : MonoBehaviour {

//Creamos un array de GameObjects (los prefabs que instanciaremos)public GameObject[] objeto;

//declaramos un entero que servirá como un indice random para elegir//elementos del arregloint rand;

	// Use this for initializationvoidStart () {
//Llamamos a la función "Generar" en el Start  ya que solo necesitamos//que se ejecute una vez
        Generar();
		
	}
	
	// Update is called once per framevoidUpdate () {
		
	}

    voidGenerar()
    {
        
  //con  esta sintaxis hacemos un bucle foreach de los Transforms de los//objetos hijos               foreach (Transform child in transform)
        {
//por cada iteracion elegimos un valor random  para la variable rand, desde 0 //hasta el número de elementos en la lista de "objeto" (recordemos que en la//función Random.Range()  el primer parámetro que colocamos es inclusivo y el //segundo es exclusivo

            rand = Random.Range(0, objeto.Length);

//finalmente instanciamos un objeto de la lista de objetos con el indice random
            Instantiate(objeto[rand], child.position, Quaternion.identity);
        }
    }

}```


Ahora simplemente asignamos los prefabs que queremos instanciar al array de objetos y probamos:

Captura de pantalla 2018-11-25 a la(s) 17.35.07.png

Y como pueden ver cada vez que pulsamos play los objetos cambian dando el efecto de una generación aleatoria pero de la que podemos tener un gran control:

Captura de pantalla 2018-11-25 a la(s) 17.39.07.png

También si queremos que un objeto tenga más probabilidades de instanciarse simplemente lo colocamos más veces dentro del arreglo de objetos.

Este tipo de creación de niveles aleatorios me parece el mas controlado pero sin duda hay otros metódos de obtener resultados interesantes como con Perlin Noise u otros algoritmos, pero sin duda este que les acabo de enseñar es de los más sencillos y fáciles de implementar.

Josue
Josue
josue-gutierrez

3109Puntos

hace 2 años

Todas sus entradas
Escribe tu comentario
+ 2
2
30660Puntos

Que gran tutorial! me sirve para un proyecto en el que estoy trabajando! Gracias