Introducción
Una vez que ya tenemos nuestro gestor de escenas funcionando, podemos utilizarlo para controlar nuestro juego haciendo, por ejemplo que termine si alguno de los jugadores llega a 5 goles.
Lo primero, vamos a crear un espacio donde mostrar el resultado:
- Abre la escena Juego, selecciona Canvas y clic derecho UI > Text.
- Llámalo Resultado y modifica sus propiedades: Postion XYZ: 0. Font: VCR_OSD_MONO_1.001. Font Size: 40, Alignment vertical y horizontal: centrado. Horizontal y Vertical Overflow: Overflow. Color: Blanco.
Modifica el script
Bola, de modo que muestre el texto con el resultado si se ha terminado la partida, no saque más bolas y pause el tiempo:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Bola : MonoBehaviour {
//Velocidad de la pelota
public float velocidad = 30.0f;
//Audio Source
AudioSource fuenteDeAudio;
//Clips de audio
public AudioClip audioGol, audioRaqueta, audioRebote;
//Contadores de goles
public int golesIzquierda = 0;
public int golesDerecha = 0;
//Cajas de texto de los contadores
public Text contadorIzquierda;
public Text contadorDerecha;
//Caja de texto del resultado
public Text resultado;
// Use this for initialization
void Start () {
//Velocidad inicial hacia la derecha
GetComponent<Rigidbody2D>().velocity = Vector2.right * velocidad;
//Recupero el componente audio source;
fuenteDeAudio = GetComponent<AudioSource>();
//Pongo los contadores a 0
contadorIzquierda.text = golesIzquierda.ToString();
contadorDerecha.text = golesDerecha.ToString();
//Desactivo la caja de resultado
resultado.enabled = false;
//Quito la pausa
Time.timeScale = 1;
}
//Se ejecuta si choco con la raqueta
void OnCollisionEnter2D(Collision2D micolision){
//Si me choco con la raqueta izquierda
if (micolision.gameObject.name == "Raqueta Izquierda"){
//Valor de x
int x = 1;
//Valor de y
int y = direccionY(transform.position, micolision.transform.position);
//Vector de dirección
Vector2 direccion = new Vector2(x, y);
//Aplico la velocidad a la bola
GetComponent<Rigidbody2D>().velocity = direccion * velocidad;
//Reproduzco el sonido de la raqueta
fuenteDeAudio.clip = audioRaqueta;
fuenteDeAudio.Play();
}
//Si me choco con la raqueta derecha
else if (micolision.gameObject.name == "Raqueta Derecha"){
//Valor de x
int x = -1;
//Valor de y
int y = direccionY(transform.position, micolision.transform.position);
//Vector de dirección
Vector2 direccion = new Vector2(x, y);
//Aplico la velocidad a la bola
GetComponent<Rigidbody2D>().velocity = direccion * velocidad;
//Reproduzco el sonido de la raqueta
fuenteDeAudio.clip = audioRaqueta;
fuenteDeAudio.Play();
}
//Para el sonido del rebote
if (micolision.gameObject.name == "Arriba" || micolision.gameObject.name == "Abajo"){
//Reproduzco el sonido del rebote
fuenteDeAudio.clip = audioRebote;
fuenteDeAudio.Play();
}
}
//Calculo la dirección de Y
int direccionY(Vector2 posicionBola, Vector2 posicionRaqueta){
if (posicionBola.y > posicionRaqueta.y){
return 1;
}
else if (posicionBola.y < posicionRaqueta.y){
return -1;
}
else{
return 0;
}
}
//Reinicio la posición de la bola
public void reiniciarBola(string direccion){
//Posición 0 de la bola
transform.position = Vector2.zero;
//Vector2.zero es lo mismo que new Vector2(0,0);
//Velocidad inicial de la bola
velocidad = 30;
//Velocidad y dirección
if (direccion == "Derecha"){
//Incremento goles al de la derecha
golesDerecha++;
//Lo escribo en el marcador
contadorDerecha.text = golesDerecha.ToString();
//Reinicio la bola (si no ha llegado a 5)
if (!comprobarFinal()){
GetComponent<Rigidbody2D>().velocity = Vector2.right * velocidad;
//Vector2.right es lo mismo que new Vector2(1,0)
}
}
else if (direccion == "Izquierda"){
//Incremento goles al de la izquierda
golesIzquierda++;
//Lo escribo en el marcador
contadorIzquierda.text = golesIzquierda.ToString();
//Reinicio la bola (si no ha llegado a 5)
if (!comprobarFinal()){
GetComponent<Rigidbody2D>().velocity = Vector2.left * velocidad;
//Vector2.right es lo mismo que new Vector2(-1,0)
}
}
//Reproduzco el sonido del gol
fuenteDeAudio.clip = audioGol;
fuenteDeAudio.Play();
}
void Update () {
//Incremento la velocidad de la bola
velocidad = velocidad + 0.1f;
}
//Compruebo si alguno ha llegado a 5 goles
bool comprobarFinal(){
//Si el de la izquierda ha llegado a 5
if (golesIzquierda == 5){
//Escribo y muestro el resultado
resultado.text = "¡Jugador Izquierda GANA!\nPulsa I para volver a Inicio\nPulsa P para volver a jugar";
//Muestro el resultado, pauso el juego y devuelvo true
resultado.enabled = true;
Time.timeScale = 0; //Pausa
return true;
}
//Si el de le aderecha a llegado a 5
else if (golesDerecha == 5){
//Escribo y muestro el resultado
resultado.text = "¡Jugador Derecha GANA!\nPulsa I para volver a Inicio\nPulsa P para volver a jugar";
//Muestro el resultado, pauso el juego y devuelvo true
resultado.enabled = true;
Time.timeScale = 0; //Pausa
return true;
}
//Si ninguno ha llegado a 5, continúa el juego
else{
return false;
}
}
}
Modifica el script
GameManager para que permita volver al Inicio al pulsar la tecla
I:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour {
void Start () {
}
void Update () {
//Si pulsa la tecla P o hace clic izquierdo empieza el juego
if (Input.GetKeyDown(KeyCode.P) || Input.GetMouseButton(0)){
//Cargo la escena de Juego
SceneManager.LoadScene("Juego");
}
//Si pulsa la tecla I vuelve al inicio
if (Input.GetKeyDown(KeyCode.I)){
//Cargo la escena de Inicio
SceneManager.LoadScene("Inicio");
}
}
}
Y por último, como siempre, asocia la variable de
Bola llamada
Resultado, con su correspondiente objeto de la
Hierarchy window.