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!