﻿1
00:00:04,260 --> 00:00:05,890
‫Ciao e bentornato.

2
00:00:05,910 --> 00:00:11,130
‫Ora, abbiamo già creato la nostra classe di proiettili e siamo pronti per iniziare a generare queste

3
00:00:11,130 --> 00:00:15,660
‫cose nel livello in modo da poterle lanciare contro le torri ed eventualmente distruggerle.

4
00:00:15,660 --> 00:00:19,950
‫Ora, la generazione degli attori coinvolgerà la funzione dell'attore di generazione.

5
00:00:19,950 --> 00:00:22,470
‫Quindi impareremo come funziona in questo video.

6
00:00:22,470 --> 00:00:25,290
‫Ora, parliamo della generazione del proiettile.

7
00:00:25,320 --> 00:00:29,130
‫Questo è qualcosa che vorremmo fare dal lato C++ delle cose.

8
00:00:29,130 --> 00:00:34,590
‫Chiameremo funzioni C++ per creare nuovi oggetti in modo dinamico nel mondo.

9
00:00:34,590 --> 00:00:41,610
‫Ora stiamo generando dal lato C++ delle cose, ma vorremmo generare un oggetto basato sul progetto della

10
00:00:41,610 --> 00:00:43,110
‫nostra classe proiettile.

11
00:00:43,110 --> 00:00:50,040
‫Il motivo è perché abbiamo un progetto basato sulla classe A Projectile C++, che contiene

12
00:00:50,040 --> 00:00:51,030
‫informazioni aggiuntive.

13
00:00:51,030 --> 00:00:54,270
‫In particolare, ha quel set di proprietà mesh.

14
00:00:54,270 --> 00:00:57,780
‫Abbiamo scelto la mesh per il nostro componente mesh statico.

15
00:00:57,780 --> 00:01:00,510
‫Quindi non possiamo semplicemente generare la versione C++.

16
00:01:00,510 --> 00:01:04,590
‫Dobbiamo generare la versione del progetto per ottenere quella mesh.

17
00:01:04,590 --> 00:01:10,650
‫Quindi la domanda è: come si genera un oggetto in C++, che si basa su un progetto?

18
00:01:10,650 --> 00:01:15,810
‫Bene, impareremo qualcosa chiamato PT Subclass di ora questo è un modello.

19
00:01:15,810 --> 00:01:20,730
‫E come molti modelli, le parentesi angolari richiederanno un tipo.

20
00:01:20,730 --> 00:01:24,480
‫Quindi l'utilizzo della sottoclasse PT di richiede un parametro di tipo.

21
00:01:24,480 --> 00:01:29,790
‫E questo ci permette di avere una variabile che memorizza qualcosa chiamato classe U.

22
00:01:29,790 --> 00:01:36,690
‫La classe U rappresenta un tipo di classe, ma ha anche la capacità di interagire con il sistema di riflessione del

23
00:01:36,690 --> 00:01:37,350
‫motore irreale.

24
00:01:37,350 --> 00:01:43,290
‫Quando dico riflessione, intendo lo scambio di informazioni tra il C++ e il lato del progetto.

25
00:01:43,320 --> 00:01:50,700
‫La sottoclasse PT di, come suggerisce il nome, ci consente di memorizzare una variabile che rappresenta una classe basata sul

26
00:01:50,700 --> 00:01:54,870
‫tipo che stiamo passando o una sottoclasse di questo tipo scelto.

27
00:01:54,870 --> 00:02:01,560
‫Ciò significa che possiamo scegliere un tipo e una sottoclasse t di può contenere una classe u che rappresenta quel tipo o qualsiasi

28
00:02:01,560 --> 00:02:02,880
‫tipo derivato da esso.

29
00:02:02,880 --> 00:02:06,360
‫E questo include progetti basati sul tipo.

30
00:02:06,360 --> 00:02:09,090
‫Quindi vediamo come funziona questa sottoclasse t di cose.

31
00:02:09,090 --> 00:02:09,380
‫Bene.

32
00:02:09,390 --> 00:02:15,270
‫Quindi sono tornato qui in base pom e il motivo per cui sono in base pod è perché vogliamo che questo proiettile

33
00:02:15,270 --> 00:02:17,880
‫sia sia sulla classe tank che su quella tower.

34
00:02:17,880 --> 00:02:20,910
‫Entrambe queste classi genereranno proiettili.

35
00:02:20,910 --> 00:02:23,700
‫Quindi vorrei una sottoclasse t di variabile qui.

36
00:02:23,700 --> 00:02:30,930
‫Quindi dirò t sottoclasse di e tra parentesi angolari dobbiamo passare in un tipo.

37
00:02:30,930 --> 00:02:34,740
‫Ora possiamo dichiarare in avanti anche all'interno di parentesi angolari come questa.

38
00:02:34,740 --> 00:02:37,440
‫E farò del tipo un proiettile.

39
00:02:37,440 --> 00:02:42,690
‫E il motivo è perché abbiamo creato la classe proiettile e il suo tipo è un proiettile.

40
00:02:42,690 --> 00:02:47,940
‫Quindi creerò questa variabile e la chiamerò classe proiettile.

41
00:02:47,940 --> 00:02:54,960
‫Ora, questo ci consentirà di avere una variabile C++ che rappresenta un tipo di classe e il tipo può essere

42
00:02:54,960 --> 00:02:59,670
‫basato su un proiettile, anche un tipo di classe blueprint basato su questo.

43
00:02:59,670 --> 00:03:02,100
‫Ora gli darò una proprietà U.

44
00:03:02,730 --> 00:03:07,620
‫E poiché mi piacerebbe essere in grado di modificarlo, almeno nel progetto predefinito, renderò

45
00:03:07,620 --> 00:03:09,060
‫questa modifica predefinita.

46
00:03:09,060 --> 00:03:12,540
‫Solo ora possiamo dare a questo una categoria.

47
00:03:13,530 --> 00:03:16,170
‫Lo metterò in una categoria chiamata combattimento.

48
00:03:16,200 --> 00:03:18,240
‫Ora andiamo avanti e compiliamo questo.

49
00:03:18,270 --> 00:03:23,130
‫Ok, quindi sono tornato nell'editor e andrò nella cartella dei progetti e da lì

50
00:03:23,130 --> 00:03:24,330
‫nella cartella Pons.

51
00:03:24,330 --> 00:03:29,580
‫E ho intenzione di aprire BP -- tank e aprire l'editor completo del progetto.

52
00:03:29,580 --> 00:03:32,910
‫Ora, se guardo nel pannello dei dettagli, posso cercare il combattimento.

53
00:03:32,910 --> 00:03:33,840
‫Ecco qui.

54
00:03:33,840 --> 00:03:36,540
‫Ed ecco la variabile di classe del proiettile.

55
00:03:36,540 --> 00:03:40,410
‫Questa è quella sottoclasse di quella che abbiamo chiamato classe proiettile.

56
00:03:40,410 --> 00:03:44,250
‫Ora nota che possiamo impostarlo qui e possiamo impostarlo usando un menu a discesa.

57
00:03:44,250 --> 00:03:47,910
‫E se facciamo clic sul menu a discesa, abbiamo tre opzioni.

58
00:03:47,910 --> 00:03:53,340
‫Possiamo impostarlo su nessuno, che è quello su cui è impostato per impostazione predefinita, il che in pratica significa che è un puntatore nullo.

59
00:03:53,340 --> 00:03:57,960
‫Oppure possiamo impostarlo su proiettile o proiettile BP.

60
00:03:57,990 --> 00:04:04,740
‫Questo è ciò che la sottoclasse di ci consente di fare è impostare questa classe di proiettili su un tipo particolare basato sul

61
00:04:04,740 --> 00:04:08,880
‫proiettile, poiché questo è il tipo che abbiamo scelto quando abbiamo creato la variabile.

62
00:04:08,880 --> 00:04:10,140
‫Ora proiettile qui.

63
00:04:10,140 --> 00:04:14,520
‫Questa è la classe C++ chiamata proiettile in C++.

64
00:04:14,520 --> 00:04:22,260
‫È un proiettile, ma il proiettile BP è un progetto basato sulla classe del proiettile C++ e possiamo scegliere

65
00:04:22,260 --> 00:04:22,920
‫questo.

66
00:04:22,920 --> 00:04:27,870
‫E ora la classe del proiettile è impostata sul tipo di proiettile BP.

67
00:04:27,870 --> 00:04:32,610
‫Ora, questo non è un componente e non è un oggetto proiettile BP.

68
00:04:32,610 --> 00:04:33,540
‫Non è quello che è.

69
00:04:33,540 --> 00:04:36,480
‫Memorizza un tipo, più specificamente una U.

70
00:04:36,480 --> 00:04:37,260
‫Tipo di classe.

71
00:04:37,260 --> 00:04:44,730
‫E come ho detto, la tua classe ha funzionalità integrate che consentono alla riflessione di funzionare tra C++ e

72
00:04:44,730 --> 00:04:45,390
‫blueprint.

73
00:04:45,390 --> 00:04:48,690
‫Le informazioni possono fluire tra C++ e blueprint.

74
00:04:48,690 --> 00:04:55,710
‫Quindi ora abbiamo la classe del proiettile, una sottoclasse PT impostata sul tipo di progetto del proiettile BP.

75
00:04:55,710 --> 00:04:59,790
‫Allora perché affrontare tutti i problemi per creare una sottoclasse di variabile?

76
00:04:59,790 --> 00:05:03,750
‫Bene, dobbiamo discutere di come funziona la funzione dell'attore di spawn.

77
00:05:04,200 --> 00:05:08,400
‫Spawn attore è una funzione appartenente alla nuova classe mondiale.

78
00:05:08,400 --> 00:05:12,120
‫Quindi, se riusciamo a controllare il mondo, possiamo chiamare Spawn attore.

79
00:05:12,120 --> 00:05:19,620
‫E l'attore Spawn è un'altra funzione del modello ed è progettato per creare nuovi oggetti simili alla creazione di

80
00:05:19,620 --> 00:05:21,060
‫oggetti secondari predefiniti.

81
00:05:21,060 --> 00:05:28,260
‫Ma la creazione di un oggetto secondario predefinito è progettata per la creazione di componenti e possiamo usarla solo nel costruttore

82
00:05:28,260 --> 00:05:35,520
‫per una particolare classe, l'attore di spawn può essere chiamato in fase di esecuzione mentre il gioco è in esecuzione e può

83
00:05:35,520 --> 00:05:36,360
‫creare attori.

84
00:05:36,360 --> 00:05:39,450
‫Ora è un modello, quindi richiede un tipo.

85
00:05:39,480 --> 00:05:45,780
‫Se vogliamo generare un proiettile, allora passeremmo nella classe C++ digitando qui un proiettile.

86
00:05:45,810 --> 00:05:52,590
‫Questa è la classe C++ che viene restituita dalla funzione spawn attore in C++.

87
00:05:52,620 --> 00:05:57,060
‫Ora le parentesi accettano un certo numero di parametri, inclusa una classe U.

88
00:05:57,060 --> 00:06:02,190
‫Ora ci sono più sovraccarichi di questa funzione che accettano parametri di input diversi.

89
00:06:02,190 --> 00:06:07,590
‫La più semplice forse è la versione che richiede una classe U, una posizione A e una rotazione.

90
00:06:07,590 --> 00:06:08,010
‫L'U.

91
00:06:08,010 --> 00:06:11,280
‫La classe è ciò che rappresenta il tipo da generare.

92
00:06:11,310 --> 00:06:16,020
‫Questo è il tipo effettivo dell'oggetto che viene generato.

93
00:06:16,050 --> 00:06:18,300
‫Questa potrebbe essere una classe di progetto.

94
00:06:18,330 --> 00:06:25,890
‫La posizione è un vettore F che specifica dove generare l'oggetto e la rotazione ne specificherà la rotazione.

95
00:06:25,890 --> 00:06:28,710
‫Quindi un esempio della sintassi è simile a questo.

96
00:06:28,710 --> 00:06:35,580
‫Chiameremmo spawn attore specificando il tipo di classe e quindi passando le informazioni sulla classe u insieme al

97
00:06:35,580 --> 00:06:38,820
‫vettore di posizione e al rotatore di rotazione.

98
00:06:38,820 --> 00:06:41,160
‫Quindi parliamo della tua classe per un secondo.

99
00:06:41,160 --> 00:06:44,970
‫Ora, come abbiamo detto, la tua classe rappresenta un tipo di classe.

100
00:06:44,970 --> 00:06:51,480
‫Quando chiamiamo Spawn attore, passiamo a una classe U per fornire alla funzione spawn attore

101
00:06:51,480 --> 00:06:53,550
‫informazioni sull'oggetto da spawn.

102
00:06:53,910 --> 00:07:01,320
‫Sì, abbiamo passato un tipo tra parentesi angolari, ma questo dice semplicemente all'attore Spawn il tipo C++ da

103
00:07:01,320 --> 00:07:01,860
‫creare.

104
00:07:01,860 --> 00:07:04,890
‫Mentre la tua classe contiene più informazioni.

105
00:07:04,890 --> 00:07:11,070
‫Diciamo che abbiamo creato un progetto basato su un proiettile e nel progetto abbiamo impostato alcune proprietà come

106
00:07:11,070 --> 00:07:14,580
‫la scelta della mesh statica per il componente mesh statico.

107
00:07:14,580 --> 00:07:21,480
‫Ora, se dovessimo semplicemente generare una classe C++ grezza, quella mesh statica non verrà impostata sull'oggetto

108
00:07:21,480 --> 00:07:22,860
‫proiettile appena generato.

109
00:07:22,860 --> 00:07:26,250
‫In sostanza, stiamo solo generando un nuovo attore invisibile.

110
00:07:26,430 --> 00:07:30,780
‫Tuttavia, una nuova variabile di classe può rappresentare una classe blueprint.

111
00:07:30,930 --> 00:07:37,140
‫La tua classe ci dà la possibilità di avere una variabile sul lato C++, che rappresenta un progetto, un tipo

112
00:07:37,140 --> 00:07:38,730
‫di classe e uno spawn.

113
00:07:38,730 --> 00:07:45,900
‫L'attore può prendere quella classe come argomento di input in modo che possa generare un nuovo oggetto basato sul progetto

114
00:07:45,900 --> 00:07:48,060
‫rappresentato da quella nuova classe.

115
00:07:48,060 --> 00:07:54,810
‫Quindi un nuovo proiettile avrà la sua proprietà mesh statica impostata perché stiamo generando un nuovo oggetto

116
00:07:54,810 --> 00:07:58,560
‫basato sul progetto e non sulla classe C++ grezza.

117
00:07:58,560 --> 00:08:05,190
‫Questo è il motivo per cui abbiamo creato la nostra sottoclasse perché può memorizzare una nuova classe e siamo stati

118
00:08:05,190 --> 00:08:10,050
‫in grado di impostarla uguale al proiettile BP dal nostro progetto BP - serbatoio.

119
00:08:10,050 --> 00:08:13,020
‫Quindi ora sai come generare attori.

120
00:08:13,170 --> 00:08:16,020
‫L'attore Spawn appartiene alla nuova classe mondiale.

121
00:08:16,020 --> 00:08:22,320
‫Quindi, se chiami get world e chiami semplicemente Spawn attore, allora conosci i requisiti di

122
00:08:22,320 --> 00:08:29,370
‫input per questa funzione che passi nel tipo C++ tra parentesi angolari e classifichi una posizione e una

123
00:08:29,370 --> 00:08:30,750
‫rotazione tra parentesi.

124
00:08:30,750 --> 00:08:35,820
‫Quindi, per la tua sfida, genererai il proiettile, fallo nella funzione di fuoco.

125
00:08:35,820 --> 00:08:41,760
‫Quindi chiama l'attore di spawn del mondo e passa in un proiettile tra parentesi angolari.

126
00:08:41,760 --> 00:08:45,390
‫Ciò significa che dovrai includere il file di intestazione per il proiettile.

127
00:08:45,390 --> 00:08:52,170
‫Quindi non dimenticarlo e usa la nostra nuova classe proiettile variabile come parametro di input della classe U tra

128
00:08:52,170 --> 00:08:52,920
‫parentesi.

129
00:08:52,920 --> 00:08:55,320
‫Ora abbiamo bisogno di una posizione e di una rotazione.

130
00:08:55,320 --> 00:09:00,480
‫Utilizzerai il punto di spawn del proiettile sia per la posizione che per la rotazione.

131
00:09:00,480 --> 00:09:02,850
‫Dal componente del punto di spawn del proiettile.

132
00:09:02,850 --> 00:09:09,000
‫È possibile chiamare get Component Location e ottenere la rotazione dei componenti per accedere a questi valori.

133
00:09:09,000 --> 00:09:14,040
‫Quindi metti in pausa il video e chiama ora l'attore di spawn nella funzione di fuoco.

134
00:09:16,920 --> 00:09:17,310
‫Bene.

135
00:09:17,310 --> 00:09:22,880
‫Quindi entriamo in Base Pond CP dove abbiamo definito la funzione di fuoco.

136
00:09:22,890 --> 00:09:25,230
‫Ora abbiamo disegnare la sfera di debug qui.

137
00:09:25,230 --> 00:09:27,450
‫Non ne avremo davvero più bisogno.

138
00:09:27,450 --> 00:09:33,270
‫Quindi eliminerò questa chiamata di funzione e invece chiamerò l'attore Spawn qui.

139
00:09:33,270 --> 00:09:36,750
‫Ora abbiamo già la posizione del punto di spawn del proiettile.

140
00:09:37,050 --> 00:09:43,770
‫Rinominerò questa variabile locale semplicemente in posizione e creerò un nuovo rotatore F.

141
00:09:44,430 --> 00:09:45,810
‫Chiamato rotazione.

142
00:09:45,900 --> 00:09:50,010
‫E questo lo otterrò anche dal punto di spawn del proiettile.

143
00:09:50,010 --> 00:09:56,670
‫Quindi sarà il punto di spawn del proiettile a ottenere la rotazione dei componenti.

144
00:09:56,670 --> 00:10:01,980
‫Quindi ora ho la posizione e la rotazione in cui generare il proiettile.

145
00:10:02,430 --> 00:10:07,050
‫Quindi dopo devo chiamare l'attore spawn in modo da poter chiamare get world.

146
00:10:07,050 --> 00:10:11,910
‫E dal mondo che ottengo da questa funzione, posso chiamare spawn attore.

147
00:10:12,240 --> 00:10:15,780
‫Ora questo ha parentesi angolari e parentesi, giusto?

148
00:10:15,780 --> 00:10:19,740
‫Quindi tra parentesi angolari, devo usare un proiettile.

149
00:10:21,240 --> 00:10:25,640
‫E poiché stiamo usando un proiettile, dobbiamo includere l'intestazione per quello.

150
00:10:25,650 --> 00:10:32,760
‫Quindi qui sopra, rimuoverò, disegnerò gli helper di debug e lo sostituirò con proiettile.

151
00:10:34,740 --> 00:10:37,260
‫Quindi ora abbiamo incluso quel tipo.

152
00:10:37,260 --> 00:10:44,070
‫Ora abbiamo bisogno della classe U e in base a H ha una classe di proiettili, possiamo usarla come classe U.

153
00:10:44,070 --> 00:10:47,050
‫Quindi passeremo in classe di proiettili.

154
00:10:47,070 --> 00:10:54,750
‫Ora, finalmente, possiamo passare in posizione e rotazione e questo soddisferà la funzione dell'attore di spawn.

155
00:10:54,750 --> 00:11:00,420
‫Quindi andiamo avanti e compiliamo questo e torniamo qui nell'editor e possiamo testare il gioco.

156
00:11:00,420 --> 00:11:04,080
‫Quindi andrò avanti e farò clic e verificherò.

157
00:11:04,080 --> 00:11:06,750
‫Abbiamo generato un nuovo proiettile.

158
00:11:06,750 --> 00:11:13,680
‫Stiamo generando il proiettile sulla punta della nostra canna e loro si librano semplicemente nell'aria, il che non

159
00:11:13,680 --> 00:11:15,660
‫sembra proprio a posto.

160
00:11:15,660 --> 00:11:16,430
‫Ma va bene.

161
00:11:16,440 --> 00:11:17,700
‫Questo è il primo passo.

162
00:11:17,700 --> 00:11:23,580
‫Per prima cosa dobbiamo generare il proiettile, facendo in modo che si comporti come un proiettile come passaggio successivo.

163
00:11:23,580 --> 00:11:27,120
‫Quindi, in sintesi, ora stiamo generando proiettili.

164
00:11:27,150 --> 00:11:29,060
‫Questo è un grande traguardo.

165
00:11:29,070 --> 00:11:32,250
‫Tuttavia, non sono ancora dei proiettili.

166
00:11:32,280 --> 00:11:36,060
‫Si librano semplicemente lì e i proiettili dovrebbero volare nell'aria.

167
00:11:36,210 --> 00:11:41,490
‫Quindi nel prossimo video parleremo di come far volare i nostri proiettili nell'aria in

168
00:11:41,490 --> 00:11:43,800
‫modo che si comportino come proiettili.

169
00:11:43,830 --> 00:11:44,700
‫Ci vediamo presto.

