CursosEmpresasBlogLiveConfPrecios

Reto: fin de juego

Clase 12 de 13 • Curso Práctico de Videojuegos Multijugador Online con Unity y Mirror

Contenido del curso

Introducción

  • 1
    Presentación del proyecto: PlatziPong Multiplayer

    Presentación del proyecto: PlatziPong Multiplayer

    00:38 min
  • 2
    Configuración del entorno de desarrollo

    Configuración del entorno de desarrollo

    03:34 min

Desarrollo del proyecto de pong

  • 3
    Network manager

    Network manager

    04:10 min
  • 4
    Creación de un personaje

    Creación de un personaje

    08:47 min
  • 5
    Autoridad en las raquetas de pong

    Autoridad en las raquetas de pong

    06:25 min
  • 6
    Spawn points y bloqueo de jugadores

    Spawn points y bloqueo de jugadores

    10:15 min
  • 7
    Creación, spawn y movimiento de la pelota

    Creación, spawn y movimiento de la pelota

    19:51 min

Puntaje

  • 8
    Interfaz del puntaje

    Interfaz del puntaje

    07:38 min
  • 9
    Puntaje local (monojugador)

    Puntaje local (monojugador)

    13:23 min
  • 10
    Puntaje multijugador con variables sincronizadas

    Puntaje multijugador con variables sincronizadas

    08:08 min

Extras

  • 11

    Reto: cambia el color de tu raqueta

    03:29 min
  • 12

    Reto: fin de juego

    Viendo ahora

Próximos pasos

  • 13
    ¿Quieres más cursos de videojuegos multijugador online?

    ¿Quieres más cursos de videojuegos multijugador online?

    01:02 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      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!

        Líam Ayelén Acosta Muñoz

        Líam Ayelén Acosta Muñoz

        student•
        hace 4 años

        Hola, tengo un problema y es que pasados lo 5 segundos del delay el cliente se desconecta, que puedo hacer?(mi codigo esta así):

        <using System.Collections; using System.Collections.Generic; using UnityEngine; using Mirror; using TMPro; public class BallController : NetworkBehaviour { public float speed = 10; public Rigidbody2D rb; NetworkManagerScript networkManager; public int leftScore; public int rightScore; public int delay = 5; public TMP_Text textScore; public TMP_Text winnerScore; // Start is called before the first frame update void Start() { textScore = GameObject.Find("ScoreText").GetComponent<TMP_Text>(); winnerScore = GameObject.Find("WinPlayerText").GetComponent<TMP_Text>(); winnerScore.gameObject.SetActive(false); } public override void OnStartServer() { networkManager = FindObjectOfType<NetworkManagerScript>(); StartCoroutine(StartBall(delay)); } IEnumerator StartBall(float delay) { rb.simulated = false; rb.velocity = Vector2.zero; transform.position = Vector2.zero; yield return new WaitForSeconds(delay); RpcDisableWinStage(); yield return new WaitForSeconds(2); rb.simulated = true; float direction = Random.Range(0f, 1f) > 0.5f ? 1 : -1; rb.velocity = Vector2.right * speed * direction; } float HitFactor(Vector2 ballPocition, Vector2 racketPocition, float racketHeight) { return (ballPocition.y - racketPocition.y) / racketHeight; } void OnCollisionEnter2D(Collision2D col) { if (col.transform.GetComponent<PlayerController>()) { rb.velocity = Vector2.Reflect(rb.velocity, col.contacts[0].normal).normalized * speed; float y = HitFactor(transform.position, col.transform.position, col.collider.bounds.size.y); float x = col.relativeVelocity.x > 0 ? 1 : -1; Vector2 dir = new Vector2(x, y).normalized; rb.velocity = dir * speed; } } [ServerCallback] private void Update() { int delay = 0; if (transform.position.x > networkManager.PlayerSpawnpointRight.position.x) { leftScore ++; if (leftScore >= 5) { RpcWinStage("Izquierdo"); delay = 5; leftScore = 0; rightScore = 0; } StartCoroutine(StartBall(delay)); RPcUpdateTextScore(leftScore, rightScore); } if (transform.position.x < networkManager.PlayerSpawnpointLeft.position.x) { rightScore ++; if(rightScore >= 5) { RpcWinStage("Derecho"); delay = 5; rightScore = 0; leftScore = 0; } StartCoroutine(StartBall(delay)); RPcUpdateTextScore(leftScore, rightScore); } } [ClientRpc] public void RPcUpdateTextScore(int leftScore, int rightScore) { textScore.text = $"{leftScore} - {rightScore}"; } [ClientRpc] public void RpcWinStage(string winner) { winnerScore.gameObject.SetActive(true); winnerScore.text = $"Ha Ganado el jugador del lado <b>{winner}<b>"; } [ClientRpc] public void RpcDisableWinStage() { winnerScore.gameObject.SetActive(false); } } >
          Hecot Pulido

          Hecot Pulido

          student•
          hace 4 años

          ¿la consola te da algun error?