‫Hola y bienvenido de nuevo.
‫Ahora estamos moviendo nuestro tanque hacia adelante y hacia atrás, pero no tenemos forma de dirigir el tanque.
‫Entonces, en este video, vamos a trabajar para girar el tanque usando algo llamado rotación local.
‫Este es el análogo rotacional para agregar el desplazamiento local del actor.
‫Ahora agregar el desplazamiento local del actor tenía múltiples parámetros de entrada y solo pasamos el primero ya que los
‫otros tres eran opcionales.
‫Pero uno de esos otros tres tenía que ver con barrer.
‫Y vamos a discutir un poco sobre el barrido antes de continuar implementando la rotación.
‫Así que estoy de vuelta en la documentación de ADD Actor Local Offset.
‫Así que echemos un vistazo a estos parámetros de entrada una vez más.
‫El segundo se llama B Sweep y es un booleano.
‫Ahora, si nos desplazamos hacia abajo un poco más y leemos la información aquí para el barrido
‫B, dice Si barrimos hacia la ubicación de destino, provocando superposiciones en el camino y deteniéndonos antes del objetivo
‫si algo lo bloquea.
‫También continúa diciendo que solo se barre el componente raíz y se verifica si bloquea la colisión.
‫Los componentes secundarios se mueven sin barrer.
‫Si la colisión está desactivada, esto no tiene ningún efecto.
‫Entonces, hablemos de lo que esto significa ahora en la programación de juegos, el barrido es una técnica realizada por el motor, siempre
‫que el barrido esté habilitado.
‫Si tenemos un objeto en movimiento como una esfera representada por este círculo, cada cuadro como esta esfera se
‫mueve, el motor está realizando comprobaciones de barrido.
‫Esto significa que está verificando si ese movimiento para este marco en particular habría resultado en una superposición
‫entre dos objetos.
‫Así que tengo este bloque aquí representado por este rectángulo.
‫Ahora consideremos que estos son los únicos dos objetos en el mundo.
‫Entonces, mientras el barrido está habilitado a medida que la esfera se mueve hacia el objeto, el motor
‫verifica si estos dos objetos se superponen.
‫Ahora, a medida que la esfera continúa moviéndose, digamos que durante uno de estos fotogramas, la esfera se habría movido
‫de tal manera que se superpone al otro objeto.
‫Ahora, lo que hace el barrido habilitado es que el motor detectará esta superposición y moverá esa esfera
‫hacia ese marco en particular para que nunca penetre en el objeto.
‫Ahora nunca vemos que la esfera penetre en el objeto.
‫El motor detecta esa superposición antes de que se implemente realmente el movimiento.
‫Entonces, el resultado es que vemos que la esfera se detiene justo antes de superponerse.
‫Entonces, si este rectángulo fuera una pared, por ejemplo, la esfera se detendría en la superficie de la pared.
‫Eso es lo que consigue barrer para nosotros.
‫Ahora la documentación dice que si la colisión está desactivada, esto no tiene efecto.
‫Por lo tanto, la colisión debe estar habilitada para que funcione el barrido.
‫Entonces, de vuelta aquí en tanks CP en la función de movimiento, aquí está nuestra llamada para agregar el desplazamiento local del
‫actor y, si queremos, podemos pasar otro parámetro de entrada aquí, el segundo es el booleano de barrido para que
‫podamos pasar aquí.
‫Entonces, compilemos esto y veamos el efecto de habilitar el barrido.
‫Ahora bien, si pulsamos play e intentamos movernos a través de una pared, por ejemplo, veremos que nos movemos justo a través de
‫la pared.
‫Así que algo no está funcionando del todo aquí.
‫Ahora veamos cuál es ese componente de ruta para el tanque del estanque de BP.
‫Recuerde, usamos el componente de la cápsula para la ruta.
‫Lo mismo ocurre con los componentes de la cápsula seleccionados en el tanque de estanque BP.
‫Vayamos al panel de detalles y desplácese hacia abajo y veremos aquí una sección llamada Colisión.
‫Y aquí vemos Collision Presets y tiene un menú desplegable.
‫Así que ampliemos eso.
‫Ahora, los ajustes preestablecidos de colisión se pueden configurar en cualquier cantidad de opciones y, de forma predeterminada, vemos superposición de todas las dinámicas.
‫Ahora, dependiendo de la versión de Unreal Engine que estés usando.
‫Es posible que vea algo más aquí, pero podemos cambiar esto.
‫Si seleccionamos el menú desplegable y elegimos bloquear todo dinámico, entonces las opciones atenuadas a continuación cambian.
‫Recuerde que estábamos superponiendo todas las dinámicas y aquí vemos tres columnas de casillas de verificación.
‫Estas son respuestas de colisión y la columna de la izquierda muestra una lista de tipos de objetos de colisión.
‫Entonces, cualquier componente dado tiene su propio tipo de objeto de colisión.
‫Observe que podemos ver el tipo de objeto para la cápsula establecida en dinámica mundial.
‫Y cuando cambiamos los ajustes preestablecidos de colisión para bloquear todas las dinámicas, verá que todas las
‫respuestas de colisión se verifican para bloquear en respuesta a todos los demás tipos de objetos de colisión.
‫Entonces, presionemos play y veamos qué sucede cuando tratamos de pasar cosas.
‫Verá que nos detenemos justo antes de superponernos.
‫Los otros estanques.
‫Ahora, si muevo el tanque para que podamos intentar superponernos con la pared y rodear los otros
‫estanques.
‫Ahora, si presiono play, bloqueo la pared también.
‫Entonces, este bloque preestablecido de colisión, todo dinámico, establece la respuesta de colisión para bloquear todos los demás tipos de objetos.
‫Y siempre puede ver el tipo de objeto de colisión de un componente en particular seleccionándolo en el panel de componentes
‫y desplazándose hacia abajo hasta la sección de colisión en el panel de detalles y abriendo el menú desplegable para Ajustes
‫preestablecidos de colisión.
‫Tengo la malla base seleccionada y su tipo de objeto es dinámico mundial y está configurado para bloquear todo.
‫Entonces ahora vemos que el barrido está funcionando ya que configuramos nuestros ajustes preestablecidos de colisión para que la composición de la cápsula bloquee
‫toda la dinámica.
‫Y vimos en la documentación que solo el componente raíz se barre y se verifica si bloquea la colisión.
‫Por lo tanto, realmente no importa en qué estén configurados los otros componentes.
‫Solo estamos comprobando si el componente raíz está bloqueando algo.
‫Ahora, un problema que ha hecho tropezar a algunos estudiantes es que no pueden moverse tan pronto como configuran la
‫cápsula para bloquear toda la dinámica.
‫Ahora, una de las razones de esto podría ser que su cápsula se superponga con el piso.
‫Si la cápsula se superpone con el piso, no podrá moverse porque el motor no
‫permitirá que su tanque se mueva si el componente de la cápsula se superpone con algo que está configurado para bloquear.
‫Entonces, una solución fácil para esto sería asegurarse de que su cápsula no se superponga con el piso.
‫Ahora, puedes entrar en tu tanque de BP y asegurarte de que tu cápsula esté justo encima de las ruedas aquí.
‫Voy a ir a la vista ortográfica.
‫Y seleccione mi malla base y bájela.
‫Entonces, las ruedas están justo debajo del componente de la cápsula.
‫Entonces, si su malla está justo en el piso y la cápsula está justo encima de la malla.
‫Deberías poder moverte.
‫Así que voy a darle al play y ahí vamos.
‫Así que ahora que nos hemos quitado de en medio, es hora de comenzar a implementar la rotación.
‫Volvamos a la configuración de nuestro proyecto.
‫Así que vamos a editar la configuración del proyecto, nos desplazamos hacia abajo hasta la entrada y en la sección de entrada tenemos nuestras asignaciones de ejes.
‫Ahora ya nos hemos ocupado.
‫Muévete hacia adelante.
‫Es hora de ocuparse del siguiente llamado Giro y Giro tiene D y A asignados, donde D tiene una escala de
‫uno y A tiene una escala de uno negativo.
‫Nos gustaría usar D y AX para rotar el tanque.
‫Entonces, para vincular una función al mapeo del eje de giro, necesitamos una función para vincular.
‫Así que estamos de vuelta en el código de V y voy a entrar en el archivo del tanque para que podamos crear una función para enlazar con
‫ese mapeo del eje de giro.
‫Ahora voy a llamar a esta función nula girar y mover.
‫Necesita un parámetro de entrada flotante y llamaremos a este valor.
‫Así que hemos declarado esta función, definámosla y agreguemos CP y la pondré justo debajo de la
‫función de movimiento.
‫Así que le di un cuerpo de función y necesito el nombre de la clase junto con los dos puntos justo antes del nombre
‫de la función.
‫Ahora tenemos una función adecuada.
‫Ahora, esto no es lo único que tenemos que hacer.
‫Necesitamos asegurarnos de que esta función esté vinculada al mapeo de ejes llamado giro.
‫Lo hacemos en el componente de entrada del reproductor de configuración y lo hacemos igual que hicimos con el mapeo del eje de avance.
‫Así que vamos a decir componente de entrada del jugador, vamos a usar el operador de flecha y el eje de enlace.
‫Ahora, el primer parámetro será el nombre del mapeo del eje envuelto en una macro de texto.
‫Así que vamos a decir girar, ya que ese era el nombre del mapeo de ejes.
‫El siguiente es el objeto para el que vinculamos la función.
‫Podemos pasar esto y finalmente pasamos la función que nos gustaría vincular nuevamente.
‫Necesitamos la dirección del operador y será un turno de tanque.
‫Así que es tan fácil como eso.
‫Hemos vinculado la función de giro al mapeo del eje de giro.
‫Lo único que queda es hacer algo en la función de giro.
‫Ahora hemos visto que tenemos el desplazamiento local del actor AGREGAR, pero hay una rotación análoga a esta función
‫y se llama rotación local del actor AGREGAR.
‫Lo que esto hace es agregar una rotación local al actor como sugiere su nombre, y verá que hay
‫dos versiones diferentes de la función, una que toma un rotador F y otra que toma algo
‫llamado F quad.
‫Vamos a utilizar la versión que lleva un rotador F.
‫Se llama rotación Delta.
‫Y al igual que ADD Actor Local offset, también puede tomar un parámetro de barrido y los mismos otros dos parámetros de
‫entrada como add actor local offset.
‫Y estos últimos tres parámetros de entrada son opcionales, al igual que agregar el desplazamiento local del actor.
‫Entonces, en lugar de un vector F, vamos a pasar un rotador F.
‫Ahora, de vuelta aquí en la función de giro, si creamos un rotador F y lo llamamos rotación Delta, veremos que
‫si hacemos clic con el botón derecho en el rotador F y vamos a la definición, nos llevará al rotador
‫y veremos tres variables miembro públicas aquí de tipo float.
‫Ahora, al igual que el rotador F vector F tiene estos tres componentes solo en lugar de X, Y y Z,
‫tenemos cabeceo, guiñada y balanceo.
‫Ahora, la guiñada es el componente que nos interesa.
‫Dice rotación alrededor del eje superior entre paréntesis alrededor del eje Z.
‫Y ese es el único tipo de rotación que nos interesa rotar alrededor del eje Z.
‫Así es como podemos dirigir nuestro tanque.
‫Ahora, solo voy a señalarles que también hay múltiples constructores para el rotador F, y que el valor
‫predeterminado nuevamente dice que no hay inicialización, al igual que con el vector F.
‫Entonces, podemos usar el que toma un solo valor flotante y todos los componentes se inicializarán con ese
‫valor flotante.
‫Hay uno con tres valores flotantes y puede echar un vistazo y ver algunos de los otros.
‫Ahora, también señalaré que hay un rotador cero y, por cierto, este es un rotador cero estático.
‫Es por eso que podemos volver al CP del tanque y decir algo como es igual a F rotador cero rotador cero rotador es una variable
‫miembro estática y puede acceder a funciones miembro estáticas y variables como esta especificando el nombre de la clase con
‫el operador de resolución de alcance y haciendo referencia a esa estática variable o función por
‫nombre.
‫Eso es lo que estamos haciendo aquí contigo.
‫La estática del juego obtiene segundos delta mundiales es una estática.
‫Función, lo que significa que no necesitamos una instancia real de la clase estática del juego para que
‫podamos acceder a esa función estática.
‫Simplemente ya existe.
‫Lo mismo con rotador cero y vector cero.
‫Así que voy a cerrar el rotador h y tenemos esta rotación delta y se inicializa en un rotador
‫cero.
‫Ahora su tono y rol se ponen a cero al igual que X, Y y Z se ponen a cero para el vector F.
‫Así que vamos a tener que cambiar ese componente.
‫Entonces, al igual que hice con nuestra ubicación delta en la función MOV, creemos un pseudocódigo para las rotaciones
‫delta.
‫Sí, vamos a querer que todos estén configurados en un valor escalado por el tiempo Delta, por supuesto, porque queremos que este giro
‫sea independiente de la velocidad de fotogramas, pero también necesitamos algún tipo de velocidad de giro que podamos llamar esta
‫velocidad de giro.
‫Entonces, una vez que hayamos configurado eso, sí, podemos agregar esa rotación local que rotará al actor de
‫acuerdo con el rotador F de cada cuadro y se escalará por valor.
‫Entonces será cero si no estamos presionando ninguna tecla y tendrá un valor si estamos presionando DX
‫y ax.
‫Así que ahora tienes un desafío.
‫Esto funcionará igual que agregar el desplazamiento local del actor.
‫La única diferencia es que estamos rotando al actor ahora.
‫Entonces, como necesitamos algún tipo de velocidad de giro para rotar al actor, creará una variable de velocidad de giro,
‫hará que sea flotante y colóquela en la sección privada justo al lado de la variable de velocidad.
‫Exponga esta variable con su propiedad y elija los nuevos especificadores de propiedad apropiados.
‫Ahora, en la función de giro, va a configurar la rotación Delta en particular, nos preocupamos por que
‫su componente establezca el valor igual al valor multiplicado por nuestra variable de tasa de giro y también multiplique por el tiempo delta y
‫luego estará listo para llamar a agregar actor local. rotación que pasa en este rotador f ahora para el segundo parámetro,
‫continúe y pase en verdadero para la entrada de barrido B, ya que queremos barrer al girar, pausar el video e implementar
‫la rotación para el tanque ahora.
‫Bueno.
‫Así que esto va a ser bastante simple.
‫Solo necesitamos una variable de tasa de giro.
‫Ahora voy a entrar en el tanque justo por debajo de la velocidad y crear una velocidad de giro flotante.
‫Ahora probablemente inicialice esto con algún valor y eso está bien.
‫Si es diferente de lo que estoy eligiendo, optaré por 45 F y veré cómo funciona.
‫Pero vamos a exponer esto a planos para que podamos cambiarlo mientras estamos desarrollando.
‫Ahora me gustaría editarlo en cualquier lugar y lo colocaré en la misma categoría de movimiento que la velocidad.
‫Así que voy a seguir adelante y robar esta propiedad suya y pegarla aquí arriba, girar a la derecha para que se establezca
‫en cualquier lugar.
‫Movimiento de categoría ahora y tanque CP.
‫Estoy listo para dar el sí a la rotación Delta.
‫Así que vamos a decir rotación delta.
‫Sí.
‫Y lo vamos a establecer igual a los tiempos de valor, los tiempos de tasa de giro, el tiempo delta.
‫Y, por supuesto, podemos obtener el tiempo delta con las estáticas de juego U, obtener los segundos delta mundiales que pasan en esto
‫como el objeto de contexto mundial.
‫Así que voy a pegar eso allí mismo.
‫Ahora sé que mi pseudocódigo no coincide exactamente.
‫Está en el orden incorrecto.
‫El tiempo delta está en el medio aquí.
‫No importa porque al multiplicar tres valores juntos, puedes multiplicarlos en cualquier orden y aun así
‫obtener el mismo resultado.
‫Entonces, en caso de que te lo estés preguntando, las matemáticas seguirán siendo las mismas si multiplicas estos
‫tres valores en un orden diferente.
‫Así que no te preocupes demasiado por eso.
‫Ahora tenemos rotación delta.
‫Lo único que queda por hacer es llamar a la rotación local de agregar actor, y estamos pasando la rotación Delta y para la
‫segunda entrada vamos a pasar en verdadero para habilitar el barrido al rotar.
‫Así que vamos a compilar esto.
‫Muy bien, ya estamos compilados.
‫Puede notar en un par de los siguientes videos que faltan el vector cero y el rotador cero en estas
‫líneas.
‫Eso es porque comencé con estos inicializados y luego me di cuenta de que probablemente
‫deberían inicializarse al menos con valores cero.
‫Así que no se preocupe si ve estas líneas más adelante con este aspecto inicializado, mantenga su vector cero
‫y su rotador cero y verá que capto esto en un video futuro cercano.
‫Así que no te preocupes.
‫Si no ve estos de inicialización, deberían estar allí.
‫Y estamos de vuelta en el editor.
‫Vamos a darle al play y voy a usar la tecla D y estamos girando y la tecla A me gira hacia el
‫otro lado y también podemos avanzar y retroceder.
‫Entonces, ahora que podemos rotar y avanzar, tenemos la capacidad de movernos por el mundo.
‫Este es un gran hito.
‫Ahora me muevo bastante lento, pero está bien porque puedo seleccionar mi tanque y puedo buscar la
‫categoría de movimiento y cambiar la velocidad de giro a algo más alto, como 90.
‫Así que sigamos adelante y presionemos reproducir.
‫Y eso es bastante más rápido.
‫Ahora, si crees que esto todavía es un poco lento.
‫Por supuesto, puede ajustarlos.
‫Así que voy a seleccionar el tanque de nuevo.
‫Y en lugar de 400, hagámoslo 800.
‫¿Por que no?
‫En lugar de 90, vamos a decir 120.
‫Ahora, si presiono play, soy bastante más rápido.
‫Así que esto se ve muy, muy bien.
‫Entonces, mirando hacia atrás en el plano de la sección, ahora tenemos un tanque que puede moverse por todo el mundo.
‫Ese primer punto definitivamente está marcado y estamos manejando el movimiento WASD.
‫Todavía no estamos manejando la entrada del mouse, pero llegaremos a eso.
‫Pero estamos un paso más cerca de completar este juego.
‫Entonces, en resumen, aprendimos qué es el barrido y cómo podemos habilitarlo para que nuestros objetos no se crucen
‫entre sí.
‫Agregamos una rotación local de actores y lo hicimos implementando una tasa de rotación que podíamos ajustar en los
‫detalles.
‫Panel en el editor para facilitar un poco el desarrollo.
‫Gran trabajo.
‫Ahora estamos moviendo el tanque por todo el mundo.
‫Te veré en el próximo video.