‫Entonces, si me acerco a nuestras torres, puedo ver que están dibujando esferas de depuración, lo que demuestra que están llamando
‫a la función de disparo y lo están haciendo cada 2 segundos.
‫Ahora, además de eso, solo están llamando a esta función.
‫Si estoy en el rango de tiro, si vuelvo aquí, notarán que no están dibujando esferas de depuración.
‫Así que esto también implica una verificación de distancia.
‫Y tan pronto como estoy lo suficientemente cerca, ahí van, dibujando esas esferas de depuración.
‫Hola y bienvenido de nuevo.
‫Ahora ya hemos creado una función de fuego y la estamos usando en la clase de tanque porque la hemos
‫vinculado al mapeo de acción de fuego.
‫Pero también nos gustaría reutilizar esto con la clase torre.
‫Ahora, en lugar de usar la entrada del usuario para la clase de torre, vamos a usar temporizadores.
‫Vamos a crear un temporizador para la clase de torre para que el temporizador pueda llamar a la función de disparo.
‫De vez en cuando estableceremos un número específico de segundos entre llamadas a la función de disparo.
‫Entonces, dado que nos gustaría que la función de disparo se llame de vez en cuando en la clase de torre, debemos hablar
‫sobre los temporizadores ahora.
‫Unreal Engine tiene la capacidad de establecer temporizadores usando una clase llamada F Timer Manager.
‫Existe un administrador de temporizador mundial que administra los temporizadores en el mundo.
‫Ahora, este administrador de temporizador mundial tiene una función llamada Establecer temporizador y establecer el temporizador toma una serie de entradas,
‫como un controlador de temporizador.
‫Este es un identificador de un temporizador específico administrado por el administrador del temporizador.
‫Esto le permite al administrador tener múltiples temporizadores y podemos acceder a la información del temporizador para cada uno usando el identificador
‫del temporizador como una especie de nombre o ID para ese temporizador.
‫Este es un objeto de manija de temporizador tipo F.
‫Así que creamos un controlador de temporizador y lo pasamos a la función de configuración del temporizador.
‫Ahora, configurar el temporizador también requiere otras entradas, como la velocidad o la cantidad de tiempo que debemos
‫esperar antes de hacer algo.
‫Ahora eso es algo que va a estar en nuestra función de devolución de llamada.
‫Creamos una función y vinculamos esta función al temporizador para que, tan pronto como haya transcurrido el tiempo suficiente, específicamente la
‫velocidad del temporizador, se pueda llamar a nuestra función de devolución de llamada.
‫Así que hemos visto que necesitamos algunas cosas para nuestro temporizador y vamos a colocar estas cosas en la clase de
‫torre.
‫Así que vayamos a la Torre H y aquí, en el archivo de la Torre H, vamos a agregar algunas variables privadas.
‫Así que justo debajo del campo de tiro, vamos a necesitar nuestro temporizador.
‫Entonces, este es un controlador de temporizador F y podemos simplemente llamarlo controlador de temporizador de velocidad de disparo.
‫Y también necesitamos una tasa de fuego que sea flotante.
‫Vamos a llamar a esta velocidad de disparo y podemos inicializarla en dos puntos F.
‫Entonces, de esa manera, tendremos una espera de dos segundos antes de que se llame a nuestra función de devolución de llamada.
‫Y hablando de funciones de devolución de llamada, en realidad necesitamos una.
‫Así que vamos a hacer una función nula y podemos llamar a esta condición de verificación de disparo.
‫Así que tenemos un identificador de temporizador y tan pronto como configuramos el temporizador y comienza a funcionar, entonces tenemos 2 segundos
‫para esperar antes de que el temporizador realmente haga que se llame a nuestra función.
‫Y estoy llamando a esta condición de verificación de fuego porque podemos verificar si nuestra torre debería poder llamar a la
‫función de fuego para que podamos establecer algunas condiciones que podemos verificar para asegurarnos de que se debe llamar
‫a fuego.
‫Ahora tenemos declarada la función de condición de incendio.
‫Necesitamos definirlo para que podamos ir a la torre CPP y definir la función aquí.
‫Lo colocaré debajo de Begin Play, así que le daré un cuerpo de función y un nombre de clase de torre justo antes del
‫nombre de la función.
‫Así que ahora tenemos una función, pero en realidad necesitamos configurar el temporizador para que ese tiempo comience a correr y
‫la función se llame al final de ese tiempo.
‫Y podemos configurar el temporizador aquí y comenzar a jugar para que comience a funcionar desde el comienzo del juego.
‫Así que mencionamos el administrador de temporizador mundial y podemos acceder a él con una función llamada Obtener administrador de
‫temporizador mundial.
‫Ahora obtenga World Timer Manager, devuelve un objeto de administrador de temporizador F.
‫Y dado que estamos usando ese tipo, necesitaremos incluir el archivo de encabezado para el administrador del temporizador F.
‫Así que aquí está la inclusión, es simplemente el administrador del temporizador h.
‫Y también podemos ver algunas de las funciones que pertenecen a esta clase.
‫Así que desplácese por estos si está interesado en todas las diferentes funciones que pertenecen al administrador de
‫temporizador F.
‫Entonces podemos incluir este archivo de encabezado aquí arriba en la parte superior de la torre, justo debajo de los otros incluidos.
‫Entonces, ahora que tenemos ese archivo de encabezado incluido, ahora tenemos acceso al administrador de temporizador mundial y
‫la función que nos interesa se llama establecer temporizador.
‫Ahora obtenga el administrador de temporizador mundial simplemente devuelve un administrador de temporizador F, no devuelve un puntero.
‫Así que vamos a usar el punto en lugar del.
‫Arrow y vamos a llamar set timer.
‫Ahora el temporizador configurado tiene varias versiones o sobrecargas de funciones.
‫Ahora vs code tiene esta ventana emergente que nos permite revisar cada sobrecarga y ver las diferentes versiones de
‫esta función.
‫Y la versión que me interesa primero toma un controlador de temporizador F y vamos a usar nuestro controlador de
‫temporizador de velocidad de disparo, que declaramos en la Torre H.
‫Ahora, el siguiente parámetro para nuestra sobrecarga de función particular será la clase de usuario, al igual que en el eje de
‫enlace y la acción de enlace.
‫Esta es la clase en la que estamos trabajando en la que estamos vinculando la función para la que será esto.
‫Ahora, lo siguiente será la función de devolución de llamada que será nuestra condición de incendio de verificación de torre A,
‫esa función que acabamos de crear.
‫Ahora necesitamos la dirección del operador porque el temporizador establecido toma la dirección de la función.
‫Ahora, el siguiente parámetro es un valor flotante para la tasa, esto será cuánto tiempo debe pasar antes de que se llame
‫a nuestra devolución de llamada.
‫Esa va a ser nuestra tasa de fuego.
‫Y el parámetro final es un valor booleano que especificará si este temporizador debe repetirse o no.
‫Ahora me gustaría que se llamara a nuestra función de devolución de llamada cada 2 segundos, así que quiero que este temporizador se repita.
‫Así que voy a decir verdad.
‫Si pasáramos en falso pasarían 2 segundos.
‫Nuestra función se llamaría y eso sería todo.
‫Pero como lo configuramos para que se repita, nuestra función se llamará después de 2 segundos, después de lo cual el
‫temporizador se reiniciará, y luego de dos segundos más, la función se llamará nuevamente y continuará en bucle
‫hasta que termine el juego.
‫Así que ahora tenemos una función vinculada a nuestro temporizador y está configurada para ser llamada cada 2 segundos.
‫Así que hemos vinculado una función a nuestro temporizador y se llamará cada 2 segundos.
‫Pero nos gustaría algún tipo de prueba o confirmación de que esta función realmente se está llamando.
‫Entonces, para su desafío en la clase de torre, ingrese a nuestra nueva función de devolución de llamada, verifique la condición del incendio.
‫Asegúrese de que el tanque esté en el rango de fuego.
‫Vas a comprobar la distancia desde la torre hasta el tanque.
‫Y sabemos cómo hacer esto porque ya lo estamos haciendo en la función tick.
‫Por lo tanto, es posible que deba mirar en la función de tic y ver cómo se hace esto para recordar,
‫ahora verifique esa distancia, asegúrese de que estemos dentro del rango de fuego, y luego, si lo estamos, llame a la función
‫de fuego, pause el video e implemente esto ahora.
‫Bueno.
‫Así que estoy de vuelta en Tower CP y solo voy a desplazarme hacia arriba hasta la función de marca para recordarme cómo llegué
‫a esta distancia y verifiqué si estaba dentro del alcance de fuego.
‫Ahora podríamos simplemente reutilizar este código aquí abajo y verificar la condición del fuego.
‫Ahora, reutilizar el código no es muy eficiente, por lo que podemos pensar en refactorizar esto, pero primero asegurémonos de que
‫esto funcione para que podamos verificar primero nuestro puntero de tanque para asegurarnos de que sea válido.
‫Así que voy a hacer eso aquí y verificar la condición del fuego.
‫Voy a decir si el tanque y si el tanque es válido, lo siguiente que podemos hacer es
‫obtener esa distancia, que es este valor aquí calculado con la función f vector dist.
‫Así que tomaré eso y lo colocaré aquí abajo en condiciones de verificación de fuego.
‫Ahora, lo siguiente que hacemos es verificar si la distancia es menor o igual que el alcance del fuego.
‫Así que eso es lo que haremos aquí abajo.
‫Diremos si la distancia es menor o igual que el alcance del fuego, y si ese es el caso, simplemente podemos llamar a
‫la función de fuego.
‫Así que vamos a llamar al fuego, y es tan simple como eso.
‫Así que sigamos adelante y compilemos esto y estamos de vuelta en el editor y voy a presionar reproducir y entrar en el
‫rango de tiro.
‫Y puedo ver que nuestras torres están dibujando esferas de depuración en la punta del barril para que podamos
‫ver que se está llamando a esa función de disparo y funciona de la misma manera para la torre que para el tanque.
‫Así que esto es genial.
‫Esto nos demuestra que nuestro temporizador se está ejecutando y nuestra función de devolución de llamada se llama cada 2 segundos.
‫Bien, entonces tenemos esta función de fuego llamada cada 2 segundos ahora en estado de control, fuego.
‫Tenemos esta funcionalidad en la que vemos si estamos dentro del rango y estamos haciendo exactamente lo mismo aquí en
‫la función de marca.
‫Así que esta es una oportunidad perfecta para refactorizar.
‫Podríamos crear algún tipo de función que nos devuelva un valor booleano si estamos dentro del alcance del tanque.
‫Entonces, ¿por qué no seguimos adelante y rápidamente refactorizamos esto en una función de retorno alcista?
‫Así que aquí en la Torre H, creemos una función privada.
‫Va a devolver bool y vamos a decir en rango de fuego.
‫Ahora, este es un juego simple y nuestra torre solo estará dentro del alcance del tanque.
‫Entonces, esto no es ambiguo porque no hay nada más que la torre quiera verificar para ver si
‫está dentro del rango ahora, si este fuera un juego más complicado con otras cosas para las que la
‫torre quisiera verificar la distancia, entonces podríamos nombre esto un poco diferente, pero simplemente podemos llamarlo
‫en el rango de fuego.
‫Y lo que voy a hacer es implementar esto aquí en Tower.
‫Así que sigamos adelante y creemos el cuerpo de la función.
‫Vamos a necesitar que una torre prefije el nombre de la función.
‫Y lo que vamos a hacer aquí es básicamente esta misma verificación de distancia.
‫Entonces, primero vamos a verificar para asegurarnos de que el tanque sea válido con una verificación if.
‫Ahora, si es así, entonces podemos obtener esta distancia para poder copiar esta línea y simplemente crear nuestro flotador de distancia local justo aquí
‫y simplemente comparar esa distancia con el rango de fuego para que podamos decir si la distancia es menor o
‫igual que el rango de fuego, y si ese es el caso, simplemente podemos devolver verdadero.
‫Esta función puede devolver el valor verdadero.
‫Y ahora tenemos una función a la que podemos llamar que devolverá verdadero si estamos dentro del rango.
‫Ahora, tan pronto como presionemos esta línea de retorno verdadero aquí en la instrucción if, la función regresará.
‫Saldremos de la función.
‫Entonces, cualquier otra cosa después de esta declaración if no se ejecutará.
‫Entonces, lo que podemos hacer es al final de nuestra función de rango de fuego, podemos devolver falso porque si alguna
‫vez alcanzamos el retorno verdadero, nunca llegaremos a la línea de retorno falso aquí abajo.
‫Simplemente saldremos temprano de la función.
‫Pero si no estamos dentro del alcance, si esta verificación de distancia aquí falla, entonces nunca daremos con el retorno verdadero.
‫Y llegaremos al final de la función y devolveremos false.
‫Entonces, esta función devolverá verdadero o falso en función de si estamos dentro del rango o no, y podemos usar esto
‫en lugar de usar código repetido en nuestras dos funciones.
‫Entonces, aquí arriba en tick, por ejemplo, solo necesitamos una sola verificación para ver si estamos dentro del alcance antes de girar la
‫torreta.
‫Entonces, lo que podemos hacer es decir si está en el rango de fuego y si esto es cierto, estamos en el rango de fuego para que podamos llamar
‫a la torreta giratoria.
‫Así que pondremos eso allí mismo en la instrucción if.
‫Y ahora todo este código es innecesario, así que simplemente podemos eliminarlo.
‫Y ahora esto se ve mucho más limpio que lo que teníamos antes.
‫Y luego podemos venir aquí y verificar las condiciones del incendio y hacer lo mismo.
‫En lugar de todo esto, simplemente podemos comprobar si está en el rango de fuego.
‫Y si lo somos, simplemente podemos llamar al fuego.
‫Así que ahora hemos refactorizado con éxito todo ese código en una verificación que se realiza en nuestra función de rango
‫de fuego.
‫Así que sigamos compilando esto de nuevo y simplemente juguemos a probarlo muy rápido para asegurarnos de que todo
‫funciona como se esperaba.
‫Así que vamos a seguir adelante y presionar reproducir y ponernos en el rango de fuego.
‫Y por supuesto, estamos en rango de tiro y está funcionando correctamente.
‫Entonces, en resumen, creamos un temporizador y cada 2 segundos llamamos a la función de disparo en la clase de
‫torre.
‫Ahora también estamos comprobando si Tank está dentro del alcance.
‫Por lo tanto, solo estamos llamando a la función de disparo cada 2 segundos si el tanque está dentro de la distancia de alcance del fuego.
‫Y también vimos que estábamos usando ese control de distancia en dos funciones diferentes.
‫Entonces lo refactorizamos en su propia función y simplemente lo llamamos para verificar si estamos dentro del rango.
‫Así que ahora tenemos una función de disparo llamada en la clase torre.
‫Lo siguiente que debe hacer es comenzar a generar proyectiles con nuestra función de disparo.
‫Así que vamos a hablar de eso en el próximo video.
‫Te veré pronto.