﻿1
00:00:04,260 --> 00:00:05,890
‫Hola y bienvenido de nuevo.

2
00:00:05,910 --> 00:00:11,130
‫Ahora, ya hemos creado nuestra clase de proyectil, y estamos listos para comenzar a generar estas cosas

3
00:00:11,130 --> 00:00:15,660
‫en el nivel para que podamos lanzarlas a las torres y eventualmente destruirlas.

4
00:00:15,660 --> 00:00:19,950
‫Ahora, los actores de desove involucrarán la función de actor de desove.

5
00:00:19,950 --> 00:00:22,470
‫Así que vamos a aprender cómo funciona eso en este video.

6
00:00:22,470 --> 00:00:25,290
‫Ahora, hablemos de generar el proyectil.

7
00:00:25,320 --> 00:00:29,130
‫Esto es algo que nos gustaría hacer desde el punto de vista de C++.

8
00:00:29,130 --> 00:00:34,590
‫Vamos a llamar a las funciones de C++ para crear nuevos objetos dinámicamente en el mundo.

9
00:00:34,590 --> 00:00:41,610
‫Ahora estamos generando desde el lado C++ de las cosas, pero nos gustaría generar un objeto basado en el modelo de

10
00:00:41,610 --> 00:00:43,110
‫nuestra clase de proyectil.

11
00:00:43,110 --> 00:00:50,040
‫El motivo es que tenemos un modelo basado en la clase A Projectile C++, que contiene

12
00:00:50,040 --> 00:00:51,030
‫información adicional.

13
00:00:51,030 --> 00:00:54,270
‫Específicamente, tiene ese conjunto de propiedades de malla.

14
00:00:54,270 --> 00:00:57,780
‫Elegimos la malla para nuestro componente de malla estática.

15
00:00:57,780 --> 00:01:00,510
‫Así que no podemos simplemente generar la versión C++.

16
00:01:00,510 --> 00:01:04,590
‫Tenemos que generar la versión del plano para obtener esa malla.

17
00:01:04,590 --> 00:01:10,650
‫Entonces, la pregunta es ¿cómo generamos un objeto en C ++, que se basa en un plano?

18
00:01:10,650 --> 00:01:15,810
‫Bueno, vamos a aprender sobre algo llamado Subclase PT de ahora esta es una plantilla.

19
00:01:15,810 --> 00:01:20,730
‫Y como muchas plantillas, los corchetes angulares requerirán un tipo.

20
00:01:20,730 --> 00:01:24,480
‫Entonces, usar la subclase PT requiere un parámetro de tipo.

21
00:01:24,480 --> 00:01:29,790
‫Y esto nos permite tener una variable que almacena algo llamado clase U.

22
00:01:29,790 --> 00:01:36,690
‫La clase U representa un tipo de clase, pero también tiene la capacidad de interactuar con el sistema de reflexión del

23
00:01:36,690 --> 00:01:37,350
‫motor irreal.

24
00:01:37,350 --> 00:01:43,290
‫Cuando digo reflexión, me refiero al intercambio de información entre C++ y el lado del modelo.

25
00:01:43,320 --> 00:01:50,700
‫La subclase PT, como sugiere el nombre, nos permite almacenar una variable que representa una clase basada en el tipo

26
00:01:50,700 --> 00:01:54,870
‫que estamos pasando o una subclase de este tipo elegido.

27
00:01:54,870 --> 00:02:01,560
‫Esto significa que podemos elegir un tipo y la subclase t puede contener una clase u que representa ese tipo o cualquier

28
00:02:01,560 --> 00:02:02,880
‫tipo derivado de él.

29
00:02:02,880 --> 00:02:06,360
‫Y esto incluye planos basados en el tipo.

30
00:02:06,360 --> 00:02:09,090
‫Entonces, veamos cómo funciona esta subclase t de cosas.

31
00:02:09,090 --> 00:02:09,380
‫Bueno.

32
00:02:09,390 --> 00:02:15,270
‫Así que estoy de vuelta aquí en base pom y la razón por la que estoy en base pod es porque queremos que este proyectil esté

33
00:02:15,270 --> 00:02:17,880
‫tanto en la clase de tanque como en la de torre.

34
00:02:17,880 --> 00:02:20,910
‫Ambas clases generarán proyectiles.

35
00:02:20,910 --> 00:02:23,700
‫Así que me gustaría una subclase t de variable aquí.

36
00:02:23,700 --> 00:02:30,930
‫Así que voy a decir t subclase de y en los paréntesis angulares necesitamos pasar un tipo.

37
00:02:30,930 --> 00:02:34,740
‫Ahora podemos reenviar declaraciones incluso dentro de paréntesis angulares como este.

38
00:02:34,740 --> 00:02:37,440
‫Y voy a hacer que el tipo sea un proyectil.

39
00:02:37,440 --> 00:02:42,690
‫Y la razón es porque creamos la clase proyectil y su tipo es un proyectil.

40
00:02:42,690 --> 00:02:47,940
‫Así que voy a crear esta variable y la llamaré clase de proyectil.

41
00:02:47,940 --> 00:02:54,960
‫Ahora, esto nos permitirá tener una variable de C++ que represente un tipo de clase, y el tipo puede estar

42
00:02:54,960 --> 00:02:59,670
‫basado en un proyectil, incluso un tipo de clase blueprint basado en esto.

43
00:02:59,670 --> 00:03:02,100
‫Ahora voy a darle una propiedad U.

44
00:03:02,730 --> 00:03:07,620
‫Y como me gustaría poder editar esto, al menos en el modelo predeterminado, voy a hacer que

45
00:03:07,620 --> 00:03:09,060
‫esta edición sea la predeterminada.

46
00:03:09,060 --> 00:03:12,540
‫Solo que ahora podemos darle a esto una categoría.

47
00:03:13,530 --> 00:03:16,170
‫Lo colocaré en una categoría llamada combate.

48
00:03:16,200 --> 00:03:18,240
‫Ahora sigamos adelante y compilemos esto.

49
00:03:18,270 --> 00:03:23,130
‫Bien, estoy de vuelta en el editor y voy a ir a la carpeta de planos y de allí

50
00:03:23,130 --> 00:03:24,330
‫a la carpeta Pons.

51
00:03:24,330 --> 00:03:29,580
‫Y voy a abrir BP -- tank y abrir el editor de planos completo.

52
00:03:29,580 --> 00:03:32,910
‫Ahora, si miro en el panel de detalles, puedo buscar combate.

53
00:03:32,910 --> 00:03:33,840
‫Aquí está.

54
00:03:33,840 --> 00:03:36,540
‫Y aquí está la variable de clase de proyectil.

55
00:03:36,540 --> 00:03:40,410
‫Esta es esa subclase de la que llamamos clase proyectil.

56
00:03:40,410 --> 00:03:44,250
‫Ahora observe que podemos configurarlo aquí y podemos configurarlo usando un menú desplegable.

57
00:03:44,250 --> 00:03:47,910
‫Y si hacemos clic en el desplegable, tenemos tres opciones.

58
00:03:47,910 --> 00:03:53,340
‫Podemos establecerlo en ninguno, que es el valor predeterminado, lo que básicamente significa que es un puntero nulo.

59
00:03:53,340 --> 00:03:57,960
‫O podemos configurarlo en proyectil o proyectil BP.

60
00:03:57,990 --> 00:04:04,740
‫Eso es lo que la subclase de nos permite hacer es establecer esta clase de proyectil en un tipo particular basado en el

61
00:04:04,740 --> 00:04:08,880
‫proyectil, ya que ese es el tipo que elegimos cuando creamos la variable.

62
00:04:08,880 --> 00:04:10,140
‫Ahora proyectil aquí.

63
00:04:10,140 --> 00:04:14,520
‫Esta es la clase de C++ llamada proyectil en C++.

64
00:04:14,520 --> 00:04:22,260
‫Es un proyectil, pero el proyectil BP es un modelo basado en la clase de proyectil C++ y podemos elegir

65
00:04:22,260 --> 00:04:22,920
‫esto.

66
00:04:22,920 --> 00:04:27,870
‫Y ahora la clase de proyectil se establece en el tipo de proyectil BP.

67
00:04:27,870 --> 00:04:32,610
‫Ahora, esto no es un componente y no es un objeto de proyectil BP.

68
00:04:32,610 --> 00:04:33,540
‫Eso no es lo que es.

69
00:04:33,540 --> 00:04:36,480
‫Almacena un tipo, más específicamente una U.

70
00:04:36,480 --> 00:04:37,260
‫tipo de clase.

71
00:04:37,260 --> 00:04:44,730
‫Y como dije, su clase tiene una funcionalidad integrada que permite que la reflexión funcione entre C++ y

72
00:04:44,730 --> 00:04:45,390
‫blueprints.

73
00:04:45,390 --> 00:04:48,690
‫La información puede fluir entre C++ y blueprints.

74
00:04:48,690 --> 00:04:55,710
‫Así que ahora tenemos una clase de proyectil, una subclase de PT establecida en el tipo de plano de proyectil BP.

75
00:04:55,710 --> 00:04:59,790
‫Entonces, ¿por qué tomarse la molestia de crear una subclase de variable?

76
00:04:59,790 --> 00:05:03,750
‫Bueno, tenemos que discutir cómo funciona la función de actor de generación.

77
00:05:04,200 --> 00:05:08,400
‫Spawn actor es una función que pertenece a la nueva clase mundial.

78
00:05:08,400 --> 00:05:12,120
‫Entonces, si conseguimos un asimiento del mundo, podemos llamar al actor de Spawn.

79
00:05:12,120 --> 00:05:19,620
‫Y el actor Spawn es otra función de plantilla y está diseñado para crear nuevos objetos similares a

80
00:05:19,620 --> 00:05:21,060
‫los subobjetos predeterminados.

81
00:05:21,060 --> 00:05:28,260
‫Pero crear un subobjeto predeterminado está diseñado para crear componentes y solo podemos usarlo en el constructor para un actor de

82
00:05:28,260 --> 00:05:35,520
‫generación de clase en particular que se puede llamar en tiempo de ejecución mientras el juego se está ejecutando y puede

83
00:05:35,520 --> 00:05:36,360
‫crear actores.

84
00:05:36,360 --> 00:05:39,450
‫Ahora es una plantilla, por lo que requiere un tipo.

85
00:05:39,480 --> 00:05:45,780
‫Si queremos generar un proyectil, entonces pasaríamos el tipo de clase C++ aquí un proyectil.

86
00:05:45,810 --> 00:05:52,590
‫Esta es la clase de C++ que devuelve la función de actor de generación en C++.

87
00:05:52,620 --> 00:05:57,060
‫Ahora los paréntesis toman una serie de parámetros, incluida una clase U.

88
00:05:57,060 --> 00:06:02,190
‫Ahora hay múltiples sobrecargas de esta función que toman diferentes parámetros de entrada.

89
00:06:02,190 --> 00:06:07,590
‫La más simple quizás sea la versión que toma una clase U, una ubicación y una rotación.

90
00:06:07,590 --> 00:06:08,010
‫la u

91
00:06:08,010 --> 00:06:11,280
‫La clase es lo que representa el tipo para generar.

92
00:06:11,310 --> 00:06:16,020
‫Este es el tipo real del objeto que se genera.

93
00:06:16,050 --> 00:06:18,300
‫Esto podría ser una clase modelo.

94
00:06:18,330 --> 00:06:25,890
‫La ubicación es un vector F que especifica dónde generar el objeto y la rotación especificará su rotación.

95
00:06:25,890 --> 00:06:28,710
‫Entonces, un ejemplo de la sintaxis se ve así.

96
00:06:28,710 --> 00:06:35,580
‫Llamaríamos al actor de generación especificando el tipo de clase y luego pasando esa información de clase junto con el

97
00:06:35,580 --> 00:06:38,820
‫vector de ubicación y el rotador de rotación.

98
00:06:38,820 --> 00:06:41,160
‫Así que hablemos de tu clase por un segundo.

99
00:06:41,160 --> 00:06:44,970
‫Ahora, como hemos estado diciendo, tu clase representa un tipo de clase.

100
00:06:44,970 --> 00:06:51,480
‫Cuando llamamos al actor de generación, pasamos una clase U para proporcionar a la función de actor de generación información

101
00:06:51,480 --> 00:06:53,550
‫sobre el objeto que se generará.

102
00:06:53,910 --> 00:07:01,320
‫Sí, pasamos un tipo entre paréntesis angulares, pero eso simplemente le dice al actor de Spawn el tipo de C++ que debe

103
00:07:01,320 --> 00:07:01,860
‫crear.

104
00:07:01,860 --> 00:07:04,890
‫Mientras que su clase contiene más información.

105
00:07:04,890 --> 00:07:11,070
‫Digamos que creamos un plano basado en un proyectil y en el plano configuramos algunas propiedades, como elegir

106
00:07:11,070 --> 00:07:14,580
‫la malla estática para el componente de malla estática.

107
00:07:14,580 --> 00:07:21,480
‫Ahora, si tuviéramos que generar una clase de C++ sin procesar, entonces esa malla estática no se establecerá en el objeto

108
00:07:21,480 --> 00:07:22,860
‫de proyectil recién generado.

109
00:07:22,860 --> 00:07:26,250
‫Esencialmente, solo estaríamos generando un nuevo actor invisible.

110
00:07:26,430 --> 00:07:30,780
‫Sin embargo, una nueva variable de clase puede representar una clase de modelo.

111
00:07:30,930 --> 00:07:37,140
‫Su clase nos da la posibilidad de tener una variable en el lado de C++, que representa un modelo, tipo

112
00:07:37,140 --> 00:07:38,730
‫de clase y generación.

113
00:07:38,730 --> 00:07:45,900
‫El actor puede tomar esa clase como argumento de entrada para que pueda generar un nuevo objeto basado en el

114
00:07:45,900 --> 00:07:48,060
‫modelo representado por esa nueva clase.

115
00:07:48,060 --> 00:07:54,810
‫Entonces, un nuevo proyectil tendrá su propiedad de malla estática establecida porque estamos generando un nuevo objeto basado en

116
00:07:54,810 --> 00:07:58,560
‫el modelo y no en la clase C++ sin formato.

117
00:07:58,560 --> 00:08:05,190
‫Esta es la razón por la que creamos nuestra subclase porque puede almacenar una nueva clase y

118
00:08:05,190 --> 00:08:10,050
‫pudimos establecerla igual al proyectil BP de nuestro modelo de tanque BP.

119
00:08:10,050 --> 00:08:13,020
‫Entonces ahora sabes cómo engendrar actores.

120
00:08:13,170 --> 00:08:16,020
‫El actor de Spawn pertenece a la nueva clase mundial.

121
00:08:16,020 --> 00:08:22,320
‫Entonces, si llama a get world y simplemente llama al actor Spawn, entonces conoce los requisitos de

122
00:08:22,320 --> 00:08:29,370
‫entrada para esta función que pasa en el tipo C ++ entre corchetes angulares y clasifica una ubicación y una

123
00:08:29,370 --> 00:08:30,750
‫rotación entre paréntesis.

124
00:08:30,750 --> 00:08:35,820
‫Entonces, para su desafío, va a generar el proyectil, haga esto en la función de disparo.

125
00:08:35,820 --> 00:08:41,760
‫Así que llame al actor de generación mundial y pase un proyectil en los paréntesis angulares.

126
00:08:41,760 --> 00:08:45,390
‫Esto significa que necesitará incluir el archivo de encabezado para el proyectil.

127
00:08:45,390 --> 00:08:52,170
‫Así que no olvide eso y use nuestra nueva clase de proyectil variable como el parámetro de entrada de la clase U

128
00:08:52,170 --> 00:08:52,920
‫entre paréntesis.

129
00:08:52,920 --> 00:08:55,320
‫Ahora necesitamos una ubicación y una rotación.

130
00:08:55,320 --> 00:09:00,480
‫Vas a usar el punto de generación del proyectil tanto para la ubicación como para la rotación.

131
00:09:00,480 --> 00:09:02,850
‫Desde el componente del punto de generación del proyectil.

132
00:09:02,850 --> 00:09:09,000
‫Puede llamar a obtener la ubicación del componente y obtener la rotación del componente para acceder a estos valores.

133
00:09:09,000 --> 00:09:14,040
‫Así que pausa el video y llama al actor de generación en la función de fuego ahora.

134
00:09:16,920 --> 00:09:17,310
‫Bueno.

135
00:09:17,310 --> 00:09:22,880
‫Así que vayamos a Base Pond CP donde tenemos definida la función de fuego.

136
00:09:22,890 --> 00:09:25,230
‫Ahora tenemos una esfera de depuración dibujada aquí.

137
00:09:25,230 --> 00:09:27,450
‫Realmente ya no vamos a necesitar eso.

138
00:09:27,450 --> 00:09:33,270
‫Así que voy a eliminar esta llamada de función y en su lugar voy a llamar al actor de Spawn aquí.

139
00:09:33,270 --> 00:09:36,750
‫Ahora ya tenemos la ubicación del punto de generación del proyectil.

140
00:09:37,050 --> 00:09:43,770
‫Voy a cambiar el nombre de esta variable local a simplemente ubicación y voy a crear un nuevo rotador F.

141
00:09:44,430 --> 00:09:45,810
‫llamada rotación.

142
00:09:45,900 --> 00:09:50,010
‫Y esto también lo obtendré del punto de generación del proyectil.

143
00:09:50,010 --> 00:09:56,670
‫Así que va a ser el punto de generación del proyectil obtener la rotación del componente.

144
00:09:56,670 --> 00:10:01,980
‫Así que ahora tengo la ubicación y la rotación en la que generar el proyectil.

145
00:10:02,430 --> 00:10:07,050
‫Entonces, a continuación, necesito llamar al actor de generación para poder llamar a get world.

146
00:10:07,050 --> 00:10:11,910
‫Y del mundo que obtengo de esta función, puedo llamar a spawn actor.

147
00:10:12,240 --> 00:10:15,780
‫Ahora bien, esto tiene corchetes angulares y paréntesis, ¿verdad?

148
00:10:15,780 --> 00:10:19,740
‫Entonces, en los paréntesis angulares, necesito usar un proyectil.

149
00:10:21,240 --> 00:10:25,640
‫Y como estamos usando un proyectil, necesitamos incluir el encabezado para eso.

150
00:10:25,650 --> 00:10:32,760
‫Así que aquí arriba, voy a eliminar, dibujar ayudantes de depuración y reemplazarlo con un proyectil.

151
00:10:34,740 --> 00:10:37,260
‫Así que ahora tenemos ese tipo incluido.

152
00:10:37,260 --> 00:10:44,070
‫Ahora necesitamos la clase U y, en base a que H tiene una clase de proyectil, podemos usarla como clase U.

153
00:10:44,070 --> 00:10:47,050
‫Así que vamos a pasar en clase de proyectiles.

154
00:10:47,070 --> 00:10:54,750
‫Ahora, finalmente, podemos pasar la ubicación y la rotación y esto satisfará la función del actor de generación.

155
00:10:54,750 --> 00:11:00,420
‫Así que sigamos adelante y compilemos esto y estamos de vuelta aquí en el editor y podemos probar el juego.

156
00:11:00,420 --> 00:11:04,080
‫Así que voy a seguir adelante y hacer clic y comprobarlo.

157
00:11:04,080 --> 00:11:06,750
‫Hemos generado un nuevo proyectil.

158
00:11:06,750 --> 00:11:13,680
‫Estamos generando el proyectil en la punta de nuestro barril y simplemente flotan en el aire, lo que

159
00:11:13,680 --> 00:11:15,660
‫realmente no se ve bien.

160
00:11:15,660 --> 00:11:16,430
‫Pero eso está bien.

161
00:11:16,440 --> 00:11:17,700
‫Este es el primer paso.

162
00:11:17,700 --> 00:11:23,580
‫Primero tenemos que generar el proyectil, haciendo que actúe como un proyectil como el siguiente paso.

163
00:11:23,580 --> 00:11:27,120
‫Entonces, en resumen, ahora estamos generando proyectiles.

164
00:11:27,150 --> 00:11:29,060
‫Este es un gran hito.

165
00:11:29,070 --> 00:11:32,250
‫Sin embargo, todavía no son proyectiles.

166
00:11:32,280 --> 00:11:36,060
‫Simplemente flotan allí y se supone que los proyectiles vuelan por el aire.

167
00:11:36,210 --> 00:11:41,490
‫Entonces, en el siguiente video, vamos a hablar sobre cómo hacer que nuestros proyectiles vuelen por

168
00:11:41,490 --> 00:11:43,800
‫el aire para que actúen como proyectiles.

169
00:11:43,830 --> 00:11:44,700
‫Te veré pronto.

