‫Oye.
‫Bienvenido de nuevo.
‫Estamos listos para terminar nuestro juego, lo que significa que solo quedan algunas cosas por hacer para pulir nuestro
‫juego y dejarlo en un estado con el que estemos contentos.
‫Así que prepárate para terminar este juego.
‫Ya casi hemos terminado.
‫Solo vamos a agregar un par de características.
‫Me gustaría que el movimiento de la cámara fuera un poco más suave, así que vamos a empezar con eso.
‫También me he dado cuenta de que las torres siguen disparando proyectiles después de que el tanque ha muerto, por lo que
‫podemos corregir fácilmente el código para evitar que eso suceda.
‫Y también, voy a visitar un posible problema con el punto de generación del proyectil.
‫Así que entremos y pulamos este juego.
‫Ahora, lo primero que me gustaría mirar es el movimiento de la cámara.
‫Entonces, si sigo adelante y presiono reproducir, te mostraré lo que quiero decir.
‫A medida que me muevo, verá que la cámara sigue exactamente nuestro movimiento cuando giramos y, a medida
‫que avanzamos y retrocedemos, la cámara simplemente nos sigue automáticamente.
‫Ahora, hay un buen truco que podemos agregar a esta cámara que puede hacerla un poco más fluida.
‫Avancemos y abramos el tanque del estanque BP.
‫Ahora aquí en BP Pond Tank, voy a seleccionar nuestro componente de brazo de resorte.
‫Y si busco el retraso de la cámara, veré aquí en la sección de retraso, hay esta casilla de verificación para habilitar el retraso de
‫la cámara.
‫Voy a verificar eso y habilitar el retraso de rotación de la cámara.
‫Voy a comprobar eso también.
‫Ahora, esto nos permite hacer que la cámara se quede atrás y se ponga al día sin problemas, lo que crea un buen
‫tipo de efecto de cámara profesional.
‫Sigamos adelante, presionemos reproducir y probemos esto.
‫Observe que mientras me muevo, la cámara tarda un poco en ponerse al día mientras nos movemos.
‫Y lo mismo ocurre cuando estamos rotando.
‫Así que es como si hubiera un poco de inercia y la cámara estuviera en una especie de pista deslizante y se desacelerara
‫hasta detenerse.
‫Ahora podemos seleccionar el brazo de resorte y podemos cambiar la velocidad de retraso de la cámara y la velocidad de retraso de rotación.
‫Entonces, por ejemplo, si coloco esto en un valor más pequeño, digamos cinco y cinco en lugar de diez, ahora
‫veamos cómo se ve.
‫Así que me estoy moviendo y verás que la cámara tiene un poco más de retraso.
‫Ahora, podemos aumentar o disminuir esto como mejor nos parezca.
‫Esto es algo con lo que puede experimentar y encontrar los valores que funcionan para usted.
‫Aquí tenemos un valor de dos y para mí eso es demasiado retraso.
‫Así que creo que algo entre cinco y dos me funcionaría.
‫Si le gusta este tipo de valor, entonces tal vez lo mantenga en dos o incluso más bajo.
‫Pero voy a poner esto en un valor de, digamos, cuatro para la velocidad de retraso de la cámara y cuatro para la velocidad de retraso de la rotación
‫de la cámara.
‫Echemos un vistazo a cómo se ve eso.
‫Mientras me muevo, la cámara se retrasa.
‫Claramente hay algo de retraso en la cámara, pero no es demasiado.
‫Creo que esto realmente se ve bastante bien, así que estoy bastante satisfecho con eso.
‫Nuestro próximo elemento es el disparo de la torre después de que el tanque ya haya muerto.
‫Déjame seguir adelante y mostrarte lo que quiero decir.
‫Aquí vamos.
‫El tanque ha muerto y las torres siguen disparando.
‫Ahora, esto se debe a que el tanque todavía existe.
‫Y mientras esté dentro del alcance de fuego, las torres seguirán disparando.
‫Esto se maneja fácilmente al tener una especie de variable que podemos verificar para ver si el tanque ha muerto.
‫Así que voy a entrar en la clase de tanque aquí y tanque, y voy a agregar una variable booleana que podemos
‫verificar para ver si el tanque todavía está vivo.
‫Y lo haré público ya que planeamos acceder desde fuera de la clase.
‫Así que voy a hacer de esto una variable alcista llamada Be Alive, y la voy a establecer como verdadera
‫por defecto.
‫Entonces, el tanque comenzará en el estado vivo y luego, cuando el tanque muera, vivo se establecerá en falso.
‫Y eso puede suceder en el CP del tanque en la destrucción del mango.
‫Así que vamos a manejar la destrucción aquí.
‫Y después de establecer estas otras propiedades, estableceré B vivo igual a falso.
‫Entonces, dado que estamos configurando B vivo en falso, podemos saber si el tanque ha muerto y luego podemos simplemente
‫evitar disparar los proyectiles al verificar este valor booleano.
‫Así que vayamos a Tower Dot, CP y aquí en condición de control de incendio.
‫Podemos asegurarnos de que el tanque sigue vivo antes de disparar.
‫Así que primero voy a ver si el tanque es válido.
‫Voy a decir si el tanque es igual al puntero nulo, entonces simplemente regresaré temprano.
‫De esa manera, sabemos que Tank será válido y luego, en nuestra verificación para ver si estamos en
‫el rango de fuego, agregaré un y veré si Tank está vivo.
‫Si tanque.
‫Está vivo, entonces podemos disparar.
‫Si Tank no está vivo, no dispararemos.
‫Ahora, puede que se pregunte si es o no una buena idea poner el retorno en una sola línea como me
‫ha visto hacer en videos anteriores.
‫Y esta es una buena oportunidad para hablar sobre Unreal Engines, mejores prácticas de programación y recomendaciones.
‫Las prácticas de codificación de Unreal Engine recomiendan que tenga llaves con un cuerpo para todas sus declaraciones if,
‫incluso aquellas que tienen una sola declaración.
‫Y la razón es porque si planea agregar varias líneas de código a esto, entonces ya tiene el
‫cuerpo aquí.
‫Y también es más claro.
‫Y eso también me lleva a otro punto, que es mi uso de auto.
‫Utilicé auto aquí en la clase de proyectil un par de veces, y si bien esto puede ser eficiente, no
‫es tan obvio cuáles son los tipos a primera vista, por lo que tampoco se recomienda el uso de auto en prácticas
‫de codificación de motores irreales.
‫Si desea apegarse a las prácticas de codificación recomendadas por Unreal Engine, puede reemplazar estas instancias de
‫automático con el tipo real.
‫Por ejemplo, aquí, get instigator controller devuelve un controlador A para que podamos cambiarlo a un controlador y eso
‫es un puntero.
‫Esta clase estática de tipo de daño devuelve una clase U para que podamos usar su clase aquí y, por supuesto, obtener
‫el propietario aquí devuelve un actor para que podamos usar un actor en lugar de automático aquí y ahora si mira este código,
‫es mucho más obvio cuáles son estos tipos, mientras que auto simplemente enmascara todo y te permite ser
‫perezoso y salirte con la tuya sin escribir los tipos.
‫Ahora, a veces no estoy seguro de qué devuelve una expresión grande, así que usaré auto solo para ver
‫qué tipo es y luego lo reemplazaré con el tipo real.
‫Así que esa es otra forma en la que puedes usar auto para ayudarte a aprender los tipos devueltos por expresiones largas y complicadas
‫como esta.
‫Entonces, dado que estamos en las etapas de pulido, reemplazaré auto con los nombres de tipos reales
‫aquí en proyectil.
‫También voy a entrar en el peón base en la función de fuego donde tenemos este proyectil y esto se devuelve
‫desde esta gran expresión larga aquí.
‫El actor de Spawn devolverá un proyectil en este caso, así que puedo reemplazarlo con un proyectil.
‫Bueno.
‫Eso va a pulir el código en el lado de C++.
‫Sigamos adelante y compilemos esto.
‫Y con una compilación exitosa, regresemos al editor y vamos a presionar reproducir y asegurarnos
‫de que esas torres dejen de dispararnos después de que hayamos muerto.
‫Así que hay un golpe.
‫Hay otro, y estoy esperando, y no veo más proyectiles.
‫Perfecto.
‫Bueno.
‫Entonces, el último punto que me gustaría cubrir antes de terminar esto es el punto de generación del proyectil.
‫Ahora, seleccionemos eso aquí en BP Pond Tank y asegurémonos de que esté lo suficientemente alejado del
‫barril.
‫Antes de hacer eso, lo colocaré muy, muy cerca y le mostraré algunos problemas
‫que podrían surgir.
‫Ahora, mientras avanzo y hago clic con el botón izquierdo del mouse, verán que no veo el proyectil.
‫De hecho, no lo veo en absoluto porque está demasiado cerca.
‫Ya estamos teniendo una colisión.
‫Está siendo destruido antes de que pueda hacer algo.
‫Así que asegúrese de que esté bastante lejos del cañón.
‫Estamos generando algo de humo de todos modos, por lo que parecerá que un rastro de humo lo sigue.
‫Entonces esto todavía se verá bastante realista.
‫Eso se ve bastante bien.
‫Y mientras estamos en los puntos de generación de proyectiles, podría ser una buena idea ir y mirar la torreta del estanque
‫BP y seleccionar su punto de generación de proyectiles.
‫Y si ha tenido problemas para generar proyectiles desde la torreta, es
‫posible que también desee asegurarse de que esté a una buena distancia del cañón de la torreta.
‫Así que ahí lo tenemos.
‫Tenemos un juego funcional y se ve fantástico.
‫Tenemos la capacidad de rodar por el mundo, tenemos la capacidad de disparar proyectiles y hacer
‫estallar cosas.
‫Si golpeamos una torre, podemos destruirla.
‫Si la torre nos golpea, puede destruirnos.
‫Así.
‫Y tenemos condiciones de ganar y perder con widgets HUD que se muestran en la pantalla y nos dicen si hemos
‫ganado o perdido el juego.
‫Así que esto es fantástico.
‫Y si desea empaquetar este juego, puede hacerlo fácilmente subiendo a la parte superior y haciendo
‫clic en el ícono de plataformas para Windows, si está en una máquina con Windows o para iOS, si está usando
‫una Mac. máquina, entonces, por supuesto, tiene estas otras opciones.
‫Si desea empaquetar para otras plataformas, le recomiendo que investigue un poco en línea para buscar
‫las diferentes plataformas y cómo empaquetarlas.
‫Estoy en una máquina con Windows, así que simplemente puedo hacer clic en Empaquetar proyecto para Windows aquí y me
‫preguntará dónde me gustaría empaquetar mi juego.
‫Ahora tengo mi proyecto aquí en Tune Tanks.
‫Voy a hacer clic derecho, crear una nueva carpeta y simplemente voy a llamar a esta compilación.
‫Eso es típicamente donde colocaría un proyecto empaquetado.
‫Así que seleccionaré esa carpeta y permitiré que Unreal Engine empaquete mi juego.
‫Probablemente tomará unos minutos y una vez que esté listo, debería tener un juego empaquetado.
‫Bueno.
‫Entonces, una vez que haya terminado de empaquetar, deberíamos ver la compilación exitosa en el registro de salida y luego
‫podemos buscar en la carpeta que designamos para nuestro proyecto empaquetado.
‫Para mí, será esta carpeta de compilación.
‫Ahora empaqueté cuatro ventanas, así que tengo una carpeta de Windows y aquí están mis tune tanks, dot xy.
‫Es un ejecutable.
‫Puedo hacer doble clic en él y aquí está mi proyecto final.
‫puedo disparar
‫Puedo esquivar
‫Parece que mis torres enemigas pueden dispararme y yo puedo destruirlas.
‫Sí, puedo destruirlos.
‫Me pueden destruir, parece, y puedo perder el juego.
‫Y por supuesto, si tuviera un poco más de habilidad, podría ganar el juego.
‫Y para su desafío final, le pediré que agregue su propio sabor al juego.
‫Haz tuyo este juego.
‫Encuentre nuevos sonidos, efectos o mallas y cree algunas torres y tanques de aspecto funky.
‫Agregue más torres, tal vez agregue diferentes niveles de habilidad, haga que las torres sean cada vez más difíciles a medida que
‫avanza en su nivel.
‫Tal vez suba el nivel del tanque, dele un nivel que pueda aumentar a medida que destruye más y más torres.
‫Tal vez pueda agregar una nueva geometría de nivel y hacer que el tanque suba rampas e intente destruir tanques en áreas
‫difíciles de alcanzar.
‫Las posibilidades son infinitas, pero lo más importante, diviértete.
‫Mientras desarrollas tus juegos.
‫No vas a pausar el video para este desafío.
‫Esto va a ser algo que puedes hacer de ahora en adelante con tus proyectos de juegos.
‫Así que felicidades
‫Terminamos nuestro juego.
‫Espero que hayas disfrutado de esta sección.
‫Me divertí mucho.
‫Este es un gran proyecto de juego y has recorrido un largo camino.
‫Ha aprendido un montón de habilidades a lo largo de esta sección del curso, así que espero que esté listo
‫para pasar a cosas más emocionantes.
‫Muchísimas gracias.
‫Soy Steven y te veré pronto.