﻿1
00:00:03,980 --> 00:00:05,900
‫Ciao e bentornato.

2
00:00:05,930 --> 00:00:10,610
‫Ora abbiamo creato un carro armato che può muoversi e persino ruotare la sua torretta.

3
00:00:10,610 --> 00:00:16,190
‫E ora siamo pronti per creare una classe tower che possa ereditare alcune delle funzionalità che il

4
00:00:16,190 --> 00:00:18,830
‫tank ha ereditato dalla classe base pod.

5
00:00:19,100 --> 00:00:24,560
‫Ora, una volta creata una classe torre, sovrascriveremo la funzione tick in modo da poter ruotare

6
00:00:24,560 --> 00:00:26,000
‫anche la sua torretta.

7
00:00:26,030 --> 00:00:32,080
‫Quindi il nostro obiettivo qui è far ruotare le torrette in modo che guardino sempre il carro armato.

8
00:00:32,090 --> 00:00:37,430
‫In questo modo, quando iniziano a sparare proiettili, colpiranno il carro armato a volte fintanto che il carro armato

9
00:00:37,430 --> 00:00:39,020
‫non si sta muovendo rapidamente.

10
00:00:39,630 --> 00:00:43,740
‫E scopriremo anche come riuscire a tenere in mano il carro armato --.

11
00:00:43,770 --> 00:00:49,380
‫In questo modo possiamo puntare il carro armato -- e ruotare la torretta delle torri verso il carro --.

12
00:00:49,410 --> 00:00:52,350
‫Ci stiamo preparando per un po' di combattimento a proiettili.

13
00:00:52,650 --> 00:00:58,200
‫Quindi sono qui nell'editor e andrò nella nostra cartella dei carri armati dove si trovano la base e

14
00:00:58,200 --> 00:00:59,910
‫le classi dei carri armati.

15
00:01:00,270 --> 00:01:04,650
‫Ora, vorrei creare una classe tower basata sulla classe base.

16
00:01:04,770 --> 00:01:07,850
‫Ora, il modo in cui l'abbiamo fatto con la classe tank era quello giusto.

17
00:01:07,860 --> 00:01:14,430
‫Fare clic su base e selezionare Crea classe C++ derivata da un modo alternativo per accedere

18
00:01:14,430 --> 00:01:18,210
‫agli strumenti e selezionare una nuova classe C++.

19
00:01:18,540 --> 00:01:24,630
‫E da qui possiamo fare clic sulla scheda che dice tutte le classi e cercare base --.

20
00:01:24,750 --> 00:01:27,270
‫E qui vediamo la nostra base: la classe.

21
00:01:27,480 --> 00:01:33,050
‫Se seleziono questo e faccio clic su Avanti, ora creerò una nuova classe basata su base --.

22
00:01:33,060 --> 00:01:38,910
‫Lo lascerò sullo stesso percorso di tutte le altre nostre classi C++ e chiamerò questa torre.

23
00:01:39,210 --> 00:01:41,070
‫Quindi facciamo clic su Crea classe.

24
00:01:41,610 --> 00:01:44,720
‫Quindi ecco la mia nuova età delle torri e Tower Dot.

25
00:01:44,790 --> 00:01:51,360
‫CP Ora la prima cosa di cui abbiamo bisogno è la funzione tick perché la torre vorrà ruotare la

26
00:01:51,360 --> 00:01:53,520
‫sua torretta per affrontare il --.

27
00:01:53,730 --> 00:01:56,640
‫Quindi sovrascriveremo la funzione tick qui.

28
00:01:56,640 --> 00:02:03,930
‫Quindi creerò una nuova sezione pubblica e digiteremo virtual void tick, che prende un float chiamato

29
00:02:03,930 --> 00:02:07,560
‫Delta Time, e questo è un override.

30
00:02:07,560 --> 00:02:14,100
‫Ora entreremo in maggiori dettagli sul virtuale e sull'override nei video futuri, ma essenzialmente stiamo prendendo

31
00:02:14,100 --> 00:02:18,600
‫la funzione tick ereditata e creando una nuova implementazione per essa.

32
00:02:18,600 --> 00:02:23,520
‫Quindi prendiamo la funzione tick e implementiamola qui in Tower CP.

33
00:02:23,550 --> 00:02:29,370
‫Ora dobbiamo anteporre al nome della funzione tick una torre e i due due punti.

34
00:02:29,370 --> 00:02:34,950
‫E come sempre, è una buona idea chiamare super tick e dobbiamo passare il tempo delta.

35
00:02:34,950 --> 00:02:40,830
‫Ora quello che vorrei fare qui è ruotare la torretta del carro armato in modo che la torre minacci il carro armato e

36
00:02:40,830 --> 00:02:42,390
‫sia pronta a sparare proiettili.

37
00:02:42,390 --> 00:02:45,870
‫Ma mi piacerebbe farlo solo se il serbatoio è nel raggio d'azione.

38
00:02:46,170 --> 00:02:52,620
‫Ora, per sapere se il carro armato è nel raggio d'azione, dobbiamo conoscere la distanza dalla torretta al

39
00:02:52,620 --> 00:02:53,750
‫carro armato.

40
00:02:53,760 --> 00:02:57,510
‫Ora, ecco un piccolo aggeggio che rappresenta l'origine del mondo.

41
00:02:57,510 --> 00:03:01,470
‫In altre parole, il punto nello spazio in cui X, Y e Z sono zero.

42
00:03:01,470 --> 00:03:08,220
‫Ora, quando parliamo della posizione di un attore, stiamo parlando del vettore dall'origine a quella

43
00:03:08,220 --> 00:03:08,970
‫posizione.

44
00:03:08,970 --> 00:03:15,060
‫E possiamo sempre ottenere quel vettore di posizione usando la posizione dell'attore in modo da poter ottenere la posizione di una

45
00:03:15,060 --> 00:03:17,430
‫delle torri e la posizione del serbatoio.

46
00:03:17,430 --> 00:03:21,930
‫E se conosciamo queste due posizioni, possiamo calcolare la distanza tra loro.

47
00:03:21,930 --> 00:03:28,470
‫Ora, potremmo farlo con la matematica vettoriale, ma la classe F vector ha una funzione chiamata dist, e questa

48
00:03:28,470 --> 00:03:33,810
‫funzione prende i vettori di posizione e ciò che restituisce è la distanza tra loro.

49
00:03:33,810 --> 00:03:40,440
‫Quindi qui nel file CP della torre, nella funzione tick, scriverò un paio di note solo per sapere

50
00:03:40,440 --> 00:03:41,940
‫cosa dovremmo fare.

51
00:03:41,940 --> 00:03:52,890
‫Per prima cosa, dobbiamo trovare la distanza dal carro armato dopo quel controllo per vedere se il carro armato è nel raggio d'azione

52
00:03:52,890 --> 00:03:58,170
‫e se nel raggio ruota la torretta verso il carro armato.

53
00:03:59,070 --> 00:04:00,960
‫Quindi abbiamo alcune cose da fare qui.

54
00:04:01,140 --> 00:04:05,820
‫Ora, per trovare la distanza dal carro armato, dobbiamo prendere in mano il carro armato.

55
00:04:05,850 --> 00:04:08,640
‫Ora, un buon posto per farlo è in Begin Play.

56
00:04:08,640 --> 00:04:13,350
‫Quindi, oltre alla funzione tick, andiamo avanti e sovrascriviamo Begin Play.

57
00:04:13,380 --> 00:04:17,580
‫Ora nota in Tank H, l'inizio del gioco è in una sezione protetta.

58
00:04:17,580 --> 00:04:21,210
‫Lo terremo protetto anche nella torre.

59
00:04:21,210 --> 00:04:27,870
‫Quindi collocheremo la sezione protetta appena sotto quella pubblica e implementeremo l'inizio del gioco appena sotto il segno di

60
00:04:27,870 --> 00:04:28,380
‫spunta.

61
00:04:28,380 --> 00:04:35,580
‫Quindi andiamo a Tower Dot, CP, implement, inizia a giocare, qualifichiamo completamente il nome della funzione e, come

62
00:04:35,580 --> 00:04:38,670
‫probabilmente avrai intuito, chiamiamo Super Begin Play.

63
00:04:38,790 --> 00:04:44,310
‫Ora per ottenere il serbatoio e memorizzarlo in una variabile, abbiamo bisogno di una variabile di tipo tank.

64
00:04:44,310 --> 00:04:49,200
‫Quindi lo collocheremo qui a Towers H in una sezione privata.

65
00:04:49,200 --> 00:04:55,290
‫Ora questo sarà un tank A, è un puntatore e possiamo semplicemente chiamarlo tank.

66
00:04:55,290 --> 00:05:01,980
‫E per evitare di dover includere Tank H qui, possiamo dichiarare di aver visto quanto può

67
00:05:01,980 --> 00:05:03,000
‫essere importante.

68
00:05:03,360 --> 00:05:09,540
‫Quindi ora abbiamo questo puntatore del serbatoio e se riusciamo a capire come accedere al serbatoio, possiamo memorizzarlo nel nostro puntatore

69
00:05:09,540 --> 00:05:11,970
‫del serbatoio qui e iniziare a giocare.

70
00:05:12,000 --> 00:05:18,510
‫La prima cosa che farò è includere Tank H, in modo che possiamo effettivamente usare il tipo.

71
00:05:18,510 --> 00:05:20,580
‫Allora come accediamo al serbatoio?

72
00:05:20,580 --> 00:05:26,220
‫Bene, ecco la documentazione del motore irreale per una pratica funzione chiamata get player pewn.

73
00:05:26,310 --> 00:05:29,100
‫Esiste in una statica di gioco.

74
00:05:29,160 --> 00:05:34,680
‫Quindi, dal momento che ho questo aperto, andrò avanti e copierò l'inclusione per le statistiche di gioco e

75
00:05:34,680 --> 00:05:35,910
‫darò un'occhiata alla sintassi.

76
00:05:35,910 --> 00:05:39,060
‫Ha due input un oggetto di contesto mondiale.

77
00:05:39,470 --> 00:05:42,950
‫Sappiamo già come gestirlo e un indice giocatore.

78
00:05:42,950 --> 00:05:49,310
‫E come abbiamo visto per i giochi single player come il nostro, l'indice del giocatore sarà sempre giocatore zero

79
00:05:49,310 --> 00:05:53,660
‫e questo ci consentirà di accedere al pedone corrispondente al giocatore zero.

80
00:05:54,050 --> 00:05:57,650
‫Quindi chiamiamo questa funzione qui in Tower Dot CP.

81
00:05:57,680 --> 00:06:04,850
‫Incollerò le statistiche di gioco di inclusione per te e all'inizio del gioco imposterò

82
00:06:04,850 --> 00:06:12,290
‫il serbatoio uguale alle tue statistiche di gioco ottieni giocatore -- per l'oggetto contesto del mondo.

83
00:06:12,290 --> 00:06:17,910
‫Posso passare in questo e per l'indice del giocatore possiamo passare in zero.

84
00:06:17,930 --> 00:06:19,970
‫Ora controlla il rosso ondulato.

85
00:06:19,970 --> 00:06:26,120
‫Dice che un valore di tipo pedone non può essere assegnato a un'entità di tipo A tank.

86
00:06:26,150 --> 00:06:33,290
‫Questo è lo stesso identico problema in cui ci siamo imbattuti quando stavamo tentando di chiamare, ottenere il controller e memorizzare il

87
00:06:33,320 --> 00:06:35,810
‫risultato in un controller del giocatore A.

88
00:06:35,870 --> 00:06:42,200
‫Un tank è figlio di una pedina, quindi non possiamo memorizzare un tipo genitore in un puntatore figlio.

89
00:06:42,200 --> 00:06:43,370
‫Dobbiamo.

90
00:06:44,150 --> 00:06:46,060
‫Hai indovinato, dobbiamo lanciare.

91
00:06:46,070 --> 00:06:51,830
‫Quindi prenderemo il valore restituito da questo e lo inseriremo all'interno di una chiamata di funzione cast.

92
00:06:51,830 --> 00:06:56,000
‫Quindi diremo cast e casting per un tank.

93
00:06:56,000 --> 00:07:02,300
‫E quello che passeremo al cast sarà questa chiamata per ottenere il laghetto dei giocatori.

94
00:07:02,300 --> 00:07:04,850
‫Quindi mettiamolo proprio lì tra parentesi.

95
00:07:04,850 --> 00:07:09,260
‫E dopo il cast avremo accesso al serbatoio.

96
00:07:09,380 --> 00:07:16,310
‫Quindi ora che abbiamo accesso al serbatoio, possiamo trovare la distanza dal serbatoio e una distanza è un galleggiante.

97
00:07:16,310 --> 00:07:20,240
‫Quindi possiamo creare una variabile float locale chiamata distanza.

98
00:07:20,600 --> 00:07:27,380
‫E ciò a cui lo imposteremo uguale è il risultato della chiamata della funzione statica F vettore dist.

99
00:07:27,410 --> 00:07:31,700
‫Ora dist prende due parametri di input di tipo F vettore.

100
00:07:31,880 --> 00:07:34,850
‫Ora vogliamo la distanza tra due punti nello spazio.

101
00:07:34,850 --> 00:07:37,010
‫Uno è la posizione della torre.

102
00:07:37,010 --> 00:07:43,190
‫Siamo nella classe della torre, quindi possiamo chiamare la posizione dell'attore e questo ci dà la posizione della torre.

103
00:07:43,190 --> 00:07:44,660
‫Ma che dire del serbatoio?

104
00:07:44,660 --> 00:07:50,870
‫Possiamo chiamare il carro armato, ottenere la posizione dell'attore e ora abbiamo la distanza.

105
00:07:50,870 --> 00:07:56,450
‫Ora l'unico problema è che stiamo usando il puntatore del serbatoio senza prima verificare che non sia

106
00:07:56,450 --> 00:07:57,110
‫nullo.

107
00:07:57,290 --> 00:08:05,600
‫Quindi dobbiamo prima dire se tank e poi possiamo prendere questa chiamata di funzione e trascinarla proprio qui all'interno

108
00:08:05,600 --> 00:08:06,860
‫dell'istruzione if.

109
00:08:06,860 --> 00:08:13,190
‫Quindi, se il carro armato è valido, possiamo accedere alla sua posizione con la posizione dell'attore.

110
00:08:13,190 --> 00:08:14,030
‫Eccellente.

111
00:08:14,030 --> 00:08:19,130
‫Dato che stiamo lavorando in questa istruzione if, sposterò questi altri commenti qui all'interno di essa perché

112
00:08:19,130 --> 00:08:24,410
‫sappiamo che non possiamo controllare se il tank è nel raggio d'azione, se il tank non è nemmeno valido.

113
00:08:24,590 --> 00:08:28,790
‫Quindi vorrei sfidarvi a ruotare la torretta verso il carro armato.

114
00:08:28,790 --> 00:08:33,020
‫Ora, vogliamo farlo solo se il carro armato è nel raggio d'azione, abbiamo la distanza.

115
00:08:33,020 --> 00:08:35,240
‫Quindi ora abbiamo bisogno di una variabile di portata di fuoco.

116
00:08:35,240 --> 00:08:40,490
‫Quindi crea un galleggiante chiamato poligono di fuoco nella classe torre ed esponilo con la tua proprietà.

117
00:08:40,490 --> 00:08:42,980
‫Ci piacerebbe poterlo modificare dall'editor.

118
00:08:43,010 --> 00:08:45,890
‫Ora controllerai se il serbatoio è nel raggio d'azione.

119
00:08:45,890 --> 00:08:50,630
‫Se si chiama ruota torretta e ruota torretta è necessario dare un'occhiata al bersaglio.

120
00:08:50,630 --> 00:08:53,180
‫Passerai nella posizione dei carri armati.

121
00:08:53,180 --> 00:08:56,660
‫Quindi metti in pausa il video e implementa questo comportamento ora.

122
00:09:00,030 --> 00:09:00,420
‫Bene.

123
00:09:00,420 --> 00:09:02,370
‫Quindi abbiamo bisogno di una variabile di portata di fuoco.

124
00:09:02,370 --> 00:09:05,940
‫Quindi qui nella Torre H, abbiamo una sezione privata.

125
00:09:05,940 --> 00:09:07,680
‫Faremo un galleggiante.

126
00:09:08,340 --> 00:09:15,450
‫Chiamerò questa gamma di fuoco e andrò avanti e la inizializzerò su un valore di, diciamo,

127
00:09:15,450 --> 00:09:16,650
‫300 F.

128
00:09:16,650 --> 00:09:21,030
‫Ma sperimenteremo questo perché sarà una tua proprietà.

129
00:09:21,240 --> 00:09:22,860
‫Quindi tu proprietà.

130
00:09:22,860 --> 00:09:29,070
‫E poiché vorrei che tutti i carri armati avessero la stessa portata di fuoco, farò questo e solo per

131
00:09:29,070 --> 00:09:29,910
‫impostazione predefinita.

132
00:09:29,910 --> 00:09:33,270
‫In questo modo possiamo modificarlo solo sul progetto predefinito.

133
00:09:33,300 --> 00:09:38,940
‫Ora, se hai fatto la tua modifica ovunque o forse hai modificato solo l'istanza, va benissimo.

134
00:09:38,940 --> 00:09:42,090
‫È davvero una questione di preferenze e possiamo cambiarla in seguito.

135
00:09:42,090 --> 00:09:46,710
‫Gli darò anche una categoria e chiamerò questa categoria combattimento.

136
00:09:46,740 --> 00:09:50,820
‫Entriamo in Tower CP e abbiamo questo punto successivo qui.

137
00:09:50,820 --> 00:09:57,120
‫Controlla se il carro è nel raggio d'azione, il che significa che dobbiamo controllare se la distanza è inferiore

138
00:09:57,120 --> 00:09:59,160
‫o uguale al raggio di tiro.

139
00:09:59,160 --> 00:10:04,860
‫Abbiamo minore o uguale a e non solo uguale a, perché da un fotogramma all'altro, la distanza può effettivamente

140
00:10:04,860 --> 00:10:11,310
‫essere maggiore del raggio di tiro, un fotogramma e inferiore al raggio di tiro del fotogramma successivo che passa completamente il raggio

141
00:10:11,310 --> 00:10:11,970
‫di tiro.

142
00:10:11,970 --> 00:10:15,870
‫Quindi potrebbe in realtà non diventare mai esattamente uguale alla portata di fuoco.

143
00:10:15,870 --> 00:10:20,820
‫In effetti, con valori in virgola mobile, due float esattamente uguali sono piuttosto rari.

144
00:10:20,820 --> 00:10:26,640
‫Quindi abbiamo questo se check e se arriviamo all'interno di esso, significa che la distanza è inferiore o uguale alla

145
00:10:26,640 --> 00:10:27,630
‫portata di fuoco.

146
00:10:27,630 --> 00:10:33,120
‫Il serbatoio ora è nel raggio d'azione, il che significa che questo commento può essere spostato proprio lì.

147
00:10:33,960 --> 00:10:41,190
‫Ora, se nel raggio d'azione, ruota la torretta verso il carro armato, ciò significa che chiameremo la funzione di rotazione

148
00:10:41,190 --> 00:10:42,180
‫della torretta.

149
00:10:42,390 --> 00:10:45,690
‫Questa è la nostra funzione protetta che abbiamo inserito nel pod di base.

150
00:10:45,720 --> 00:10:51,060
‫Ora ruota la torretta dà un'occhiata al bersaglio e abbiamo bisogno della posizione del carro armato.

151
00:10:51,060 --> 00:10:55,410
‫Quindi sarà il serbatoio per ottenere la posizione dell'attore.

152
00:10:55,410 --> 00:11:02,010
‫E con questo ora chiamiamo rotazione torretta solo se il carro armato è nel raggio d'azione.

153
00:11:02,010 --> 00:11:05,040
‫Quindi compiliamo questo e vediamo come funziona.

154
00:11:05,340 --> 00:11:12,030
‫Quindi siamo tornati qui nell'editor e quello che dobbiamo fare è entrare nei progetti, nei pedoni e trovare una torretta

155
00:11:12,030 --> 00:11:15,120
‫dei pedoni BP e aprire l'editor completo del progetto.

156
00:11:15,120 --> 00:11:22,170
‫Ora in alto a destra, vediamo il pedone di base della classe genitore, ma vogliamo che la nostra classe madre sia la torre

157
00:11:22,170 --> 00:11:27,930
‫in modo da poter andare alle impostazioni della classe, classe genitore e cercare la torre e selezionarla.

158
00:11:27,960 --> 00:11:31,980
‫Ora la nostra torretta dei pedoni è basata sulla classe torre.

159
00:11:31,980 --> 00:11:34,710
‫Ora vediamo cosa succede quando premiamo play.

160
00:11:35,070 --> 00:11:37,200
‫Ok, quindi sto spostando il serbatoio.

161
00:11:37,200 --> 00:11:40,560
‫Non siamo nel raggio d'azione, quindi non vediamo alcun movimento dalle torri.

162
00:11:40,560 --> 00:11:44,100
‫Ma se entro nel raggio d'azione, guarda quello.

163
00:11:44,100 --> 00:11:47,970
‫Ora mi stanno seguendo in giro e sembra piuttosto minaccioso.

164
00:11:48,120 --> 00:11:52,080
‫Ora 300 unità non sono così lontane.

165
00:11:52,080 --> 00:11:55,440
‫Quindi quello che mi piacerebbe fare è modificare quella distanza.

166
00:11:55,440 --> 00:12:00,840
‫Quindi da qui in BP Pawn Turret, selezionerò BP Pond Turret self.

167
00:12:00,840 --> 00:12:02,850
‫Ed ecco la sezione del combattimento.

168
00:12:02,850 --> 00:12:06,840
‫Ho intenzione di andare avanti e impostare questo a circa 700.

169
00:12:07,890 --> 00:12:13,350
‫Ora, se premo play, vedrò che non ruoteranno mentre torno qui.

170
00:12:13,350 --> 00:12:16,410
‫Ma appena entro nel raggio d'azione, ora mi guardano.

171
00:12:18,180 --> 00:12:19,020
‫Perfetto.

172
00:12:20,030 --> 00:12:23,120
‫Quindi, in sintesi, abbiamo creato la classe tower.

173
00:12:23,120 --> 00:12:25,720
‫Ora abbiamo un nemico per il carro armato.

174
00:12:25,730 --> 00:12:32,060
‫Abbiamo anche ruotato la torretta della torre verso il carro armato nella funzione tick e lo faremo solo se il carro armato si

175
00:12:32,060 --> 00:12:33,770
‫trova nel raggio di tiro.

176
00:12:33,770 --> 00:12:39,650
‫Abbiamo anche esposto la variabile del raggio di fuoco in modo che possa essere regolata nel progetto.

177
00:12:39,770 --> 00:12:41,600
‫Siamo quasi pronti per il combattimento.

178
00:12:41,630 --> 00:12:44,450
‫Inizieremo a configurarlo nei video a venire.

179
00:12:44,630 --> 00:12:45,620
‫Ci vediamo presto.

