Séptima sesión del taller de creación de videojuegos con Unity

En la séptima sesión, añadimos un menú opcions, creamos un script para añadir funcionalidad multilenguaje a los textos y reajustamos los demás scripts para aplicar el cambio de idioma en todos los textos del juego.

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

Podéis descargar las imágenes y los scripts aquí:

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

public class MultilanguageText : MonoBehaviour
{
[SerializeField] string[] LanguagesTexts;
[SerializeField] Text MyTextField;
int myLanguage = GameplayManager.MainLanguage;

void Start()
{
MyTextField.text = LanguagesTexts[myLanguage];
}

private void OnEnable()
{
UpdateText();
}

public void UpdateText()
{
myLanguage = GameplayManager.MainLanguage;
MyTextField.text = LanguagesTexts[myLanguage];
}
}

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

public class GameplayManager : MonoBehaviour
{
public static int MainLanguage = 0; // Variable para marcar el idioma del juego
// 0 = catalán, 1 = castellano, 2 = inglés
[SerializeField] MultilanguageText[] TextsToChange;
// 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
ComprobarRecord();
}

// 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”;
switch (MainLanguage)
{
case 2: // Inglés
timeText.text = “Time: ” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”;
break;
case 1: // Castellano
timeText.text = “Tiempo: ” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”;
break;
case 0: // Catalán
timeText.text = “Temps: ” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”;
break;
}
}
}

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
switch (MainLanguage)
{
case 2: // Inglés
mainText.text = “Level complete! \n” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”;
break;
case 1: // Castellano
mainText.text = “¡Nivel completado! \n” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”; // Indicamos que se ha completado el nivel
break;
case 0: // Catalán
mainText.text = “Nivell complert! \n” + (Time.time – tiempoInicial).ToString(“00.00″) + ” s”;
break;
}
// 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

}

public void ChangeLanguage(int languageIndex)
{
MainLanguage = languageIndex;
foreach (MultilanguageText text in TextsToChange)
{
text.UpdateText();
}
ComprobarRecord();
}

private void ComprobarRecord()
{
if (tiempoRecord < 600f)
{
// Si existe un tiempo record inferior a 600 segundos, lo mostramos.
switch (MainLanguage)
{
case 2: // Inglés
recordText.text = “Best time: ” + tiempoRecord.ToString(“00.00″) + ” s”; // Le asignamos el valor al texto que muestra el tiempo record
break;
case 1: // Castellano
recordText.text = “Mejor tiempo: ” + tiempoRecord.ToString(“00.00″) + ” s”; // Le asignamos el valor al texto que muestra el tiempo record
break;
case 0: // Catalán
recordText.text = “Millor temps: ” + tiempoRecord.ToString(“00.00″) + ” s”; // Le asignamos el valor al texto que muestra el tiempo record
break;
}
recordText.enabled = true; // Activamos el texto de record para que se muestre en pantalla
}
else
{
// Si no existe, lo desactivamos
recordText.enabled = false;
}
}

}

¡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

×