‫Bienvenido de nuevo.
‫Ahora, en este video, vamos a hablar sobre eventos exitosos.
‫Nos gustaría detectar cuándo el proyectil golpea algo y de esa manera podemos hacer algo en
‫respuesta, como destruir el proyectil.
‫Y luego nos encargaremos de hacer daño y causar efectos de explosión y cosas así.
‫Entonces, hablemos un poco sobre los eventos exitosos ahora.
‫Nuestro proyectil tiene un componente de malla.
‫Su tipo es su componente de malla estática y su componente de malla estática es una clase en una larga jerarquía
‫de clases y el sistema de motor irreal uno de sus padres es su componente primitivo.
‫Aquí está la página de documentación para su componente primitivo.
‫Dice que sus componentes primitivos son componentes vistos que contienen o generan algún tipo de geometría generalmente
‫para ser renderizados o utilizados como datos de colisión.
‫Básicamente son componentes de la escena con algunas funciones adicionales.
‫Y si se desplaza hacia abajo y mira la jerarquía, verá que hemos visto un componente y
‫se deriva de ese componente primitivo y puede seguir desplazándose hacia abajo y ver todas las otras clases que se
‫derivan de usted.
‫componente primitivo.
‫Ahora, la razón por la que señalamos esto es porque su componente de malla estática hereda
‫estas características de su componente primitivo y su componente primitivo tiene la capacidad de generar eventos de éxito.
‫Ahora bien, ¿a qué nos referimos con generar eventos exitosos?
‫Bien, digamos que tenemos alguna geometría en nuestro mundo representada por el rectángulo a la derecha,
‫y tenemos un objeto con un componente de malla estática representado por el círculo a la izquierda.
‫Ahora, si este objeto que tiene un componente de malla estática se está moviendo hacia el bloque, entonces si este componente está
‫configurado para manejar eventos de golpe, tan pronto como golpee ese bloque, el evento de golpe se generará
‫tras la colisión.
‫Ahora, un evento de golpe generará algunos datos relacionados con esa colisión, incluido el componente que fue
‫golpeado.
‫Así que este bloque aquí puede tener un componente de malla estática.
‫Podemos acceder a ese componente al chocar.
‫También podemos acceder al actor que fue golpeado y el evento principal también genera un resultado de golpe EF.
‫Hemos aprendido un poco sobre el resultado del hit F y sabemos que contiene muchas variables sobre el evento del
‫hit, como la ubicación del hit, que es un vector F que representa una ubicación en el mundo.
‫Así que tenemos nuestra malla de proyectiles.
‫Esta es una variable de tipo puntero de componente de malla estática.
‫Ahora, cada vez que este componente de malla estática golpea algo en el mundo, queremos tener algún código
‫que responda a eso.
‫Ahora que es un componente de malla estática, hereda cosas de la clase de componente primitivo.
‫Una de las cosas que hereda es una variable llamada componente hit.
‫Ahora aquí está la documentación para el componente hit.
‫Se describe como un evento llamado Cuando un componente golpea o es golpeado por algo sólido.
‫Ahora, al desplazarnos hacia abajo, vemos que el componente hit tiene la firma de hit del componente tipo F.
‫Y si hacemos clic en esto, vemos que la firma de hits del componente F es una estructura.
‫Ahora, retrocediendo, podemos ver que la documentación dice que se llama un evento cuando un componente golpea o es
‫golpeado por algo sólido.
‫Esto podría suceder debido a cosas como el movimiento del personaje usando una ubicación establecida con barrido habilitado
‫o simulación física para eventos cuando los objetos se superponen, como caminar hacia un disparador, ver el evento de superposición.
‫Así que hay eventos exitosos y eventos superpuestos.
‫Estamos preocupados por los eventos exitosos.
‫Por lo tanto, sabemos que el impacto del componente se describe en la documentación como un evento de impacto y sabemos que el impacto
‫del componente es una estructura de firma de impacto del componente de tipo F.
‫Hasta aquí todo bien.
‫Ahora bien, este evento de éxito en el componente de éxito también es algo a lo que nos referimos como un delegado de multidifusión.
‫Un delegado de multidifusión puede tener varias funciones vinculadas.
‫Puede haber funciones que existen en varias clases.
‫Y si esas funciones se vinculan a este delegado de multidifusión, entonces se agregan a algo llamado
‫lista de invocación.
‫Esta es una lista de funciones que se llamarán cuando este evento de éxito les diga que se llamen a todas.
‫Decimos que este evento de éxito o delegado de multidifusión se transmite cuando sucede algo.
‫Entonces, en el caso de que nuestra malla de proyectil golpee algo, el delegado transmitirá a todas las clases
‫que tienen una función vinculada a este delegado.
‫Tan pronto como se envía esa transmisión, todas estas funciones vinculadas se llaman en respuesta a
‫la transmisión.
‫Esta es una característica muy poderosa de Unreal Engine.
‫Nos permite tener algo llamado delegado, que espera un evento como una colisión.
‫Y entonces.
‫Y el delegado se transmitirá, lo que dará como resultado que todas las funciones vinculadas se llamen en respuesta a la transmisión.
‫Dado que se pueden vincular múltiples funciones a este delicado, lo llamamos multidifusión.
‫Está transmitiendo a múltiples clases que tienen sus funciones vinculadas.
‫Ahora, ¿cómo vinculamos una función a este delegado?
‫Bueno, el componente hit tiene una serie de funciones que nos permiten hacer esto, una de las cuales
‫se llama agregar dinámica.
‫Entonces, cuando llamamos a la función dinámica ADD, todo lo que necesitamos hacer es pasar dos parámetros, el objeto de usuario para el
‫que podemos usar esto, y la función de devolución de llamada, que es la dirección de alguna función en
‫nuestra clase.
‫Entonces, una vez que accedemos a esto en el delegado de hit del componente y llamamos a la función dinámica de agregar, podemos pasar el objeto
‫de usuario y la devolución de llamada.
‫Y esto resultará en agregar esa devolución de llamada a la lista de invocación de eventos de éxito.
‫Ahora, en el impacto del componente, transmitiremos este delegado, lo que dará como resultado que se llame a cualquier función vinculada a él.
‫Entonces, para vincularnos a este delegado, necesitamos crear una función de devolución de llamada.
‫Así que aquí está el proyectil y nos gustaría una función de devolución de llamada para el evento de éxito.
‫Así que vamos a crear una función privada aquí y quedará anulada.
‫Y simplemente voy a llamar a esto de golpe.
‫Podríamos llamar a esto como queramos, pero on parece lo suficientemente descriptivo.
‫Ahora, esta función de devolución de llamada debe tener la firma correcta para los eventos de éxito, lo que significa
‫que su lista de parámetros de entrada debe ser muy específica.
‫El primer parámetro de entrada tiene que ser del tipo puntero de componente primitivo y se llama hit comp.
‫Este es el componente que golpea.
‫En nuestro caso, vamos a tener nuestra malla de proyectil golpeando cosas.
‫El siguiente parámetro es un puntero de actor llamado Otro actor.
‫Este va a ser el actor que fue golpeado.
‫El siguiente parámetro de entrada es otro puntero de componente primitivo llamado otra composición.
‫Este es el otro componente que fue golpeado.
‫Entonces, si golpeamos el componente de malla estática de algún otro actor, entonces este sería ese componente de malla estática.
‫El siguiente es un vector F llamado impulso normal.
‫Si estamos simulando física, el motor de física aplicará un impulso en respuesta a la colisión.
‫Y este vector f representa la dirección y la magnitud de ese impulso.
‫Y finalmente, tenemos un parámetro de entrada de tipo const F hit result y esta es una referencia const y
‫se llama hit.
‫Entonces, cuando se llame a hit, tendremos acceso a un resultado de hit que contiene aún más información sobre el
‫hit.
‫Ahora, dado que vinculamos esto a un delegado, tiene que ser una función U.
‫Así que vamos a marcar esto con tu función.
‫Ahora, debe estar familiarizado con su función.
‫Es como su propiedad, solo que es para funciones en lugar de variables.
‫Muy importante.
‫Nuestra devolución de llamada tiene que ser una función u para que esto funcione.
‫Ahora hemos declarado la función.
‫Avancemos y definamos la función.
‫Así que de vuelta en proyectiles.
‫CP Justo debajo de nuestra función tick, definamos esta función.
‫Le daremos un cuerpo de función y pondremos el nombre de la clase justo antes del nombre de la función, y ahora tenemos una función
‫de devolución de llamada.
‫Entonces, estamos listos para vincular esta función de golpe a nuestro delegado y debemos hacerlo al comenzar la reproducción.
‫Hacerlo en el constructor es demasiado temprano y, a veces, puede encontrar problemas como que su delegado
‫no esté vinculado.
‫Así que lo haremos aquí y comenzaremos a jugar.
‫Entonces tenemos nuestra malla de proyectil y usaremos el operador de flecha para acceder a la variable heredada de usted.
‫El componente primitivo llamado en componente hit y en componente hit tiene la función add dynamic.
‫Ahora, extrañamente, la función de autocompletar no funcionará para agregar dinámica, por lo que tendrá que escribir el
‫nombre completo de la función.
‫Esta es la función que usaremos para vincular nuestra devolución de llamada al éxito del componente y agregar esa función a
‫su lista de invocación.
‫Ahora, primero, necesitamos el objeto de usuario que será esto porque esta es la clase para
‫la que se vincula la función y luego necesitamos la dirección de la función que será la dirección del hit.
‫Así que usaremos la dirección del operador y la función un proyectil al impactar.
‫Y con esto tenemos nuestra función enlazada y estamos listos para generar eventos exitosos.
‫Ahora podemos probar esto con un registro UEE y podemos usar la advertencia de temperatura de registro.
‫Y para el texto, simplemente podemos decir hit.
‫Y si vemos esto en el registro de salida, sabemos que nuestra función de acceso ha sido llamada, vamos a compilar
‫esto.
‫Así que tengo el registro de salida abierto aquí.
‫Voy a presionar reproducir y disparar un proyectil y ahí está mi mensaje de registro en el que se está llamando al golpe.
‫Así que esto está funcionando.
‫Ahora solo una nota al margen, si vamos al proyectil BP y seleccionamos malla de proyectil en el panel de detalles, podemos
‫desplazarnos hacia abajo a la sección de colisión.
‫Y aquí vemos que los ajustes preestablecidos de colisión están configurados para bloquear todas las dinámicas y que la colisión
‫habilitada está configurada para esta configuración de consulta y física habilitadas para colisión.
‫Esto es necesario para los eventos de éxito.
‫Necesitamos poder consultar un evento de éxito.
‫Y, por supuesto, la física permite que el motor de física actúe sobre la malla del proyectil.
‫Entonces, ahora que nos vinculamos al delegado de hit del componente on con nuestra función on hit y colocamos un
‫registro enorme para asegurarnos de que funciona, me gustaría que explores esta función un poco más para que podamos
‫comprenda algunos de estos parámetros de entrada en nuestra función on hit.
‫Entonces, en la función de éxito, agregue algunos registros YOUI más.
‫Me gustaría que imprimiera los nombres de algunos de estos parámetros de entrada usando la función de nombre de git.
‫Me gustaría que usaras un registro de YUI para imprimir el nombre de la composición de éxito, otro actor y otra composición para que podamos ver
‫los nombres de estos objetos que estamos golpeando.
‫Va a utilizar el formato de porcentaje, especifique el en la macro de texto de registro E.
‫Y solo como recordatorio, cada vez que llamamos obtener nombre, debemos usar el asterisco al pasar esa cadena a la macro
‫de registro de YUI, por ejemplo, para obtener el nombre de otro actor, llamaríamos a otro actor, obtener nombre
‫y colocar ese asterisco. al principio solo para devolver esa cadena de estilo C, que es lo
‫que espera cuando lo formatea con una cadena.
‫Así que pausa el video y usa Yui log en nuestra función de hit para imprimir los nombres de hit comp, otro
‫actor y otro comp ahora.
‫Bueno.
‫Así que aquí en proyectil CP, voy a usar tu registro aquí.
‫Así que voy a copiar esta línea donde estoy usando Yui log y para la cadena voy a decir hit comp
‫percent s y justo después del texto voy a llamar hit comp get name y necesito este asterisco para convertir de una cadena
‫F a una cadena de estilo C.
‫Ahora voy a usar esta misma línea, solo que voy a cambiar el texto para decir otro actor y lo
‫llamaremos por su nombre esta vez en otro actor.
‫Y, por último, imprimiré otras llamadas de compensación, obtendré el nombre en otra compensación.
‫Así que vamos a compilar y de vuelta aquí en el editor, voy a seguir adelante y presionar play y disparar un
‫proyectil y comprobar esto.
‫Vemos que hit comp es una malla de proyectil.
‫Recuerde que dijimos que este es el componente que golpea, que es nuestra mezcla de proyectiles
‫y verá que está usando el nombre que le asignamos a este componente al crear un subobjeto predeterminado.
‫Así que esta es una de esas situaciones en las que se usa ese nombre.
‫Ahora verás que dice defecto de otro actor subrayado cero.
‫Y eso es porque este actor de malla estática que es la falla tiene el nombre de falla subrayado cero.
‫A veces, el motor colocará un número al final de su nombre interno para actores y
‫componentes, y verá que sucede lo mismo cuando imprimimos otra composición.
‫El actor de malla estática de defectos tiene un componente de malla estática y su nombre es componente cero de malla estática.
‫Entonces, esto nos brinda un poco más de información sobre esos parámetros de entrada en nuestra función de devolución de llamada.
‫Y esto es útil porque tenemos acceso a esos objetos en C++ si queremos hacer algo en respuesta al
‫evento hit.
‫En resumen, hemos aprendido acerca de los eventos de éxito y cómo se implementan como delegados de multidifusión y hemos
‫aprendido cómo funcionan.
‫Creamos una función llamada On Hit and Bound, esa función para el delegado de hit de componente que nuestra
‫malla de proyectil ha heredado de la clase de componente primitivo.
‫Ahora no hemos destruido el proyectil al golpearlo, pero ahora sabemos que podemos hacerlo fácilmente porque tenemos esta función
‫de devolución de llamada y podemos colocar la lógica en esta función, como destruir el proyectil.
‫Así que nos encargaremos de eso en un video futuro.
‫Por ahora, date una palmadita en la espalda porque esta es una de las áreas más complejas de Unreal Engine C++ que
‫has aprendido hasta ahora.
‫Te veré en el próximo video.