Tercera sesión del taller de creación de videojuegos con Unity

En la tercera sesión del taller de creación de videojuegos con Unity configuramos el los límites del nivel, añadimos los indicadores de puntuación, la meta y otros elementos de gameplay.

A continuación os dejamos el vídeo que se ha estrenado hoy martes 12 de mayo.

Los dos scripts que utilizamos en el vídeo se muestran a continuación. También podéis hacer clic en los enlaces y descargarlos directamente.

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameplayManager : MonoBehaviour
{
// Variables públicas que se muestran en el editor
public MotoControl moto; // Referencia al script que controla el movimiento de la moto
public Text mainText; // Texto que utilizamos para mostrar la cuenta atrás
public Text timeText; // Texto que indica el tiempo de juego
public Text recordText; // Texto para mostrar el tiempo record
public Button startButton; // Referencia al botón Start
public Button restartButton; // Referencia al botón Restart

// Variables privadas
private int segundosParaEmpezar = 3; // Valor por defecto de la cuenta atrás
private Text startBtnText; // Referencia al texto del botón Start
private Text restartBtnText; // Referencia al texto del botón Restart
private float tiempoInicial; // Float (decimal) para guardar el tiempo inicial
private float tiempoRecord; // Float (decimal) para guardar el tiempo record

// Variable serialize con SerializeField
[SerializeField] GameObject player; // Referencia al jugador/moto

void Start()
{
// Lo que se ejecuta nada más empezar
//timeText.text = “”; // Dejamos el campo de texto vacío
timeText.gameObject.SetActive(false); // Desactivamos el objeto que muestra el texto del tiempo
moto.Eliminado += Reiniciar; // Asignamos la función Reiniciar al delegado ‘Eliminado’ de MotoControl.cs
moto.FinalNivel += Final; // Asignamos la función Final al delegado ‘FinalNivel’ de MotoControl.cs
mainText.enabled = false; // Desactivamos el texto principal (mainText)
moto.enabled = false; // Desactivamos el script MotoControl.cs para que la moto no se pueda mover
player.GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Kinematic; // Cambiamos el rigidbody del jugador a kinematic
restartButton.enabled = false; // Desactivamos el botón Restart
restartButton.gameObject.SetActive(false); // Escondemos el botón
tiempoRecord = PlayerPrefs.GetFloat(“tiempo record”, 600f); // Asignamos el valor de “tiempo record” en las PlayerPrefs a la variable tiempoRecord.
// En caso de no tener ningún valor guardado en PlayerPrefs, se asigna el valor 600.
// Comprobamos si existe un tiempo record
if (tiempoRecord < 600f)
{
// Si existe un tiempo record inferior a 600 segundos, lo mostramos.
recordText.text = “Mejor tiempo: ” + tiempoRecord.ToString(“00.00″) + ” s”; // Le asignamos el valor al texto que muestra el tiempo record
recordText.enabled = true; // Activamos el texto de record para que se muestre en pantalla
}
else
{
// Si no existe, lo desactivamos
recordText.enabled = false;
}
}

// Función reiniciar. Recarga la escena.
public void Reiniciar()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}

// Función para iniciar el juego
public void StartGame()
{
startButton.enabled = false; // Hacemos que el botón Start no se pueda clicar (lo desactivamos)
startButton.gameObject.SetActive(false); // Escondemos el botón Start
mainText.enabled = true; // Activamos el texto de la cuenta atrás
mainText.text = “” + segundosParaEmpezar; // Damos a mainText el valor de 3 segundos para empezar
InvokeRepeating(“CuentaAtras”, 1, 1); // Iniciamos la cuenta atrás
}

void CuentaAtras()
{
segundosParaEmpezar–; // Disminuye los segundos que faltan para empezar el juego (3, 2, 1…)
// Comprobamos si quedan segundos para empezar
if (segundosParaEmpezar <= 0)
{
// Si no quedan segundos para empezar, cancelamos la llamada a la función cuenta atrás y empezamos el juego
CancelInvoke();
JuegoEmpezado(); // Llama la función para empezar el juego
}
else
{
// Si quedan segundos para empezar, cambiamos el valor de mainText para que se muestre por pantalla
mainText.text = “” + segundosParaEmpezar;
}
}

// Función para empezar el juego
void JuegoEmpezado()
{
mainText.enabled = false; // Desactivamos el texto de cuenta atrás/finalización del nivel
moto.enabled = true; // Activamos la moto
player.GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Dynamic; // Cambiamos el rigidbody del jugador a dynamic
timeText.gameObject.SetActive(true); // Desactivamos el objeto que muestra el texto que cuenta el tiempo
tiempoInicial = Time.time; // Asignamos el tiempo actual al tiempo inicial
}

// Update se ejecuta una vez por frame. Lo utilizamos para modificar el texto del tiempo de juego transcurrido.
void Update()
{
if (moto.enabled)
{ //Si la moto está activa, le asignamos el valor igual al a diferencia entre el tiempo en X frame y el tiempo inicial
timeText.text = “Tiempo: ” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”;
}
}

void Final()
{
moto.enabled = false; // Desactivamos el movimiento de la moto
player.GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Static; // Cambiamos el rigidbody del jugador a kinematic
mainText.enabled = true; // Activamos el texto mainText
mainText.text = “¡Nivel completado! \n” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”; // Indicamos que se ha completado el nivel
// Comprobamos si el nuevo tiempo que hemos tardado en completar el nivel establece un record
if ((Time.time – tiempoInicial) < PlayerPrefs.GetFloat(“tiempo record”, 600f))
{
PlayerPrefs.SetFloat(“tiempo record”, (Time.time – tiempoInicial)); // Guardamos la puntuación en el tiemp record
}
restartButton.enabled = true; // Activamos el botón Restart
restartButton.gameObject.SetActive(true); // Mostramos el botón Restart

}

}

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

public class DeadZone : MonoBehaviour
{

[SerializeField] GameplayManager gameplayManager; // Creamos una referencia al GameplayManager

// Comprobar si colisionamos con la moto <-> si la moto colisiona con la zona muerta
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == “MOTO”) // Si el objeto de la colisión tiene la tag “MOTO”
{
gameplayManager.Reiniciar(); // Entonces llamamos la función reinicar del GameplayManager
}
}

}

¡Esperamos que os sea de ayuda! ¡Nos vemos en la próxima sesión!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Pin It on Pinterest

×