Home | Clases | Unity: Plataformas en 3D | Receta 3: Gestión de escenas

Receta 3: Gestión de escenas


Introducción

En esta receta, veremos cómo poder movernos entre diferentes escenas del juego mediante botones, si bien la lógica sería similar en caso de tener cambiar de escena porque he completado un nivel o me he quedado sin vidas, por ejemplo. Puedes comprobar el objetivo final haciendo clic AQUÍ.


Planteamiento de assets

Para poder gestionar las escenas de un juego, inicialmente vamos a necesitar crear diferentes assets, a saber:

  • Un script llamado GameManager
  • Una escena llamada Preload que se ejecutará la primera al arrancar el juego.
  • Una escena de inicio llamada Inicio que nos dará acceso a las diferentes opciones del juego (Jugar, Opciones y Salir).
  • Una escena de juego llamada Jugar.
  • Una escena de opciones llamada Opciones.
  • Una escena de fin llamada Créditos, a la que se accede al acabar el juego.

De momento, crea las escenas Preload e Inicio dentro de Assets en una nueva carpeta llamada Scenes, y el script GameManager en una nueva carpeta llamada Scripts.

La escena Preload y el Game Manager

Por defecto, la versión actual de Unity no tiene un objeto gestor de escenas, si no que cualquier objeto creado se destruye al cambiar de escena.

Es por ello que debemos crear una escena vacía que se ejecute al arrancar y que contenga un objeto que no se destruya durante todo el ciclo de vida del juego. La escena vacía es la que se suele denominar Preload y será la primera al hacer el Build.

Además, a esta escena le añadiremos un Empty object llamado GameManager y le asociaremos nuestro script GameManager con el siguiente código:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour {

//Objeto GameManager
private GameObject gameManager;

void Start () {

//Busco el objeto llamado GameManager
GameObject gameManager = GameObject.Find("GameManager");

//Le indico que no se destruya al cargar otra escena
DontDestroyOnLoad(gameManager);

//Cargo la escena de inicio
SceneManager.LoadScene("Inicio");

}

}




De este modo, nos hemos asegurado durante todo el juego la existencia de un objeto con un script asociado que nos permitirá controlar los cambios entre las diferentes escenas.

Para terminar, haz clic en File > Build Settings y asegúrate de que la escena Preload está añadida. De lo contrario, ha clic en Add Open Scenes y comprueba que se añade:




La escena de Inicio

Para la escena de Inicio, que se debería haber cargado automáticamente al arrancar el juego, vamos a añadir un Canvas con los siguientes elementos:

  • Una imagen de fondo llamada Imagen Fondo (UI > RawImage) de color verde con pivot y position stretch (Anchor Presets > Alt + Shift + clic en el cuadro inferior derecho)
  • Un texto llamado Texto Escena (UI > Text) de color blanco con pivot y position center (Anchor Presets > Alt + Shift + clic en el cuadro central) y Pos Y 40 para que quede por encima del centro.
  • Un botón con el texto Jugar llamado Boton Jugar (UI > Button) de color naranja.
  • Un botón con el texto Opciones llamado Boton Opciones (UI > Button) de color amarillo.
  • Un botón con el texto Créditos llamado Boton Creditos (UI > Button) de color azul.
  • Un botón con el texto Salir llamado Boton Salir (UI > Button) de color rojo.

Tendrás que modificar las posición en X e Y de los botones y utilizar un ancho y alto adecuados, así como modificar el tipo y tamaño de letra si lo deseas. El resultado podría ser similar al siguiente:



Para terminar, haz clic en File > Build Settings y añade la escena Inicio al Build mediante Add Open Scenes.


La escena de Juego

Para crear la escena de Juego, duplica la anterior (Ctrl+D o Cmd+D), renómbrala como Juego y realiza los siguientes cambios:

  • Cambia el color de Imagen Fondo a naranja.
  • Cambia el texto de Texto Escena a Escena de Jugar.
  • Cambia el nombre de Boton Jugar a Botón Inicio, su texto a Inicio y su color a verde.

El resultado podría ser similar al siguiente:



Para terminar, haz clic en File > Build Settings y añade la escena Jugar al Build mediante Add Open Scenes.


La escena de Opciones

Para crear la escena de Opciones, duplica la anterior (Ctrl+D o Cmd+D), renómbrala como Opciones y realiza los siguientes cambios:

  • Cambia el color de Imagen Fondo a amarillo.
  • Cambia el texto de Texto Escena a Escena de Opciones.
  • Cambia el nombre de Boton Opciones a Botón Jugar, su texto a Jugar y su color a naranja.

El resultado podría ser similar al siguiente:



Para terminar, haz clic en File > Build Settings y añade la escena Opciones al Build mediante Add Open Scenes.


La escena de Créditos

Para crear la escena de Creditos, duplica la anterior (Ctrl+D o Cmd+D), renómbrala como Creditos y realiza los siguientes cambios:

  • Cambia el color de Imagen Fondo a azul.
  • Cambia el texto de Texto Escena a Escena de Créditos.
  • Cambia el nombre de Boton Creditos a Botón Opciones, su texto a Opciones y su color a amarillo.

El resultado podría ser similar al siguiente:



Para terminar, haz clic en File > Build Settings y añade la escena Creditos al Build mediante Add Open Scenes. El orden de escenas debería ser el siguiente (si no es así, corrígelo arrastrando cada una a su lugar correspondiente):




Las acciones de los Botones

Lo único que faltaría por hacer para terminar la receta es programar las acciones de los botones, esto es, que al hacer el clic en ellos el juego cambie a la escena correspondiente.

Para ello, vamos a crear un nuevo script llamado Botones con el siguiente código:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Botones : MonoBehaviour {

//Objeto Game Manager
private GameManager gameManager;

//Botones
public Button botonInicio, botonJugar, botonOpciones, botonCreditos, botonSalir;

void Start () {

//Busco mi objeto Game Manager
gameManager = FindObjectOfType<GameManager>();

//Añado al botonInicio la acción a ejecutar al hacer clic (cambiar a la escena Inicio desde el Game Manager)
if (botonInicio){
botonInicio.GetComponent<Button>().onClick.AddListener(() => gameManager.cambiarEscena("Inicio"));
}

//Añado al botonJugar la acción a ejecutar al hacer clic (cambiar a la escena Jugar desde el Game Manager)
if (botonJugar){
botonJugar.GetComponent<Button>().onClick.AddListener(() => gameManager.cambiarEscena("Jugar"));
}

//Añado al botonOpciones la acción a ejecutar al hacer clic (cambiar a la escena Opciones desde el Game Manager)
if (botonOpciones){
botonOpciones.GetComponent<Button>().onClick.AddListener(() => gameManager.cambiarEscena("Opciones"));
}

//Añado al botonCreditos la acción a ejecutar al hacer clic (cambiar a la escena Creditos desde el Game Manager)
if (botonCreditos){
botonCreditos.GetComponent<Button>().onClick.AddListener(() => gameManager.cambiarEscena("Creditos"));
}

//Añado al botonSalir la acción a ejecutar al hacer clic (salir de la aplicación)
//Este botón no funcionará en el Editor de Unity, pero si al hacr el Build del Juego.
if (botonSalir){
botonSalir.GetComponent<Button>().onClick.AddListener(() => Application.Quit());
}

}

}


Como ves, hemos creado acciones en todos los botones que se ejecutarán desde el GameManager al hacer clic en los botones, salvo en el caso del Botón Salir, que terminará el juego (cuando hagas el Build y lo pruebes en un ordenador, en mi versión HTML tampoco podrás comprobar su funcionamiento).

Es necesario modificar el código del script GameManager para que incluya el método de cambio de escenas:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour {

//Objeto GameManager
private GameObject gameManager;

void Start () {

//Busco el objeto llamado GameManager
GameObject gameManager = GameObject.Find("GameManager");

//Le indico que no se destruya al cargar otra escena
DontDestroyOnLoad(gameManager);

//Cargo la escena de inicio
SceneManager.LoadScene("Inicio");

}

public void cambiarEscena(string nombreEscena){

SceneManager.LoadScene(nombreEscena);

}

}


Y por último, debemos añadir el script Botones a todos los Canvas de todas las escenas con botones, así como asociar las variables de los botones con sus botones correspondientes.

Ten en cuenta que en cada escena hay 4 botones y 5 variables a asignar, de modo que una quedará vacía (la del botón propio de la escena). No hay problema, por eso en el script hemos indicado que solo añada la acción si existe el botón correspondiente.

Una vez hecho esto, ya puedes probar tu gestor de escenas (lanzándolo siempre desde la escena Preload).

Con esto estaría terminada la receta, espero que te haya resultado útil.

Puedes comprobar su funcionamiento haciendo clic AQUÍ.
Fecha de publicación: 19/09/2020
Asignaturas: desarrollo de entornos interactivos multidispositivo
Temas: unity
Utilizamos cookies propias y de terceros para mejorar su experiencia en la navegación. Al seguir navegando entendemos que acepta su uso.
Si lo desea, consulte nuestras políticas de privacidad y cookies
ENTENDIDO
[X] Cerrar

Contacta conmigo


[X] Cerrar

Acceso alumnos