Unity: Generación procedural de niveles para juego de plataformas (2D)

Estoy iniciándome en el desarrollo de videojuegos, de momento 2D, en Unity; siguiendo algunos tutoriales en YouTube he creado el principio de un juego básico de plataformas. Una vez lo tenía todo listo me asaltó la duda, ¿ Diseño de niveles o niveles procedurales ?

Como la segunda opción parecía mas interesante a modo de reto, he estado viendo como podría hacer esto y al final la solución ha sido bastante sencilla; obviamente habrán mejores formas de generarlos pero para hacer algo tipo Mario Bross queda bastante resultón.

La solución se basa en tener un objeto (GameObject) que recorre el mapa desde un punto y va instanciando objetos. Tiene una lista de plataformas diferentes, va avanzando como máximo lo mismo que puede avanzar el jugador que son 5 espacios, y dependiendo de unos valores generados aleatoriamente dibujan suelo o añaden enemigos.


Este es el script resultante.

public class LevelCreator : MonoBehaviour {

    public GameObject ground;
    public GameObject enemy;
    public GameObject[] platformPrefabs;

    
    // Update is called once per frame
    void Update () {
        if(transform.position.x < 100 )
            RandomMove ();
    }

    void RandomMove(){
        int spaceToMove = Random.Range (1, 5);
        bool up = spaceToMove < 3;

        // Getting a random object for instantiate.
        GameObject newObject = platformPrefabs [Random.Range (0, platformPrefabs.Length)];

        // Create the vector for movement based on random displacement created.
        Vector3 movement = new Vector3 (1, (up) ? 1 : (transform.position.y>3) ? -1 : 0, 0) * spaceToMove;
        transform.Translate (movement, Space.World);

        if (Random.Range(0,100)>30) { // Draw ground?
            if(Random.Range(0,100)>70) // If drawing ground.. draw enemies?
                Instantiate (enemy, new Vector3(transform.position.x,-3,0), Quaternion.identity);
            Instantiate (ground, new Vector3(transform.position.x,-4,0), Quaternion.identity);
        }
            
        if (Random.Range (0, 100) > 50) {
            Instantiate (newObject, transform.position, Quaternion.identity);
            // Translate the object creator to the size of the object created ( avoiding overlap ).
            transform.Translate (Vector3.right * newObject.GetComponent<Collider2D> ().bounds.size.x, Space.World);
        }

    }
}

Comentarios

Entradas populares de este blog

El juego del impávido.

HowTo Cambiar campo "Archivar como" para que se asemejer a "Nombre completo"

VS2008 C# Centrar un formulario en pantalla.