Reto: fin de juego
Clase 12 de 13 • Curso Práctico de Videojuegos Multijugador Online con Unity y Mirror
En este último reto veremos como ejecutar el fin de la partida, en este caso cuando uno de los jugadores llegue a 5 puntos, se mostrará un mensaje diciendo cuál ha ganado, además se reseteará el contador por 5 segundos y la partida se reanudará.
Primero que nada, seguro has notado que cuando tu pantalla cambia de tamaño, el texto cambia de lugar, vamos a solucionar eso de primero, vamos a ir a “Canvas” -> “Canvas Scaler”, y donde dice “UI Scale Mode” vamos a seleccionar “scale with screen size”.
Ahora simplemente tenemos que organizar nuestro texto nuevamente y veremos que al cambiar el tamaño de la pantalla la posición no cambia.
Aprovecharemos para cambiar el nombre del texto del puntaje por “ScoreText” lo usaremos luego.
Vamos a crear un nuevo texto y le pondremos de nombre “WinnerPlayerText”, le pondremos el siguiente texto únicamente para probar “Ha ganado el jugador del lado <b>winner</b>
”.
Aunque el curso no va de eso, quiero que te fijes que “<b>
” representa negrillas, aunque no es HTML completo, es algo llamado rich text que puede hacer nuestro juego mucho más vistoso.
Centremos el texto que se vea agradable a la vista, debería quedarte algo así:
Y luego de eso borra el texto, ya que no lo usaremos.
En nuestro script Ball.cs vamos a cambiar nuestro start, vamos a cambiar la forma en la que obtenemos el textScore y obtendremos el winnerScore.
void Start() { textScore = GameObject.Find("ScoreText").GetComponent<TMP_Text>(); winnerScore = GameObject.Find("WinnerPlayerText").GetComponent<TMP_Text>(); winnerScore.gameObject.SetActive(false); }
Lo pondremos como inactivo para evitar errores más adelante.
Ahora vamos a crear dos Rpc para controlar ese texto, uno para activarlo y mostrar el nombre del jugador ganador y otro para desactivarlo.
[ClientRpc] public void RpcWinState(string winner) { winnerScore.gameObject.SetActive(true); winnerScore.text = $"Ha ganado el jugador del lado <b>{winner}</b>"; } [ClientRpc] public void RpcDisableWinState() { winnerScore.gameObject.SetActive(false); }
Vamos a cambiar nuestra función de StartBall, vamos a añadirle el parámetro delay, es de tipo float.
IEnumerator StartBall(float delay) …
Este delay lo usaremos para mostrar durante un tiempo y luego desactivar el texto de winnerScore, lo pondremos de esta manera.
IEnumerator StartBall(float delay) { rb.simulated = false; rb.velocity = Vector2.zero; transform.position = Vector2.zero; // Nuevo codigo yield return new WaitForSeconds(delay); RpcDisableWinState(); yield return new WaitForSeconds(2); rb.simulated = true; float direction = Random.Range(0f, 1f) > 0.5f ? 1 : -1; rb.velocity = Vector2.right * speed * direction; }
Como notarás ahora tenemos todo el código para desactivar nuestro winnerScore, pero todavía no tenemos nada para activarlo, vamos a solucionar eso yendo a la función Update:
Vamos a añadir una comprobación para saber si ya superamos los 5 puntos, podemos hacerlo de esta manera:
int delay = 0; if (transform.position.x > networkManager.rightRacketSpawn.position.x) { leftScore++; // Codigo nuevo if (leftScore >= 5) { RpcWinState("Izquierdo"); delay = 5; leftScore = 0; rightScore = 0; } StartCoroutine(StartBall(delay)); RpcUpdateTextScore(leftScore, rightScore); }
De esta manera activamos el winnerScore, los puntajes se resetean y se espera 5 segundos. Nota que este código es solo para el lado izquierdo toca hacer lo mismo para el lado derecho, te lo dejo a ti .
Ya con eso tendremos nuestro fin del juego completo, recuerda crear un nuevo build y probar.
Nos vemos en la clase final, recuerda poner en el sistema de comentarios cualquier pregunta que tengas, ¡un saludo!