Home | Clases | Unity: Videojuego para 2 jugadores en 2D estilo Pong | Contador de goles

Contador de goles


Introducción

Cuando la bola atraviesa una de las paredes laterales, se ha marcado un gol.

Por tanto, son varias las tareas que tenemos que realizar en ese momento:

  • Actualizar el contador de goles del que haya marcado.
  • Re-posicionar la bola en el centro.
  • Si ha llegado a 5 goles, se acaba el juego.
  • Si no ha llegado a 5, le doy a la bola la velocidad en la dirección del que ha marcado.


Importar la fuente

Para asemejarnos al juego original, vamos a importar una fuente tipo 8-bit que emule el estilo "retro".

  • Crea un carpeta llamada Fonts dentro de tu proyecto
  • Descárgate la fuente VCR OSD Mono
  • Descomprímela y arrastra el archivo *.ttf a tu carpeta Fonts


Dibujar los contadores

Vamos a crear los contadores para cada jugador.

En la Hierarchy window, clic derecho Create > UI >Text. Esto crea automáticamente un Canvas de nivel superior, que contendrá toda nuestra interfaz de usuario UI.

Cambia el nombre de Text a ContadorIzquierda y modifica sus propiedades:

  • Arrástralo a la esquina superior del Canvas. Position XYZ debe ser -475, 300, 0
  • Width y Height debe ser 100
  • Cambia la Font a VCR_OSD_MONO_1.001 (arrastrándola).
  • Cambia el Color a Blanco
  • Cambia el Font Size a 60


Para hacer ContadorDerecha, simplemente duplica ContadorIzquierda, cambia el nombre a ContadorDerecha y modifica Position XYZ a 1165, -54, 0.



Detectar los goles

Si recordamos, a los Box Collider 2D de los bordes Izquierda y Derecha les habíamos añadido la opción Is Trigger, por eso la bola "atraviesa" la portería.

Esto nos permite utilizar la función de Unity OnTriggerEnter2D, que nos devuelve con qué objeto ha colisionado.

De este modo, para detectar los goles, debemos añadir un nuevo script que llamaremos Portería:


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

public class Porteria : MonoBehaviour {

//detecto si la bola atraviesa la porteria
void OnTriggerEnter2D(Collider2D bola) {

if (bola.name == "Bola"){

//Si es la portería izquierda
if (this.name == "Izquierda"){
//Cuento el gol y reinicio la bola
bola.GetComponent<Bola>().reiniciarBola("Derecha");
}
//Si es la portería derecha
else if (this.name == "Derecha"){
//Cuento el gol y reinicio la bola
bola.GetComponent<Bola>().reiniciarBola("Izquierda");
}

}

}

}


Antes de continuar, debemos asociar dicho script a ambas porterías (Izquierda y Derecha).

Además, hemos llamado a la función reiniciarBola() del script de la Bola, de la que hablaremos a continuación.

Reiniciar la bola

Al marcar un gol, la bola debe volver a su posición original, en la dirección del que ha marcado el gol.

Para ello, debemos crear un método en el script Bola que nos permita modificar su posición y velocidad, pero ejecutarlo desde el script Porteria cuando se marque un gol.

¿Cómo lo hacemos? Utilizando un método publico (public).

Modifica el script Bola:


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;

//Contadores de goles
public int golesIzquierda = 0;
public int golesDerecha = 0;

//Cajas de texto de los contadores
public Text contadorIzquierda;
public Text contadorDerecha;


// Use this for initialization
void Start () {

//Velocidad inicial hacia la derecha
GetComponent<Rigidbody2D>().velocity = Vector2.right * velocidad;

//Pongo los contadores a 0
contadorIzquierda.text = golesIzquierda.ToString();
contadorDerecha.text = golesDerecha.ToString();

}

//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;

}
//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;

}

}

//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
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
GetComponent<Rigidbody2D>().velocity = Vector2.left * velocidad;
//Vector2.right es lo mismo que new Vector2(-1,0)
}

}
}


Para terminar, asocia las variables Contador Izquierda y Contador Derecha con sus respectivos campos Text del Canvas.

Con esto ya estaría el juego listo para jugar con un compañero indefinidamente.
Fecha de publicación: 22/10/2019
Asignaturas: realización de proyectos multimedia interactivosdesarrollo de entornos interactivos multidispositivo
Temas: Unity 2d Pong
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