‫Hola y bienvenido de nuevo.
‫Ahora estamos listos para rotar la torreta y nos gustaría hacerlo usando el mouse.
‫Y esa ubicación de golpe del golpe de seguimiento que hemos hecho en el video anterior.
‫Entonces, mientras muevo el cursor del mouse, la torreta gira y mira en la dirección del cursor del mouse.
‫E incluso cuando hago clic en la ventana gráfica y empiezo a jugar, todavía puedo mover el cursor del
‫mouse para girar la torreta y establecer su dirección.
‫Esto me permitirá apuntar cuando tenga la capacidad de disparar proyectiles.
‫Bueno.
‫Entonces, para lograr esto, necesitamos encontrar la dirección hacia la que queremos que apunte nuestra torreta.
‫Y una vez que hayamos encontrado esa dirección, podemos establecer la rotación de la malla de la torreta.
‫Ahora, para obtener la dirección en la que nos gustaría que apunte la torreta, necesitamos hacer un poco
‫de matemática vectorial.
‫Lo que estamos buscando es un vector desde la torreta del tanque hasta nuestra ubicación de seguimiento.
‫Ahora podemos obtener fácilmente la ubicación de nuestro tanque o cualquiera de sus componentes, como la ubicación de la
‫torreta del tanque.
‫Llamaremos a esta ubicación, torreta, ubicación.
‫Y también sabemos cómo podemos obtener la ubicación del cabezal de seguimiento.
‫Llamaremos a esta ubicación de coincidencia de seguimiento.
‫Lo que nos interesa es el vector desde la ubicación de la torreta hasta la ubicación del golpe de seguimiento.
‫Llamaremos a este vector para apuntar.
‫Ahora, la matemática vectorial para llegar al objetivo es bastante simple.
‫Para obtener un vector desde un punto inicial hasta un punto final, siempre es el punto final menos el punto inicial.
‫Entonces, si tomamos nuestro rastro, golpeamos la ubicación y restamos la ubicación de la torreta del vector, entonces el vector
‫que resulta de esto es el objetivo.
‫Ahora, una vez que tenemos el vector de dirección de dos objetivos, queremos convertirlo en una rotación para poder
‫establecer la rotación de la torreta del tanque.
‫Y el tipo de vector tiene una función incorporada llamada rotación.
‫Entonces, si tomamos nuestro vector objetivo y lo llamamos rotación, esto devolvería un rotador F correspondiente a
‫esa dirección.
‫Ahora tenemos que tener algo en mente.
‫El resultado del golpe de seguimiento a menudo estará en el suelo y el vector desde la torreta del tanque hasta el
‫resultado del golpe de seguimiento no será paralelo al suelo.
‫Esto significa que si configuramos la rotación de la torreta del tanque al rotador que obtenemos de ese vector de
‫dirección, podríamos obtener algo como esto donde la torreta está inclinada hacia el suelo, pero no queremos que
‫la torreta del tanque gire hacia abajo.
‫Queremos que siga apuntando hacia adelante.
‫Así que este es el resultado que queremos.
‫En otras palabras, solo queremos cambiar el componente sí de la rotación de la torreta del tanque.
‫De esa manera, apunta en la dirección correcta pero aún permanece paralelo al suelo.
‫Solo hemos cambiado su guiñada, así que regresemos al código VS y creemos una función para rotar la torreta del
‫tanque.
‫Ahora vamos a rotar la torreta en el tanque, pero también nos gustaría rotar la torreta
‫en nuestra torre enemiga y la torre pronto se creará derivada de base pon, lo que significa que si creamos
‫una torreta giratoria función podemos colocarlo aquí en la clase base pong.
‫Así, tanto el tanque como la torre heredarán esta función.
‫Como planeamos usarlo tanto en la torre como en el tanque, podemos proteger esta función.
‫Así que voy a agregar una sección protegida y todas las funciones y variables que coloquemos en la sección
‫protegida serán accesibles en estas clases secundarias, pero no en ninguna otra clase.
‫Entonces es casi tan restringido como las variables privadas.
‫Ahora esta función puede devolver vacío.
‫Voy a llamar a esto torreta giratoria.
‫Y para rotar la torreta, voy a necesitar una especie de destino para mirar.
‫Este puede ser un vector f y podemos llamarlo mirar al objetivo.
‫Entonces, la idea es que si tenemos una función que podemos pasar en algún tipo de ubicación en el mundo, entonces la
‫función debería resultar en la rotación de la torreta hacia esa ubicación.
‫Así que sigamos adelante y proporcionemos una definición de función para rotar torreta.
‫Así que aquí en el CP de peón base, justo debajo del constructor, voy a implementar la rotación de la torreta.
‫Y, por supuesto, necesito el nombre de una clase de peón base con el operador de resolución de alcance aquí.
‫Así que ahora que tengo la torreta giratoria, pensemos en cómo vamos a implementar esto.
‫Lo primero que necesitamos es apuntar al vector el vector desde el componente de la torreta hasta el resultado del golpe de seguimiento
‫debajo del cursor del mouse.
‫Entonces, este puede ser un vector F local llamado al objetivo y lo vamos a igualar al resultado de algunas
‫matemáticas vectoriales.
‫Recuerda, será el destino menos el punto de partida.
‫Y el destino es mirar al objetivo y el punto de partida será la ubicación de la torreta del tanque, en otras
‫palabras, la ubicación de la malla de la torreta.
‫Entonces podemos decir malla de torreta y podemos obtener la ubicación de la malla de torreta.
‫Ahora, la forma de obtener la ubicación mundial de un componente es con esta función obtener la ubicación del componente.
‫Pertenece a la clase de componente de escena de uso.
‫Entonces todos los componentes de la escena lo tienen.
‫Entonces, desde la malla de la torreta, llamaremos a obtener la ubicación del componente.
‫Mirar el objetivo menos la ubicación de la malla de la torreta nos da el vector desde la malla de la torreta hasta el objetivo
‫de observación.
‫Ahora, como mencioné, podemos obtener un rotador EF desde el objetivo usando la función de rotación de vectores F.
‫Así que vamos a hacer un rotador F y podemos llamar a este mirar rotación y lo estableceremos
‫igual a la rotación del punto objetivo.
‫Esa es una llamada de función.
‫Así que ahora tenemos el rotador correspondiente a este vector de dirección objetivo.
‫Pero la cosa es que solo nos importa el YA.
‫No queremos cambiar el tono o el papel.
‫Solo queremos rotar la torreta alrededor del eje z y mantenerla paralela al suelo.
‫Ahora podemos hacer esto de muchas maneras.
‫Por un lado, podemos echar un vistazo a la rotación, el cabeceo y ponerlo a cero.
‫En otras palabras, igualarlo a cero.
‫También podemos echar un vistazo al rol del punto de rotación y ponerlo a cero también.
‫Ahora, después de haber establecido cabeceo y alabeo en cero, tenemos la rotación que queremos, que es solo el componente.
‫Esta es una manera de hacerlo.
‫Otra sería usar una de las sobrecargas del constructor del rotador F.
‫Si dijimos f rotator entre paréntesis y pasamos algunos valores como cero punto F para el primero y la ventana emergente me
‫dice que esa primera entrada es el tono.
‫Y luego, para el ya, podemos usar para apuntar a la rotación.
‫Sí.
‫Y luego, para el rol, podríamos usar cero punto F.
‫Ahora, lo que esto hace es crear un nuevo rotador F con cero para el tono, cero para el rol y el
‫componente del rotador devuelto por la rotación de dos objetivos.
‫Entonces, el valor devuelto por esto nos daría el mismo resultado que lo que hicimos aquí con estas tres líneas.
‫Entonces, dado que esto es un poco más compacto y elegante, creo que preferiría usar esto para que podamos
‫inicializar la mirada en el vector de rotación con el rotador F devuelto llamando al constructor del rotador F de esta manera.
‫Así que voy a eliminar esta línea aquí abajo.
‫Y ahora hemos mirado la rotación.
‫Ahora, lo último que debe hacer en esta función es establecer la rotación para el macerado de la torreta.
‫Ahora podemos configurar la rotación para un componente dado usando esta función de configuración de rotación mundial nuevamente, pertenece al componente
‫de escena de uso.
‫Y la razón por la que usamos la rotación de palabra establecida en lugar de agregar algún tipo de compensación de
‫rotación local es porque tenemos una rotación en el espacio mundial dos, el objetivo es un vector de dirección del espacio mundial.
‫Estamos tomando la ubicación de la malla de la torreta en el espacio mundial y restando la mirada a la ubicación del objetivo en
‫el espacio mundial.
‫Así que esta es una dirección espacial mundial.
‫Por lo tanto, la mirada a la rotación es una rotación del espacio mundial.
‫Así que vamos a usar la rotación mundial establecida en la malla de la torreta.
‫Así que diremos malla de torreta, estableceremos la rotación mundial y pasaremos a mirar la rotación.
‫Así que ahora tenemos una función que puede tomar cualquier objetivo en el mundo y girar la malla de la torreta
‫para mirarlo, pero no rotará la malla hacia abajo.
‫Solo va a cambiar su guiñada, por lo que girará de la forma en que debería girar la torreta de un tanque.
‫Así que ahora tenemos una función para rotar la torreta.
‫Voy a desafiarte a que llames a esta función para configurar la rotación de la torreta, llama a la función de rotación de
‫la torreta en la clase de tanque.
‫Esta es una función protegida.
‫Entonces la clase de tanque tiene acceso a él.
‫Ahora rotar la torreta toma un vector F, la mirada al objetivo, vas a usar ese punto de impacto en el resultado del
‫golpe F de nuestra traza de línea.
‫Así que voy a dejar que usted encuentre el lugar correcto en el código para llamar a esta función.
‫Así que pausa el video y coloca la función de girar la torreta.
‫Llame a la clase de tanques.
‫Bueno.
‫Así que tenemos nuestra función de rotación de torreta y estamos listos para llamarla.
‫Voy a subir el tanque y aquí está mi función de verificación dentro de la comprobación de si la referencia del controlador del jugador.
‫Tengo mi resultado de acierto y después de que se haya invocado un resultado de acierto debajo del cursor, el resultado de acierto
‫tendrá datos válidos.
‫De hecho, estamos usando ese punto de impacto de resultado de golpe y dibujar esfera de depuración.
‫Ahora que ya no necesito dibujar la esfera de depuración, continuaré y la eliminaré.
‫Y en su lugar voy a llamar a nuestra función protegida "rotar torreta".
‫Y para mirar el objetivo, voy a pasar el punto de impacto del punto del resultado del golpe.
‫Así que ahora en cada cuadro vamos a rotar la torreta hacia ese punto de impacto de nuestro resultado de golpe.
‫Ahora, antes de compilar esto, ya no estoy usando ayudantes de depuración de dibujo, así que continuaré y eliminaré ese
‫archivo de encabezado.
‫Bueno.
‫Ahora estoy listo para compilar.
‫Bueno.
‫Estoy de vuelta aquí en el editor.
‫Sigamos adelante, presionemos reproducir y echemos un vistazo.
‫Esto es increíble.
‫Todavía puedo rodar.
‫Puedo mover el mouse y la torreta gira donde quiera que mueva el cursor del mouse.
‫Así que esto es increíble.
‫Bien, antes de terminar con esto, me gustaría abordar un par de cuestiones.
‫Quiero que esto sea agradable y pulido y se vea genial.
‫Ahora, el primer problema ocurre cuando muevo el cursor del mouse cerca del centro del tanque y
‫luego lo atravieso.
‫Verás que en algún momento esa rotación se ajusta muy rápidamente.
‫Y si movemos el mouse de manera desordenada, bueno, eso no se ve muy bien.
‫Se está rompiendo.
‫No tenemos un movimiento fluido.
‫Así que ese es un problema.
‫Ahora, el otro problema es que si hago clic y doy la vuelta y subo al borde, veré que mi torreta se rompe en
‫la otra dirección cuando muevo el cursor del mouse hacia arriba.
‫Entonces, ¿qué está pasando allí?
‫Bueno, averigüémoslo.
‫Volveremos a VS Code y me gustaría recuperar mi esfera de depuración.
‫Así que de vuelta aquí en Tank, voy a ir a la función de tic justo antes de girar la torreta y
‫una vez más voy a llamar a dibujar esfera de depuración.
‫Ahora, para el mundo que estoy pasando obtener mundo para el centro que estoy pasando en punto de impacto de punto
‫de resultado de golpe para el radio, usaré 25 puntos Los segmentos F pueden ser 12, el color puede ser F El color rojo Las líneas persistentes
‫pueden ser falsas y la vida puede ser negativa.
‫Así que lo mismo que hicimos antes.
‫Así que me voy a guardar este aviso.
‫No estoy agregando el archivo de encabezado nuevamente allí y eso es porque los ayudantes de depuración en realidad están incluidos de manera predeterminada,
‫por lo que técnicamente no los necesitamos.
‫Solo voy a guardar, volver al editor, hacer un inicio de codificación en vivo y presionar reproducir.
‫Así que ahora tengo mi esfera de depuración.
‫Así que vayamos al borde del mundo y voy a mover el cursor del mouse hasta
‫donde cae al abismo.
‫Y ahí es donde tenemos el problema.
‫Verá, no tenemos un resultado de acierto debajo del cursor cuando nuestro cursor se mueve hacia arriba porque no hay nada
‫allí de lo que podamos obtener un resultado de acierto.
‫Por lo tanto, nuestro punto de impacto no está definido.
‫Entonces, lo que necesitamos es algo para que ese trazo de línea llegue.
‫Ahora, Unreal Engine tiene muchas herramientas que podemos usar.
‫Lo que voy a hacer es hacer clic en el menú desplegable aquí arriba y abrir el panel del actor de mi lugar y
‫seleccionar este ícono que dice volúmenes y obtener un volumen de bloqueo.
‫Aquí está el volumen de bloqueo.
‫Voy a arrastrar uno directamente.
‫Así que ahora tengo este volumen de bloqueo.
‫Ahora, de forma predeterminada, se supone que los volúmenes de bloqueo son invisibles.
‫Si voy al panel de detalles para esto y me desplazo hacia abajo hasta
‫colisión, veo que Collision Presets es Invisible Wall, lo que parece sugerir que debería bloquear casi todo.
‫Lo único que no está bloqueando es el canal de visibilidad y nuestro trazado de línea se está
‫trazando contra el canal de visibilidad.
‫Cualquier cosa en nuestro mundo que bloquee el canal de visibilidad será golpeada por nuestro rastro de línea.
‫Pero este volumen en particular no lo hará.
‫Se supone que es invisible.
‫Bueno, podemos ir a los ajustes preestablecidos de colisión, abrir el menú desplegable y seleccionar personalizado.
‫Esto nos permitirá cambiar eso para que pueda establecer la respuesta de colisión al canal de visibilidad.
‫es un bloque
‫Así que ahora tengo un volumen invisible, pero está configurado para bloquear el canal de visibilidad, lo que significa que los
‫trazos de línea que se trazan contra el canal de visibilidad como el nuestro lo van a alcanzar.
‫Entonces, lo que puedo hacer es tomar este volumen de bloqueo y escalarlo.
‫Lo pondré un poco más allá de la pared.
‫De hecho, puedo colocarlo justo aquí en los límites de la pared, y lo bajaré un poco
‫para que se superponga con la pared.
‫Y de esa manera tenemos esta barrera invisible aquí, y voy a seguir adelante y escalarla también
‫en la dirección Y.
‫Así que lo haré bonito y grande y lo colocaré en el medio aquí y le daré un poco de relleno.
‫Y también voy a escalarlo hacia arriba en la dirección Z.
‫Así que ahora es agradable y grande y nuestro trazado de línea debería alcanzarlo.
‫Así que vamos a probar esa teoría.
‫Hagamos clic en la ventana gráfica y subamos a la pared.
‫Y, por supuesto, estoy alcanzando ese volumen de bloqueo con mi línea de seguimiento y no tengo ese problema en el
‫que mi torreta se ajusta para buscar en una ubicación indefinida.
‫Probablemente esté mirando hacia el origen del mundo porque ese vector de punto de impacto es todo ceros.
‫Ahora, si subo a esta pared, tengo el mismo problema.
‫Así que necesitamos estos volúmenes de bloqueo.
‫Todo el perímetro de nuestro nivel.
‫Ahora, eso puede ser bastante fácil.
‫Todo lo que necesito hacer es duplicar este volumen de bloqueo.
‫Ahora puedo cambiar de la vista en perspectiva a la vista ortográfica superior.
‫Así que voy a seleccionar la parte superior y desplazarme con la rueda del mouse y simplemente mantener presionada la tecla Alt y
‫duplicar esta pared y colocar una aquí y puedo presionar E para entrar en el modo de rotación.
‫Así que voy a mantener presionada la tecla Alt y rotar 90 grados.
‫Eso me dará una copia y luego presionaré doble u y activaré mi modo de traducción y lo moveré
‫aquí hacia este lado y mantendré presionada la tecla Alt y arrastraré una copia hacia ese lado.
‫Así que ahora tenemos cuatro paredes.
‫Ahora puedo volver de la vista superior a la perspectiva y presionar reproducir, y ahora puedo subir a cualquiera
‫de estas paredes y no importa qué pared esté cubierta, así que se ve genial.
‫Así que eso soluciona uno de nuestros problemas.
‫Pero, ¿y este otro?
‫Si movemos el mouse cerca de nuestro tanque, todavía tenemos este comportamiento esporádico.
‫Así que me gustaría encargarme de eso también.
‫Ahora, la forma en que puedo encargarme de esto es interpolando esa rotación.
‫Entonces, en lugar de establecer este valor de rotación directamente, podemos usar una función
‫de interpolación que esencialmente moverá esa rotación hacia el objetivo que proporcionamos de manera suave.
‫Así que vamos a ver cómo funciona eso.
‫Ahora, me gustaría que esta interpolación esté en nuestra función de rotación de torreta para que podamos volver
‫a la base del peón hacia abajo para rotar la torreta, y en lugar de establecer nuestra rotación mundial para que la
‫torreta mire la rotación, podemos establecerla igual a la valor devuelto por una función de interpolación.
‫Así que voy a eliminar, mirar la rotación y, en su lugar, vamos a llamar a una
‫función en la biblioteca matemática F llamada R inter two.
‫Ahora nuestro en dos está diseñado para manejar la interpolación para rotadores.
‫Ahora su primer parámetro de entrada es una referencia de rotador const F llamada actual.
‫Ese es el valor actual de lo que estamos tratando de cambiar.
‫Lo que estamos tratando de cambiar es la rotación de nuestras torretas y podemos obtener eso de nuestra red de torretas.
‫Así que diremos malla de torreta y la función que queremos usar es obtener rotación de componentes.
‫Es muy parecido a obtener la ubicación del componente, solo que obtiene la rotación.
‫Ahora la siguiente entrada es un rotador F llamado Target.
‫Ese es el valor.
‫Queremos que esta rotación de la malla de la torreta se interprete para que se acerque sin problemas.
‫Esa va a ser nuestra mirada a la rotación.
‫Así que voy a decir mira la rotación.
‫La siguiente entrada es el tiempo Delta.
‫Entonces sabemos la importancia del tiempo Delta.
‫Si estamos moviendo cosas o rotando cosas, queremos que ese movimiento sea independiente de la velocidad de fotogramas.
‫Entonces, para eso, podemos obtener el tiempo Delta.
‫Simplemente puedo incluir estadísticas de juego y, si tienes buena memoria, recordarás que la inclusión
‫es estática de juego kismet slash.
‫Así que obtendré estadísticas del juego aquí para poder acceder a la función estática, obtener segundos delta mundiales y recordar
‫que esto requiere un objeto de contexto mundial.
‫Así que voy a pasar esto a eso.
‫Y por último, necesitamos una velocidad interna.
‫Cuanto mayor sea el valor de la velocidad interna, más rápido interpolaremos hacia el objetivo.
‫Entonces, si configuro esto en un valor de, digamos, cinco F, entonces interpolaremos con bastante lentitud.
‫Veamos cómo se ve esto ahora.
‫Todo esto está en una sola línea y se ejecuta fuera de la pantalla.
‫Entonces, lo que voy a hacer es colocar la entrada para establecer la rotación mundial en su propia línea de esta manera.
‫Así que así.
‫Y luego nuestro intérprete, que tiene estos cuatro parámetros de entrada también ejecutándose fuera de la pantalla.
‫Así que voy a ponerlos cada uno en sus propias líneas.
‫De esa manera podemos ver todas las entradas sin tener que desplazarnos fuera de la pantalla de esa manera.
‫Está bien.
‫Voy a seguir adelante, guardar eso y comenzar la codificación en vivo.
‫Y ahora, si presiono reproducir y muevo el mouse, observe que la rotación demora un tiempo.
‫Eso es porque estamos interpolando sin problemas hacia esa rotación objetivo.
‫Ahora, esto es genial.
‫Eso es exactamente lo que quería.
‫No importa cómo mueva el mouse, nunca obtendré ese movimiento brusco y esporádico.
‫Ahora, cinco es una velocidad de Internet terriblemente lenta, pero podemos cambiar eso.
‫Podemos hacerlo un poco más rápido.
‫Voy a establecer esto en 25, ver cómo se ve, y te dejaré seguir adelante y decidir el valor que te
‫gusta para tu juego.
‫Entonces, una vez más, inicie la codificación en vivo y presione reproducir.
‫Ahora tengo una interpolación bastante rápida, pero no se ajusta.
‫Todavía es rápido, pero no es un chasquido instantáneo.
‫Entonces, mientras no hagamos algo como esto, bueno, no lo conseguiremos.
‫Comportamiento loco.
‫Y, por supuesto, si desea una rotación más lenta, ya sabe cómo hacerlo y hemos terminado con la esfera
‫de depuración dibujada, así que continuaré y eliminaré eso.
‫Bueno.
‫Entonces, en resumen, hemos establecido la rotación de la torreta y estamos pasando un vistazo a Target, que es un
‫vector F correspondiente a un punto en el mundo.
‫En este momento, solo estamos usando el resultado de la coincidencia de rastreo.
‫Ahora colocamos esta función en la clase base pong y la hicimos protegida, lo que significa que
‫pudimos heredar la función en la clase tank.
‫Y una vez que estemos listos para crear una clase de torre basada en la base, esa clase de
‫torre heredará esta función de rotación de torreta y podremos reutilizarla.
‫Todo lo que tenemos que hacer es pasar.
‫En una nueva mirada a Target, trabajaremos en la creación de una clase de torre derivada de la base, en las
‫próximas conferencias.
‫Te veré pronto.