﻿1
00:00:04,480 --> 00:00:05,530
‫Bienvenido de nuevo.

2
00:00:05,560 --> 00:00:08,760
‫Ahora, en este video, vamos a hablar sobre eventos exitosos.

3
00:00:08,770 --> 00:00:15,430
‫Nos gustaría detectar cuándo el proyectil golpea algo y de esa manera podemos hacer algo en

4
00:00:15,430 --> 00:00:17,560
‫respuesta, como destruir el proyectil.

5
00:00:17,560 --> 00:00:22,710
‫Y luego nos encargaremos de hacer daño y causar efectos de explosión y cosas así.

6
00:00:22,720 --> 00:00:26,350
‫Entonces, hablemos un poco sobre los eventos exitosos ahora.

7
00:00:26,350 --> 00:00:29,440
‫Nuestro proyectil tiene un componente de malla.

8
00:00:29,440 --> 00:00:37,450
‫Su tipo es su componente de malla estática y su componente de malla estática es una clase en una larga jerarquía

9
00:00:37,450 --> 00:00:43,990
‫de clases y el sistema de motor irreal uno de sus padres es su componente primitivo.

10
00:00:44,260 --> 00:00:48,100
‫Aquí está la página de documentación para su componente primitivo.

11
00:00:48,130 --> 00:00:54,910
‫Dice que sus componentes primitivos son componentes vistos que contienen o generan algún tipo de geometría generalmente

12
00:00:54,910 --> 00:00:58,600
‫para ser renderizados o utilizados como datos de colisión.

13
00:00:58,600 --> 00:01:02,560
‫Básicamente son componentes de la escena con algunas funciones adicionales.

14
00:01:02,560 --> 00:01:08,440
‫Y si se desplaza hacia abajo y mira la jerarquía, verá que hemos visto un componente y

15
00:01:08,440 --> 00:01:15,100
‫se deriva de ese componente primitivo y puede seguir desplazándose hacia abajo y ver todas las otras clases que se

16
00:01:15,100 --> 00:01:16,510
‫derivan de usted.

17
00:01:16,510 --> 00:01:17,860
‫componente primitivo.

18
00:01:18,250 --> 00:01:24,280
‫Ahora, la razón por la que señalamos esto es porque su componente de malla estática hereda

19
00:01:24,280 --> 00:01:30,820
‫estas características de su componente primitivo y su componente primitivo tiene la capacidad de generar eventos de éxito.

20
00:01:30,850 --> 00:01:33,670
‫Ahora bien, ¿a qué nos referimos con generar eventos exitosos?

21
00:01:33,760 --> 00:01:39,310
‫Bien, digamos que tenemos alguna geometría en nuestro mundo representada por el rectángulo a la derecha,

22
00:01:39,310 --> 00:01:45,160
‫y tenemos un objeto con un componente de malla estática representado por el círculo a la izquierda.

23
00:01:45,190 --> 00:01:52,660
‫Ahora, si este objeto que tiene un componente de malla estática se está moviendo hacia el bloque, entonces si este componente está

24
00:01:52,660 --> 00:01:58,630
‫configurado para manejar eventos de golpe, tan pronto como golpee ese bloque, el evento de golpe se generará

25
00:01:58,630 --> 00:01:59,800
‫tras la colisión.

26
00:01:59,800 --> 00:02:06,040
‫Ahora, un evento de golpe generará algunos datos relacionados con esa colisión, incluido el componente que fue

27
00:02:06,040 --> 00:02:06,640
‫golpeado.

28
00:02:06,640 --> 00:02:09,640
‫Así que este bloque aquí puede tener un componente de malla estática.

29
00:02:09,640 --> 00:02:12,910
‫Podemos acceder a ese componente al chocar.

30
00:02:12,910 --> 00:02:19,120
‫También podemos acceder al actor que fue golpeado y el evento principal también genera un resultado de golpe EF.

31
00:02:19,120 --> 00:02:25,090
‫Hemos aprendido un poco sobre el resultado del hit F y sabemos que contiene muchas variables sobre el evento del

32
00:02:25,090 --> 00:02:30,790
‫hit, como la ubicación del hit, que es un vector F que representa una ubicación en el mundo.

33
00:02:31,090 --> 00:02:33,460
‫Así que tenemos nuestra malla de proyectiles.

34
00:02:33,460 --> 00:02:37,690
‫Esta es una variable de tipo puntero de componente de malla estática.

35
00:02:37,690 --> 00:02:43,000
‫Ahora, cada vez que este componente de malla estática golpea algo en el mundo, queremos tener algún código

36
00:02:43,000 --> 00:02:44,380
‫que responda a eso.

37
00:02:44,380 --> 00:02:50,740
‫Ahora que es un componente de malla estática, hereda cosas de la clase de componente primitivo.

38
00:02:50,740 --> 00:02:55,450
‫Una de las cosas que hereda es una variable llamada componente hit.

39
00:02:55,480 --> 00:02:58,750
‫Ahora aquí está la documentación para el componente hit.

40
00:02:58,750 --> 00:03:05,320
‫Se describe como un evento llamado Cuando un componente golpea o es golpeado por algo sólido.

41
00:03:05,320 --> 00:03:11,680
‫Ahora, al desplazarnos hacia abajo, vemos que el componente hit tiene la firma de hit del componente tipo F.

42
00:03:11,680 --> 00:03:17,770
‫Y si hacemos clic en esto, vemos que la firma de hits del componente F es una estructura.

43
00:03:17,800 --> 00:03:24,100
‫Ahora, retrocediendo, podemos ver que la documentación dice que se llama un evento cuando un componente golpea o es

44
00:03:24,100 --> 00:03:25,660
‫golpeado por algo sólido.

45
00:03:25,660 --> 00:03:32,140
‫Esto podría suceder debido a cosas como el movimiento del personaje usando una ubicación establecida con barrido habilitado

46
00:03:32,140 --> 00:03:38,920
‫o simulación física para eventos cuando los objetos se superponen, como caminar hacia un disparador, ver el evento de superposición.

47
00:03:38,920 --> 00:03:42,280
‫Así que hay eventos exitosos y eventos superpuestos.

48
00:03:42,280 --> 00:03:44,230
‫Estamos preocupados por los eventos exitosos.

49
00:03:44,470 --> 00:03:51,700
‫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

50
00:03:51,700 --> 00:03:56,410
‫del componente es una estructura de firma de impacto del componente de tipo F.

51
00:03:56,410 --> 00:03:57,550
‫Hasta aquí todo bien.

52
00:03:57,550 --> 00:04:04,930
‫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.

53
00:04:04,960 --> 00:04:10,270
‫Un delegado de multidifusión puede tener varias funciones vinculadas.

54
00:04:10,300 --> 00:04:14,200
‫Puede haber funciones que existen en varias clases.

55
00:04:14,200 --> 00:04:20,980
‫Y si esas funciones se vinculan a este delegado de multidifusión, entonces se agregan a algo llamado

56
00:04:20,980 --> 00:04:22,600
‫lista de invocación.

57
00:04:22,600 --> 00:04:29,650
‫Esta es una lista de funciones que se llamarán cuando este evento de éxito les diga que se llamen a todas.

58
00:04:29,650 --> 00:04:35,500
‫Decimos que este evento de éxito o delegado de multidifusión se transmite cuando sucede algo.

59
00:04:35,500 --> 00:04:43,000
‫Entonces, en el caso de que nuestra malla de proyectil golpee algo, el delegado transmitirá a todas las clases

60
00:04:43,000 --> 00:04:46,660
‫que tienen una función vinculada a este delegado.

61
00:04:46,690 --> 00:04:53,440
‫Tan pronto como se envía esa transmisión, todas estas funciones vinculadas se llaman en respuesta a

62
00:04:53,440 --> 00:04:54,370
‫la transmisión.

63
00:04:54,370 --> 00:04:57,580
‫Esta es una característica muy poderosa de Unreal Engine.

64
00:04:57,580 --> 00:05:03,610
‫Nos permite tener algo llamado delegado, que espera un evento como una colisión.

65
00:05:03,610 --> 00:05:03,970
‫Y entonces.

66
00:05:04,100 --> 00:05:11,270
‫Y el delegado se transmitirá, lo que dará como resultado que todas las funciones vinculadas se llamen en respuesta a la transmisión.

67
00:05:11,270 --> 00:05:15,930
‫Dado que se pueden vincular múltiples funciones a este delicado, lo llamamos multidifusión.

68
00:05:15,950 --> 00:05:21,090
‫Está transmitiendo a múltiples clases que tienen sus funciones vinculadas.

69
00:05:21,110 --> 00:05:24,460
‫Ahora, ¿cómo vinculamos una función a este delegado?

70
00:05:24,470 --> 00:05:30,350
‫Bueno, el componente hit tiene una serie de funciones que nos permiten hacer esto, una de las cuales

71
00:05:30,350 --> 00:05:31,720
‫se llama agregar dinámica.

72
00:05:31,730 --> 00:05:38,930
‫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

73
00:05:38,930 --> 00:05:45,260
‫que podemos usar esto, y la función de devolución de llamada, que es la dirección de alguna función en

74
00:05:45,260 --> 00:05:46,000
‫nuestra clase.

75
00:05:46,010 --> 00:05:52,790
‫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

76
00:05:52,820 --> 00:05:54,770
‫de usuario y la devolución de llamada.

77
00:05:54,770 --> 00:06:00,140
‫Y esto resultará en agregar esa devolución de llamada a la lista de invocación de eventos de éxito.

78
00:06:00,170 --> 00:06:07,280
‫Ahora, en el impacto del componente, transmitiremos este delegado, lo que dará como resultado que se llame a cualquier función vinculada a él.

79
00:06:07,280 --> 00:06:12,290
‫Entonces, para vincularnos a este delegado, necesitamos crear una función de devolución de llamada.

80
00:06:12,470 --> 00:06:18,290
‫Así que aquí está el proyectil y nos gustaría una función de devolución de llamada para el evento de éxito.

81
00:06:18,290 --> 00:06:23,090
‫Así que vamos a crear una función privada aquí y quedará anulada.

82
00:06:23,150 --> 00:06:25,480
‫Y simplemente voy a llamar a esto de golpe.

83
00:06:25,490 --> 00:06:30,820
‫Podríamos llamar a esto como queramos, pero on parece lo suficientemente descriptivo.

84
00:06:30,830 --> 00:06:36,890
‫Ahora, esta función de devolución de llamada debe tener la firma correcta para los eventos de éxito, lo que significa

85
00:06:36,890 --> 00:06:40,460
‫que su lista de parámetros de entrada debe ser muy específica.

86
00:06:40,460 --> 00:06:49,870
‫El primer parámetro de entrada tiene que ser del tipo puntero de componente primitivo y se llama hit comp.

87
00:06:49,880 --> 00:06:52,160
‫Este es el componente que golpea.

88
00:06:52,160 --> 00:06:56,170
‫En nuestro caso, vamos a tener nuestra malla de proyectil golpeando cosas.

89
00:06:56,180 --> 00:07:02,240
‫El siguiente parámetro es un puntero de actor llamado Otro actor.

90
00:07:02,540 --> 00:07:05,690
‫Este va a ser el actor que fue golpeado.

91
00:07:05,720 --> 00:07:12,950
‫El siguiente parámetro de entrada es otro puntero de componente primitivo llamado otra composición.

92
00:07:12,980 --> 00:07:15,590
‫Este es el otro componente que fue golpeado.

93
00:07:15,590 --> 00:07:21,410
‫Entonces, si golpeamos el componente de malla estática de algún otro actor, entonces este sería ese componente de malla estática.

94
00:07:21,410 --> 00:07:25,760
‫El siguiente es un vector F llamado impulso normal.

95
00:07:25,820 --> 00:07:32,000
‫Si estamos simulando física, el motor de física aplicará un impulso en respuesta a la colisión.

96
00:07:32,000 --> 00:07:37,510
‫Y este vector f representa la dirección y la magnitud de ese impulso.

97
00:07:37,520 --> 00:07:46,130
‫Y finalmente, tenemos un parámetro de entrada de tipo const F hit result y esta es una referencia const y

98
00:07:46,130 --> 00:07:47,450
‫se llama hit.

99
00:07:47,450 --> 00:07:53,780
‫Entonces, cuando se llame a hit, tendremos acceso a un resultado de hit que contiene aún más información sobre el

100
00:07:53,780 --> 00:07:54,380
‫hit.

101
00:07:54,410 --> 00:07:59,150
‫Ahora, dado que vinculamos esto a un delegado, tiene que ser una función U.

102
00:07:59,150 --> 00:08:01,940
‫Así que vamos a marcar esto con tu función.

103
00:08:01,940 --> 00:08:03,800
‫Ahora, debe estar familiarizado con su función.

104
00:08:03,800 --> 00:08:08,390
‫Es como su propiedad, solo que es para funciones en lugar de variables.

105
00:08:08,390 --> 00:08:09,590
‫Muy importante.

106
00:08:09,590 --> 00:08:12,890
‫Nuestra devolución de llamada tiene que ser una función u para que esto funcione.

107
00:08:12,890 --> 00:08:14,600
‫Ahora hemos declarado la función.

108
00:08:14,600 --> 00:08:17,330
‫Avancemos y definamos la función.

109
00:08:17,570 --> 00:08:19,090
‫Así que de vuelta en proyectiles.

110
00:08:19,160 --> 00:08:24,410
‫CP Justo debajo de nuestra función tick, definamos esta función.

111
00:08:24,410 --> 00:08:31,100
‫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

112
00:08:31,100 --> 00:08:32,240
‫de devolución de llamada.

113
00:08:32,510 --> 00:08:39,230
‫Entonces, estamos listos para vincular esta función de golpe a nuestro delegado y debemos hacerlo al comenzar la reproducción.

114
00:08:39,260 --> 00:08:44,450
‫Hacerlo en el constructor es demasiado temprano y, a veces, puede encontrar problemas como que su delegado

115
00:08:44,450 --> 00:08:45,380
‫no esté vinculado.

116
00:08:45,380 --> 00:08:47,330
‫Así que lo haremos aquí y comenzaremos a jugar.

117
00:08:47,330 --> 00:08:55,460
‫Entonces tenemos nuestra malla de proyectil y usaremos el operador de flecha para acceder a la variable heredada de usted.

118
00:08:55,460 --> 00:09:03,470
‫El componente primitivo llamado en componente hit y en componente hit tiene la función add dynamic.

119
00:09:03,470 --> 00:09:08,300
‫Ahora, extrañamente, la función de autocompletar no funcionará para agregar dinámica, por lo que tendrá que escribir el

120
00:09:08,300 --> 00:09:09,740
‫nombre completo de la función.

121
00:09:09,740 --> 00:09:17,000
‫Esta es la función que usaremos para vincular nuestra devolución de llamada al éxito del componente y agregar esa función a

122
00:09:17,000 --> 00:09:18,410
‫su lista de invocación.

123
00:09:18,410 --> 00:09:23,960
‫Ahora, primero, necesitamos el objeto de usuario que será esto porque esta es la clase para

124
00:09:23,960 --> 00:09:30,290
‫la que se vincula la función y luego necesitamos la dirección de la función que será la dirección del hit.

125
00:09:30,290 --> 00:09:35,720
‫Así que usaremos la dirección del operador y la función un proyectil al impactar.

126
00:09:35,720 --> 00:09:41,180
‫Y con esto tenemos nuestra función enlazada y estamos listos para generar eventos exitosos.

127
00:09:41,420 --> 00:09:47,150
‫Ahora podemos probar esto con un registro UEE y podemos usar la advertencia de temperatura de registro.

128
00:09:48,550 --> 00:09:52,120
‫Y para el texto, simplemente podemos decir hit.

129
00:09:52,270 --> 00:09:58,090
‫Y si vemos esto en el registro de salida, sabemos que nuestra función de acceso ha sido llamada, vamos a compilar

130
00:09:58,090 --> 00:09:58,570
‫esto.

131
00:09:59,020 --> 00:10:01,270
‫Así que tengo el registro de salida abierto aquí.

132
00:10:01,270 --> 00:10:08,440
‫Voy a presionar reproducir y disparar un proyectil y ahí está mi mensaje de registro en el que se está llamando al golpe.

133
00:10:08,440 --> 00:10:09,730
‫Así que esto está funcionando.

134
00:10:10,450 --> 00:10:17,230
‫Ahora solo una nota al margen, si vamos al proyectil BP y seleccionamos malla de proyectil en el panel de detalles, podemos

135
00:10:17,230 --> 00:10:19,900
‫desplazarnos hacia abajo a la sección de colisión.

136
00:10:20,080 --> 00:10:26,290
‫Y aquí vemos que los ajustes preestablecidos de colisión están configurados para bloquear todas las dinámicas y que la colisión

137
00:10:26,290 --> 00:10:30,760
‫habilitada está configurada para esta configuración de consulta y física habilitadas para colisión.

138
00:10:30,760 --> 00:10:33,280
‫Esto es necesario para los eventos de éxito.

139
00:10:33,280 --> 00:10:36,700
‫Necesitamos poder consultar un evento de éxito.

140
00:10:36,700 --> 00:10:41,800
‫Y, por supuesto, la física permite que el motor de física actúe sobre la malla del proyectil.

141
00:10:41,800 --> 00:10:48,700
‫Entonces, ahora que nos vinculamos al delegado de hit del componente on con nuestra función on hit y colocamos un

142
00:10:48,700 --> 00:10:55,000
‫registro enorme para asegurarnos de que funciona, me gustaría que explores esta función un poco más para que podamos

143
00:10:55,000 --> 00:10:59,440
‫comprenda algunos de estos parámetros de entrada en nuestra función on hit.

144
00:10:59,440 --> 00:11:03,160
‫Entonces, en la función de éxito, agregue algunos registros YOUI más.

145
00:11:03,160 --> 00:11:08,980
‫Me gustaría que imprimiera los nombres de algunos de estos parámetros de entrada usando la función de nombre de git.

146
00:11:08,980 --> 00:11:15,970
‫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

147
00:11:15,970 --> 00:11:18,340
‫los nombres de estos objetos que estamos golpeando.

148
00:11:18,340 --> 00:11:23,770
‫Va a utilizar el formato de porcentaje, especifique el en la macro de texto de registro E.

149
00:11:23,770 --> 00:11:30,700
‫Y solo como recordatorio, cada vez que llamamos obtener nombre, debemos usar el asterisco al pasar esa cadena a la macro

150
00:11:30,700 --> 00:11:36,880
‫de registro de YUI, por ejemplo, para obtener el nombre de otro actor, llamaríamos a otro actor, obtener nombre

151
00:11:36,880 --> 00:11:42,590
‫y colocar ese asterisco. al principio solo para devolver esa cadena de estilo C, que es lo

152
00:11:42,670 --> 00:11:45,550
‫que espera cuando lo formatea con una cadena.

153
00:11:45,550 --> 00:11:52,330
‫Así que pausa el video y usa Yui log en nuestra función de hit para imprimir los nombres de hit comp, otro

154
00:11:52,330 --> 00:11:53,890
‫actor y otro comp ahora.

155
00:11:57,740 --> 00:11:58,040
‫Bueno.

156
00:11:58,040 --> 00:12:02,570
‫Así que aquí en proyectil CP, voy a usar tu registro aquí.

157
00:12:02,720 --> 00:12:10,610
‫Así que voy a copiar esta línea donde estoy usando Yui log y para la cadena voy a decir hit comp

158
00:12:11,270 --> 00:12:20,000
‫percent s y justo después del texto voy a llamar hit comp get name y necesito este asterisco para convertir de una cadena

159
00:12:20,000 --> 00:12:22,910
‫F a una cadena de estilo C.

160
00:12:22,910 --> 00:12:29,330
‫Ahora voy a usar esta misma línea, solo que voy a cambiar el texto para decir otro actor y lo

161
00:12:29,330 --> 00:12:32,480
‫llamaremos por su nombre esta vez en otro actor.

162
00:12:32,600 --> 00:12:39,950
‫Y, por último, imprimiré otras llamadas de compensación, obtendré el nombre en otra compensación.

163
00:12:40,130 --> 00:12:46,250
‫Así que vamos a compilar y de vuelta aquí en el editor, voy a seguir adelante y presionar play y disparar un

164
00:12:46,250 --> 00:12:47,630
‫proyectil y comprobar esto.

165
00:12:47,660 --> 00:12:50,780
‫Vemos que hit comp es una malla de proyectil.

166
00:12:50,780 --> 00:12:56,180
‫Recuerde que dijimos que este es el componente que golpea, que es nuestra mezcla de proyectiles

167
00:12:56,180 --> 00:13:01,940
‫y verá que está usando el nombre que le asignamos a este componente al crear un subobjeto predeterminado.

168
00:13:01,940 --> 00:13:05,570
‫Así que esta es una de esas situaciones en las que se usa ese nombre.

169
00:13:05,570 --> 00:13:09,830
‫Ahora verás que dice defecto de otro actor subrayado cero.

170
00:13:09,830 --> 00:13:16,130
‫Y eso es porque este actor de malla estática que es la falla tiene el nombre de falla subrayado cero.

171
00:13:16,130 --> 00:13:22,160
‫A veces, el motor colocará un número al final de su nombre interno para actores y

172
00:13:22,160 --> 00:13:26,630
‫componentes, y verá que sucede lo mismo cuando imprimimos otra composición.

173
00:13:26,630 --> 00:13:33,110
‫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.

174
00:13:33,110 --> 00:13:40,610
‫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.

175
00:13:40,610 --> 00:13:47,600
‫Y esto es útil porque tenemos acceso a esos objetos en C++ si queremos hacer algo en respuesta al

176
00:13:47,600 --> 00:13:48,620
‫evento hit.

177
00:13:48,800 --> 00:13:56,210
‫En resumen, hemos aprendido acerca de los eventos de éxito y cómo se implementan como delegados de multidifusión y hemos

178
00:13:56,210 --> 00:13:57,650
‫aprendido cómo funcionan.

179
00:13:57,650 --> 00:14:05,030
‫Creamos una función llamada On Hit and Bound, esa función para el delegado de hit de componente que nuestra

180
00:14:05,030 --> 00:14:09,620
‫malla de proyectil ha heredado de la clase de componente primitivo.

181
00:14:09,620 --> 00:14:15,920
‫Ahora no hemos destruido el proyectil al golpearlo, pero ahora sabemos que podemos hacerlo fácilmente porque tenemos esta función

182
00:14:15,920 --> 00:14:21,860
‫de devolución de llamada y podemos colocar la lógica en esta función, como destruir el proyectil.

183
00:14:21,860 --> 00:14:24,080
‫Así que nos encargaremos de eso en un video futuro.

184
00:14:24,080 --> 00:14:30,800
‫Por ahora, date una palmadita en la espalda porque esta es una de las áreas más complejas de Unreal Engine C++ que

185
00:14:30,800 --> 00:14:32,270
‫has aprendido hasta ahora.

186
00:14:32,480 --> 00:14:33,890
‫Te veré en el próximo video.

