‫Oye.
‫Bienvenido de nuevo.
‫Ahora tenemos nuestro proyectil y sabemos que está generando eventos de impacto, por lo que debemos hacer
‫algo cuando el proyectil realmente impacte en nuestro objetivo.
‫Ahora, eso implicará hacer daño, lo que significa que necesitamos una forma de realizar un seguimiento de la salud.
‫Así que vamos a crear una clase para manejar la salud y el daño llamada componente de salud.
‫Y la razón por la que esta funcionalidad tiene su propia clase es que podemos reutilizarla para diferentes clases,
‫como el tanque y la torre.
‫Así que hablemos de este componente de salud.
‫Ahora estamos familiarizados con la clase de componente de escena de uso.
‫Bueno, esta clase se deriva de una clase llamada componente actor.
‫De hecho, aquí está la documentación del componente de escena de uso.
‫Y en la jerarquía de herencia, puede ver que su padre es su componente de actor.
‫Ahora el componente que actúas es más básico que el componente que has visto.
‫No tiene transformación.
‫Entonces, la ubicación, la rotación y la escala no son algo que el componente de tu actor tenga.
‫No admite archivos adjuntos.
‫No puede adjuntar un componente activo a, por ejemplo, un componente de malla estática o un componente de cápsula.
‫Es algo que pertenece al actor.
‫Y debido a que no hay representación visual o transformación, no necesitamos adjuntarlo a nada.
‫Compare esto con el componente de escena de uso, que en realidad tiene una transformación y la capacidad de
‫adjuntarse a otros componentes o hacer que otros componentes se adhieran a él.
‫Entonces, para hacer un seguimiento de la salud y cuidar los daños, no necesitamos ninguna de esas cosas.
‫Así que actúas como un componente que será perfecto para esto.
‫Así que volvamos al editor y hagamos de nuestro nuevo acto una clase de componente.
‫Así que subiremos a las herramientas y la nueva clase de C++.
‫Y si me desplazo hacia abajo, puedo ver el componente actor.
‫Esto es lo que vamos a seleccionar.
‫Ahora ten cuidado.
‫No seleccione actor.
‫Esa es una clase diferente.
‫En realidad, es una clase más grande y tiene muchas más cosas que el componente actor.
‫Necesitamos el componente actor específicamente, así que seleccione eso, haga clic en siguiente.
‫Y esto lo podemos llamar simplemente Componente de Salud.
‫Hagamos clic en Crear clase.
‫Ahora aquí tenemos nuestros nuevos componentes de salud y archivos CP y puede ver aquí que su componente de salud, la
‫clase que acabamos de crear se deriva de su acto como componente.
‫Así que asegúrate de tener el tipo correcto aquí y verás que tiene en su U.
‫Macro de clase.
‫Este meta especifica dónde y dice el componente de la tabla de generación de planos.
‫Esto es lo que nos permitirá agregar este componente directamente en los planos, que es lo
‫que haremos ahora.
‫El nuevo componente de salud se ocupará de la salud, lo que significa que necesitamos un par de variables.
‫Avancemos y agreguemos estos y los haré privados.
‫Así que sigamos adelante y agreguemos una sección privada justo debajo de la protegida, y podemos agregar un par de
‫variables de salud.
‫Ahora, estos van a ser flotadores y voy a llamar al primero Max Health.
‫Esta será la cantidad máxima de salud que podemos tener y podemos establecer esto en un valor
‫predeterminado como 100 F.
‫Ahora, además de la salud máxima, vamos a tener un valor de salud que será la salud actual y esto
‫será lo que cambie a medida que recibamos daño.
‫Así que hagamos otro flotador y simplemente llamemos a este salud.
‫Ahora podemos inicializar la salud a cero F y luego establecer su valor y comenzar a jugar.
‫Y la razón por la que lo haremos es porque Max Health tendrá su propia propiedad que nos permitirá
‫configurarla desde el panel de detalles.
‫Así que démosle a esto una propiedad U y hagamos que se edite en cualquier lugar.
‫De esa manera podemos cambiarlo a medida que nos desarrollamos.
‫Y luego, en los componentes de salud CP aquí y comenzar a jugar, simplemente podemos establecer la salud igual al valor de la
‫salud máxima.
‫De esa manera, cuando comience el juego, la salud tendrá el valor de salud máxima incluso después de que lo hayamos cambiado
‫en el panel de detalles.
‫Bien, vamos a compilar esto y de vuelta aquí en el editor, voy a abrir BP -- tanque y abrir el
‫editor de planos completo.
‫Y ahora puedo agregar este componente de salud aquí en el panel de componentes.
‫Así que voy a hacer clic en Agregar y buscar Salud.
‫Y aquí vemos salud.
‫Ahora, lo llamamos componente de salud en C++.
‫Y, de hecho, la ventana emergente muestra que se llama componente de salud.
‫Así que quita ese componente cuando lo muestra aquí.
‫Y es posible que haya notado que cuando busca componentes de malla estática o componentes de cápsula,
‫tampoco ve aquí la palabra componente para esos.
‫Haga clic en salud y ahora tenemos nuestro componente de salud y verá que en el componente de salud
‫tenemos salud máxima y está configurado en 100 y no vemos salud porque no expusimos esa variable.
‫Así que ahora el tanque BP tiene un componente de salud y decía que el tanque posee este componente de salud, el
‫tanque BP.
‫Es el propietario de este componente de salud.
‫Vamos a compilar, guardar, cerrar y abrir la torreta de peones BP y abrir el editor de planos completo y también podemos agregar
‫un componente de salud a la torreta del estanque.
‫Así que hagamos clic en agregar componentes, busquemos salud y seleccionemos salud.
‫Y ahora también tenemos un componente de salud en la torre.
‫Así que voy a compilar y guardar estos cerrar y guardar todo.
‫Así que ahora tenemos un componente de salud y mencionamos que nos gustaría tener un componente de salud
‫para poder reutilizarlo con diferentes clases.
‫Entonces, si tenemos un peón en el mundo, digamos, nuestra torre, tendrá su propio componente de salud y luego
‫nuestro tanque puede tener su propio componente de salud.
‫Ahora, cuando nuestro proyectil interactúa con cualquiera de estos, por ejemplo, cuando genera un evento de
‫golpe, cuando golpea una de estas cosas, nuestros peones pueden activar alguna funcionalidad en el componente
‫de salud y cambiar esos valores de salud.
‫Poner nuestra funcionalidad de salud en un componente y luego agregar ese componente a una clase tiene algunas ventajas sobre
‫la alternativa, que sería simplemente colocar la funcionalidad de salud en la clase de peón base, por
‫ejemplo, y heredar eso en el tanque y la torre.
‫Verá, esto nos permite mantener pequeñas nuestras clases de tanques y torres y solo tratar con la funcionalidad específica para
‫esas clases.
‫Mientras que el componente de salud se puede agregar a cualquier otro actor, como cosas que no actúan como tanques
‫o torres.
‫Podemos hacer un muro destruible, por ejemplo, que podría destruirse tan pronto como reciba suficiente
‫daño.
‫Entonces, hablemos un poco sobre cómo podemos hacer que esto suceda ahora.
‫Unreal Engine ha incorporado la funcionalidad de daño y su sistema dañado es bastante sofisticado.
‫Cualquier actor en nuestro juego hereda una serie de eventos de daño, uno de los cuales es recibir cualquier daño.
‫Este es un delegado de multidifusión, al igual que en el hit del componente.
‫Ahora vamos a agregar componentes de salud a nuestros peones y estos se basarán en nuestra U.
‫Clase de componente de salud.
‫Entonces, dado que sabemos que nuestros peones heredarán esto al recibir cualquier delegado de daño, entonces, si creamos nuestra
‫propia función personalizada en la clase del componente de salud, podemos usar esta función como una devolución
‫de llamada y vincularla al recibir cualquier daño. delegar.
‫Entonces, cada vez que se genera un evento de daño, el delegado de tomar cualquier daño puede transmitir y se llamará
‫a cualquier función vinculada a él en su lista de invocación.
‫Entonces, la siguiente pregunta es ¿cómo hacemos que ese delegado transmita?
‫Necesitamos una forma de generar un evento de daño.
‫Bueno, hay una función en las estadísticas de tu juego que hará exactamente eso y se llama aplicar daño.
‫Si usamos esta función estática de las estáticas de su juego para aplicar daño, aplicar daño requiere una
‫serie de parámetros, incluido el actor que se está dañando.
‫Entonces, si llamamos a aplicar daño, los actores en tomar cualquier delegado de daño serán despedidos y esa función de devolución de
‫llamada será llamada en respuesta.
‫Así que aplicar daño es lo que genera el evento de daño.
‫Entonces, para configurar todo esto, tenemos tres pasos.
‫Primero, cree una función de devolución de llamada y, dado que estará vinculada a cualquier daño, debe tener los
‫parámetros de entrada correctos para que al recibir cualquier daño la llame y pase toda la información
‫asociada sobre el evento de daño.
‫El segundo paso es vincular esta devolución de llamada al delegado.
‫Hemos visto cómo hacer esto con el delegado de hits en el componente usando la función dinámica add.
‫Estaremos haciendo lo mismo aquí.
‫Y el tercer paso es generar el evento de daño llamando a la función estática de tu juego, daño
‫aplicado.
‫Así que volvamos al código y comencemos a configurar esto.
‫Bueno.
‫Así que estamos aquí en el componente de salud y vamos a agregar una función de devolución de llamada.
‫Ahora, esto puede ser nulo y podemos llamarlo como queramos.
‫Voy a llamar a este daño recibido.
‫Y debido a que estamos vinculando esto a un delegado, debe tener los parámetros de entrada correctos y apropiados
‫para ese delegado.
‫Ahora, para las funciones vinculadas al delegado de tomar cualquier daño, la lista de parámetros de entrada debe ser la siguiente.
‫El primero es un puntero de actor llamado Actor dañado, y así es como suena.
‫Es el actor que recibe el daño.
‫El siguiente es un flotador llamado daño y esta es la cantidad de daño real.
‫Ahora, a continuación, tenemos un indicador de tipo de daño de costo que se llama tipo de daño.
‫Y la razón por la que tenemos este parámetro de entrada es porque Unreal Engine tiene el concepto de tipos de daño.
‫Puede crear tipos de daños personalizados que tengan datos adicionales que le informen para hacer diferentes cosas según el tipo
‫de daño que pueda tener.
‫Daño por fuego.
‫Daño por veneno.
‫Daño explosivo y así sucesivamente.
‫Y si desea implementar una funcionalidad personalizada para cada tipo de daño, debe implementarla en su
‫propio tipo de daño personalizado.
‫Ahora no estamos creando nuestro propio tipo de daño personalizado, pero debido a que estamos vinculando esta función
‫al delegado de tomar cualquier daño, debe tener estos parámetros de entrada.
‫Así que lo estamos incluyendo aquí.
‫Ahora, el siguiente parámetro es un puntero de controlador A y se llama instigator y el Unreal Engine
‫Damage System.
‫Un instigador es el controlador responsable del daño.
‫Entonces, si el daño fue causado en última instancia por un jugador que controlaba un peón, entonces el instigador es el
‫controlador que posee ese peón.
‫Ahora bien, no siempre tiene que haber un instigador.
‫Si no hubiera ninguno, entonces esto simplemente sería nulo.
‫Y ahora obtengo los garabatos rojos para poder declarar la clase de controlador A aquí entre paréntesis para
‫la función.
‫Ahora el último parámetro es un puntero de actor A y este se llama Damage Causer.
‫Este es el actor real que causa el daño.
‫Este sería el propio proyectil.
‫Así que hemos declarado esta función de devolución de llamada de daño recibido y al igual que nuestra otra función de devolución de llamada en el golpe.
‫Esto tiene que ser una función u.
‫Así que le daremos la macro de función solo para asegurarnos de que funcione una vez que la vinculemos
‫al delegado de tomar cualquier daño.
‫Y ahora que lo hemos declarado, estamos listos para definirlo en el archivo CPP.
‫Así que aquí en componentes de salud, CPP.
‫Abajo en la parte inferior, voy a seguir adelante y darle a esto un cuerpo de función y calificar completamente la función con el
‫nombre de la clase.
‫Y ahora tenemos una devolución de llamada.
‫Así que ahora necesitamos enlazar esto con el delegado.
‫Pero el delegado no existe en el componente de salud, existe en los actores específicamente.
‫Queremos vincular esto con el delegado de tomar cualquier daño en el peón que posee este componente.
‫Entonces, ¿cómo accedemos al propietario de este componente para poder vincularnos a uno de sus delegados?
‫Bueno, haríamos esto y comenzaríamos a jugar y la forma en que podemos acceder al propietario de un componente es a
‫través de la función de propietario de git.
‫Si pasa el cursor sobre esto, verá que devuelve un puntero de actor.
‫Este es el puntero al actor que posee un componente.
‫Los componentes pueden ser propiedad de peones, pueden ser propiedad de actores, por lo que devolverá el
‫propietario en forma de puntero de actor.
‫Así que tenemos nuestra función de devolución de llamada y nuestro segundo paso es vincularla al delegado para recibir cualquier daño que vaya
‫a existir en el peón que posee el componente de salud.
‫Entonces, dado que tiene experiencia en vincular devoluciones de llamada a delegados, este será su desafío en la clase de
‫componente de salud.
‫En Begin Play, vinculará el daño recibido al delegado de daño que existe en el
‫propietario del componente.
‫Entonces accederá a ese delegado a través de la función de obtener propietario.
‫En otras palabras, vas a llamar a obtener propietario y desde ahí vas a acceder a tomar cualquier daño.
‫Y luego, a partir de ahí, sabe cómo vincular las devoluciones de llamada a los delegados usando agregar dinámica si
‫se queda atascado, mire cómo vinculamos la devolución de llamada al éxito al delegado del éxito del componente pausar el video y vincular
‫el daño recibido al delegado de recibir cualquier daño ahora.
‫Bueno.
‫Así que estamos de vuelta aquí en el componente de salud y estamos listos para vincular nuestra función de devolución de llamada.
‫Entonces aquí y comencemos a jugar, vamos a acceder al propietario usando la función de propietario de git y desde
‫allí vamos a usar el operador de flecha para acceder a ese delegado llamado, tomar cualquier daño y recibir cualquier daño
‫tiene la dinámica de agregar función y simplemente toma un objeto de usuario y un nombre de función.
‫Ahora el objeto de usuario es el objeto para el que estamos vinculando la función.
‫Es la clase que tiene la función de devolución de llamada y eso va a ser esto.
‫Y finalmente tenemos nuestra función de devolución de llamada, que serás tú.
‫Daño del componente de salud recibido.
‫Ahora necesitamos recordar la dirección del operador porque en realidad toma una dirección de la función.
‫Así que ahora el daño recibido está obligado a recibir cualquier daño y se agrega a la lista de invocación de ese delegado.
‫Entonces, siempre que generemos eventos de daño, obtendremos una transmisión de este delegado que dará como resultado que
‫se llame a la función de toma de daño.
‫En resumen, creamos nuestro propio componente de salud y agregamos uno de estos al plano del tanque y
‫al plano de la torre.
‫Creamos una función de devolución de llamada llamada Damage Taken y la vinculamos al delegado on take any Damage.
‫El siguiente paso es generar un evento de daño que resultará en la transmisión del delegado de tomar cualquier daño
‫para que nuestra función de devolución de llamada de daños recibidos sea llamada en respuesta.
‫Y lo configuraremos en el próximo video.
‫Te veré pronto.