﻿1
00:00:04,480 --> 00:00:05,530
‫Ben tornato.

2
00:00:05,560 --> 00:00:08,760
‫Ora in questo video parleremo di eventi di successo.

3
00:00:08,770 --> 00:00:15,430
‫Vorremmo rilevare quando il proiettile colpisce qualcosa e in questo modo possiamo fare qualcosa in risposta,

4
00:00:15,430 --> 00:00:17,560
‫come distruggere il proiettile.

5
00:00:17,560 --> 00:00:22,710
‫E più tardi ci occuperemo di fare danni e causare esplosioni e cose del genere.

6
00:00:22,720 --> 00:00:26,350
‫Quindi ora parliamo un po' degli eventi di successo.

7
00:00:26,350 --> 00:00:29,440
‫Il nostro proiettile ha una componente mesh.

8
00:00:29,440 --> 00:00:37,450
‫Il suo tipo è il tuo componente mesh statico e il tuo componente mesh statico è una classe in una lunga

9
00:00:37,450 --> 00:00:43,990
‫gerarchia di classi e il sistema motore irreale uno dei suoi genitori è il tuo componente primitivo.

10
00:00:44,260 --> 00:00:48,100
‫Ecco la pagina della documentazione per il tuo componente primitivo.

11
00:00:48,130 --> 00:00:54,910
‫Dice che i componenti primitivi sono componenti visti che contengono o generano una sorta di geometria generalmente

12
00:00:54,910 --> 00:00:58,600
‫da renderizzare o utilizzare come dati di collisione.

13
00:00:58,600 --> 00:01:02,560
‫Quindi sono fondamentalmente componenti della scena con alcune funzionalità aggiunte.

14
00:01:02,560 --> 00:01:08,440
‫E se scorri verso il basso e guardi la gerarchia, vedrai che abbiamo visto il componente e

15
00:01:08,440 --> 00:01:15,100
‫derivato da quel tuo componente primitivo e puoi continuare a scorrere verso il basso e vedere tutte le altre classi

16
00:01:15,100 --> 00:01:16,510
‫che derivano da te.

17
00:01:16,510 --> 00:01:17,860
‫Componente primitiva.

18
00:01:18,250 --> 00:01:24,280
‫Ora, il motivo per cui lo stiamo sottolineando è perché il tuo componente mesh statico eredita

19
00:01:24,280 --> 00:01:30,820
‫queste funzionalità dal tuo componente primitivo e il tuo componente primitivo ha la capacità di generare eventi hit.

20
00:01:30,850 --> 00:01:33,670
‫Ora, cosa intendiamo per generare eventi di successo?

21
00:01:33,760 --> 00:01:39,310
‫Bene, diciamo che abbiamo una geometria nel nostro mondo rappresentata dal rettangolo a

22
00:01:39,310 --> 00:01:45,160
‫destra e abbiamo un oggetto con un componente mesh statico rappresentato dal cerchio a sinistra.

23
00:01:45,190 --> 00:01:52,660
‫Ora, se questo oggetto che ha un componente mesh statico si sta muovendo verso il blocco, se questo componente è

24
00:01:52,660 --> 00:01:58,630
‫impostato per gestire gli eventi hit, non appena colpisce quel blocco, l'evento hit verrà generato in

25
00:01:58,630 --> 00:01:59,800
‫caso di collisione.

26
00:01:59,800 --> 00:02:06,040
‫Ora un evento hit genererà alcuni dati relativi a quella collisione, incluso il componente che è stato

27
00:02:06,040 --> 00:02:06,640
‫colpito.

28
00:02:06,640 --> 00:02:09,640
‫Quindi questo blocco qui potrebbe avere un componente mesh statico.

29
00:02:09,640 --> 00:02:12,910
‫Possiamo accedere a quel componente in caso di collisione.

30
00:02:12,910 --> 00:02:19,120
‫Possiamo anche accedere all'attore che è stato colpito e anche l'evento principale genera un risultato di successo EF.

31
00:02:19,120 --> 00:02:25,090
‫Abbiamo imparato qualcosa sul risultato del colpo F e sappiamo che contiene molte variabili sull'evento del colpo,

32
00:02:25,090 --> 00:02:30,790
‫come la posizione del colpo, che è un vettore F che rappresenta una posizione nel mondo.

33
00:02:31,090 --> 00:02:33,460
‫Quindi abbiamo la nostra rete di proiettili.

34
00:02:33,460 --> 00:02:37,690
‫Questa è una variabile di tipo puntatore del componente mesh statico.

35
00:02:37,690 --> 00:02:43,000
‫Ora, ogni volta che questo componente mesh statico colpisce qualcosa nel mondo, vogliamo avere del codice

36
00:02:43,000 --> 00:02:44,380
‫che risponda a questo.

37
00:02:44,380 --> 00:02:50,740
‫Ora essendo un componente mesh statico, eredita le cose dalla tua classe componente primitiva.

38
00:02:50,740 --> 00:02:55,450
‫Una delle cose che eredita è una variabile chiamata sul componente hit.

39
00:02:55,480 --> 00:02:58,750
‫Ora ecco la documentazione per l'hit del componente.

40
00:02:58,750 --> 00:03:05,320
‫È descritto come un evento chiamato Quando un componente colpisce o viene colpito da qualcosa di solido.

41
00:03:05,320 --> 00:03:11,680
‫Ora scorrendo verso il basso, vediamo che sul colpo del componente ha la firma del colpo del componente di tipo F.

42
00:03:11,680 --> 00:03:17,770
‫E se facciamo clic su questo, vediamo che la firma del colpo del componente F è una struttura.

43
00:03:17,800 --> 00:03:24,100
‫Ora, tornando indietro, possiamo vedere che la documentazione dice un evento chiamato quando un componente colpisce o viene colpito

44
00:03:24,100 --> 00:03:25,660
‫da qualcosa di solido.

45
00:03:25,660 --> 00:03:32,140
‫Ciò potrebbe accadere a causa di cose come il movimento del personaggio utilizzando la posizione impostata con lo sweep

46
00:03:32,140 --> 00:03:38,920
‫abilitato o la simulazione fisica per eventi quando gli oggetti si sovrappongono come entrare in un trigger, vedere l'evento di sovrapposizione.

47
00:03:38,920 --> 00:03:42,280
‫Quindi ci sono eventi di successo e ci sono eventi di sovrapposizione.

48
00:03:42,280 --> 00:03:44,230
‫Ci occupiamo di eventi di successo.

49
00:03:44,470 --> 00:03:51,700
‫Quindi sappiamo che su componente hit è descritto nella documentazione come un evento hit e sappiamo che su componente

50
00:03:51,700 --> 00:03:56,410
‫hit è una struct di tipo F firma hit del componente.

51
00:03:56,410 --> 00:03:57,550
‫Fin qui tutto bene.

52
00:03:57,550 --> 00:04:04,930
‫Ora questo evento hit sull'hit del componente è anche qualcosa che chiamiamo delegato multicast.

53
00:04:04,960 --> 00:04:10,270
‫Un delegato multicast può avere più funzioni associate.

54
00:04:10,300 --> 00:04:14,200
‫Possono esserci funzioni che esistono su più classi.

55
00:04:14,200 --> 00:04:20,980
‫E se quelle funzioni vengono associate a questo delegato multicast, vengono aggiunte a qualcosa chiamato

56
00:04:20,980 --> 00:04:22,600
‫elenco di chiamate.

57
00:04:22,600 --> 00:04:29,650
‫Questo è un elenco di funzioni da chiamare quando questo evento hit indica che devono essere chiamate tutte.

58
00:04:29,650 --> 00:04:35,500
‫Diciamo che questo evento di successo o un delegato multicast viene trasmesso quando succede qualcosa.

59
00:04:35,500 --> 00:04:43,000
‫Quindi, nel caso in cui la nostra mesh proiettile colpisca qualcosa, il delegato trasmetterà a tutte le classi

60
00:04:43,000 --> 00:04:46,660
‫che hanno una funzione associata a questo delegato.

61
00:04:46,690 --> 00:04:53,440
‫Non appena la trasmissione viene inviata, tutte queste funzioni associate vengono chiamate in risposta alla

62
00:04:53,440 --> 00:04:54,370
‫trasmissione.

63
00:04:54,370 --> 00:04:57,580
‫Questa è una funzionalità molto potente di Unreal Engine.

64
00:04:57,580 --> 00:05:03,610
‫Ci consente di avere questo qualcosa chiamato delegato, che attende un evento come una collisione.

65
00:05:03,610 --> 00:05:03,970
‫Poi.

66
00:05:04,100 --> 00:05:11,270
‫E il delegato verrà trasmesso, risultando in tutte le funzioni associate chiamate in risposta alla trasmissione.

67
00:05:11,270 --> 00:05:15,930
‫Poiché più funzioni possono essere legate a questo delicato, lo chiamiamo multicast.

68
00:05:15,950 --> 00:05:21,090
‫Sta trasmettendo a più classi che hanno le loro funzioni legate ad esso.

69
00:05:21,110 --> 00:05:24,460
‫Ora, come leghiamo una funzione a questo delegato?

70
00:05:24,470 --> 00:05:30,350
‫Bene, sul componente hit ha una serie di funzioni che ci consentono di farlo, una delle quali è

71
00:05:30,350 --> 00:05:31,720
‫chiamata add dynamic.

72
00:05:31,730 --> 00:05:38,930
‫Quindi, quando chiamiamo la funzione dinamica ADD, tutto ciò che dobbiamo fare è passare in due parametri l'oggetto utente per

73
00:05:38,930 --> 00:05:45,260
‫il quale possiamo usarlo e la funzione di callback, che è l'indirizzo di alcune funzioni della nostra

74
00:05:45,260 --> 00:05:46,000
‫classe.

75
00:05:46,010 --> 00:05:52,790
‫Quindi, una volta che accediamo a questo sul componente, premi il delegato e chiamiamo la funzione di aggiunta dinamica, possiamo passare

76
00:05:52,820 --> 00:05:54,770
‫l'oggetto utente e il callback.

77
00:05:54,770 --> 00:06:00,140
‫E questo comporterà l'aggiunta di quella richiamata all'elenco di chiamate degli eventi di successo.

78
00:06:00,170 --> 00:06:07,280
‫Ora sul componente hit, trasmetteremo questo delegato risultando in tutte le funzioni ad esso associate da chiamare.

79
00:06:07,280 --> 00:06:12,290
‫Quindi, per associare questo delegato, dobbiamo creare una funzione di callback.

80
00:06:12,470 --> 00:06:18,290
‫Quindi ecco proiettile e vorremmo una funzione di callback per l'evento hit.

81
00:06:18,290 --> 00:06:23,090
‫Quindi creiamo una funzione privata qui e sarà nulla.

82
00:06:23,150 --> 00:06:25,480
‫E lo chiamerò semplicemente in caso di successo.

83
00:06:25,490 --> 00:06:30,820
‫Potremmo chiamarlo come vogliamo, ma sembra abbastanza descrittivo.

84
00:06:30,830 --> 00:06:36,890
‫Ora questa funzione di callback deve avere la firma corretta per gli eventi hit, il che significa che il

85
00:06:36,890 --> 00:06:40,460
‫suo elenco di parametri di input deve essere molto specifico.

86
00:06:40,460 --> 00:06:49,870
‫Il primo parametro di input deve essere del tipo you primitive component pointer e si chiama hit comp.

87
00:06:49,880 --> 00:06:52,160
‫Questo è il componente che colpisce.

88
00:06:52,160 --> 00:06:56,170
‫Nel nostro caso, faremo in modo che la nostra rete di proiettili colpisca le cose.

89
00:06:56,180 --> 00:07:02,240
‫Il parametro successivo è un puntatore attore chiamato Altro attore.

90
00:07:02,540 --> 00:07:05,690
‫Questo sarà l'attore che è stato colpito.

91
00:07:05,720 --> 00:07:12,950
‫Il prossimo parametro di input è un altro puntatore del componente primitivo chiamato other comp.

92
00:07:12,980 --> 00:07:15,590
‫Questo è l'altro componente che è stato colpito.

93
00:07:15,590 --> 00:07:21,410
‫Quindi, se colpiamo il componente mesh statico di qualche altro attore, allora questo sarebbe quel componente mesh statico.

94
00:07:21,410 --> 00:07:25,760
‫Il prossimo è un vettore F chiamato impulso normale.

95
00:07:25,820 --> 00:07:32,000
‫Se stiamo simulando la fisica, il motore fisico applicherà un impulso in risposta alla collisione.

96
00:07:32,000 --> 00:07:37,510
‫E questo f vettore rappresenta la direzione e la grandezza di quell'impulso.

97
00:07:37,520 --> 00:07:46,130
‫Infine, abbiamo un parametro di input di tipo const F hit result e questo è un riferimento const e si

98
00:07:46,130 --> 00:07:47,450
‫chiama hit.

99
00:07:47,450 --> 00:07:53,780
‫Quindi, quando l'hit viene chiamato, avremo accesso a un risultato di hit che contiene ancora più informazioni

100
00:07:53,780 --> 00:07:54,380
‫sull'hit.

101
00:07:54,410 --> 00:07:59,150
‫Ora, poiché lo stiamo legando a un delegato, deve essere una funzione U.

102
00:07:59,150 --> 00:08:01,940
‫Quindi segneremo questo con la tua funzione.

103
00:08:01,940 --> 00:08:03,800
‫Ora dovresti avere familiarità con la tua funzione.

104
00:08:03,800 --> 00:08:08,390
‫È proprio come la tua proprietà solo per le funzioni anziché per le variabili.

105
00:08:08,390 --> 00:08:09,590
‫Quindi molto importante.

106
00:08:09,590 --> 00:08:12,890
‫La nostra richiamata deve essere una funzione u affinché funzioni.

107
00:08:12,890 --> 00:08:14,600
‫Ora abbiamo dichiarato la funzione.

108
00:08:14,600 --> 00:08:17,330
‫Andiamo avanti e definiamo la funzione.

109
00:08:17,570 --> 00:08:19,090
‫Quindi di nuovo nei proiettili.

110
00:08:19,160 --> 00:08:24,410
‫CP Appena sotto la nostra funzione tick, definiamo questa funzione.

111
00:08:24,410 --> 00:08:31,100
‫Gli daremo un corpo di funzione e metteremo il nome della classe appena prima del nome della funzione, e ora abbiamo una

112
00:08:31,100 --> 00:08:32,240
‫funzione di callback.

113
00:08:32,510 --> 00:08:39,230
‫Quindi siamo pronti per associare questa funzione su hit al nostro delegato e dobbiamo farlo all'inizio del gioco.

114
00:08:39,260 --> 00:08:44,450
‫Farlo nel costruttore è troppo presto e talvolta puoi riscontrare problemi come il tuo delegato che non

115
00:08:44,450 --> 00:08:45,380
‫è vincolato.

116
00:08:45,380 --> 00:08:47,330
‫Quindi lo faremo qui e inizieremo a giocare.

117
00:08:47,330 --> 00:08:55,460
‫Quindi abbiamo la nostra mesh proiettile e useremo l'operatore freccia per accedere alla variabile ereditata da te.

118
00:08:55,460 --> 00:09:03,470
‫Il componente primitivo chiamato su componente hit e su componente hit ha la funzione di aggiunta dinamica.

119
00:09:03,470 --> 00:09:08,300
‫Ora, stranamente, il completamento automatico non funzionerà per l'aggiunta dinamica, quindi dovrai digitare l'intero

120
00:09:08,300 --> 00:09:09,740
‫nome della funzione.

121
00:09:09,740 --> 00:09:17,000
‫Questa è la funzione che useremo per associare la nostra callback al componente hit e aggiungere quella funzione al suo

122
00:09:17,000 --> 00:09:18,410
‫elenco di chiamate.

123
00:09:18,410 --> 00:09:23,960
‫Ora, per prima cosa, abbiamo bisogno dell'oggetto utente che sarà questo perché questa è la

124
00:09:23,960 --> 00:09:30,290
‫classe per cui associare la funzione e quindi abbiamo bisogno dell'indirizzo della funzione che sarà l'indirizzo di on hit.

125
00:09:30,290 --> 00:09:35,720
‫Quindi useremo l'indirizzo dell'operatore e la funzione un proiettile su colpo.

126
00:09:35,720 --> 00:09:41,180
‫E con questo abbiamo la nostra funzione vincolata e siamo pronti a generare eventi di successo.

127
00:09:41,420 --> 00:09:47,150
‫Ora possiamo testarlo con un registro UEE e possiamo utilizzare l'avviso di temperatura del registro.

128
00:09:48,550 --> 00:09:52,120
‫E per il testo possiamo semplicemente dire a colpo.

129
00:09:52,270 --> 00:09:58,090
‫E se lo vediamo nel registro di output, sappiamo che la nostra funzione on hit è stata chiamata,

130
00:09:58,090 --> 00:09:58,570
‫compiliamola.

131
00:09:59,020 --> 00:10:01,270
‫Quindi ho il registro di output aperto qui.

132
00:10:01,270 --> 00:10:08,440
‫Premerò play e sparo un proiettile e c'è il mio messaggio di registro su hit è stato chiamato.

133
00:10:08,440 --> 00:10:09,730
‫Quindi questo sta funzionando.

134
00:10:10,450 --> 00:10:17,230
‫Ora solo una nota a margine, se entriamo nel proiettile BP e selezioniamo la mesh del proiettile nel pannello dei dettagli,

135
00:10:17,230 --> 00:10:19,900
‫possiamo scorrere fino alla sezione di collisione.

136
00:10:20,080 --> 00:10:26,290
‫E qui vediamo che i preset di collisione sono impostati per bloccare tutta la dinamica e che la collisione

137
00:10:26,290 --> 00:10:30,760
‫abilitata è impostata su questa impostazione di query e fisica abilitate alla collisione.

138
00:10:30,760 --> 00:10:33,280
‫Ciò è necessario per gli eventi di successo.

139
00:10:33,280 --> 00:10:36,700
‫Dobbiamo essere in grado di eseguire query per un evento di successo.

140
00:10:36,700 --> 00:10:41,800
‫E, naturalmente, la fisica consente al motore fisico di agire sulla mesh del proiettile.

141
00:10:41,800 --> 00:10:48,700
‫Quindi, ora che ci siamo collegati al delegato hit del componente con la nostra funzione on hit e abbiamo inserito un

142
00:10:48,700 --> 00:10:55,000
‫registro enorme per assicurarci che funzioni, vorrei che esplorassi un po' di più questa funzione in modo che possiamo

143
00:10:55,000 --> 00:10:59,440
‫comprendere alcuni di questi parametri di input nella nostra funzione on hit.

144
00:10:59,440 --> 00:11:03,160
‫Quindi, nella funzione al momento del colpo, aggiungi altri registri YOUI.

145
00:11:03,160 --> 00:11:08,980
‫Vorrei che stampaste i nomi di alcuni di questi parametri di input usando la funzione git name.

146
00:11:08,980 --> 00:11:15,970
‫Vorrei che usassi un registro YUI per stampare il nome di hit comp, altro attore e altro comp in modo da poter vedere i

147
00:11:15,970 --> 00:11:18,340
‫nomi di questi oggetti che stiamo colpendo.

148
00:11:18,340 --> 00:11:23,770
‫Utilizzerai il formato percentuale se, specificando nella macro di testo del registro E.

149
00:11:23,770 --> 00:11:30,700
‫E proprio come promemoria, ogni volta che chiamiamo get name, dobbiamo usare l'asterisco quando passiamo quella stringa nella macro del

150
00:11:30,700 --> 00:11:36,880
‫registro YUI, ad esempio, per ottenere il nome di un altro attore chiamiamo altro attore, prendiamo il nome

151
00:11:36,880 --> 00:11:42,590
‫e mettiamo quell'asterisco all'inizio solo per restituire quella stringa in stile C, che è ciò che

152
00:11:42,670 --> 00:11:45,550
‫si aspetta quando si formatta con una stringa.

153
00:11:45,550 --> 00:11:52,330
‫Quindi metti in pausa il video e usa il login Yui nella nostra funzione di successo per stampare i nomi di hit comp, altri

154
00:11:52,330 --> 00:11:53,890
‫attori e altri comp ora.

155
00:11:57,740 --> 00:11:58,040
‫Bene.

156
00:11:58,040 --> 00:12:02,570
‫Quindi qui in Projectile CP, userò il tuo registro qui.

157
00:12:02,720 --> 00:12:10,610
‫Quindi copierò questa riga in cui sto usando Yui log e per la stringa dirò hit comp percent s

158
00:12:11,270 --> 00:12:20,000
‫e subito dopo il testo chiamerò hit comp get name e ho bisogno di questo asterisco per convertire da una stringa F

159
00:12:20,000 --> 00:12:22,910
‫a una stringa di stile C.

160
00:12:22,910 --> 00:12:29,330
‫Ora userò questa stessa frase, solo che cambierò il testo per dire altro attore e questa volta

161
00:12:29,330 --> 00:12:32,480
‫lo chiameremo nome su un altro attore.

162
00:12:32,600 --> 00:12:39,950
‫E infine, stamperò altre chiamate comp, otterrò il nome su altre comp.

163
00:12:40,130 --> 00:12:46,250
‫Quindi compiliamo e torniamo qui nell'editor, vado avanti e premo play e sparo un proiettile

164
00:12:46,250 --> 00:12:47,630
‫e guardo questo.

165
00:12:47,660 --> 00:12:50,780
‫Vediamo che hit comp è una mesh di proiettili.

166
00:12:50,780 --> 00:12:56,180
‫Ricorda che abbiamo detto che questo è il componente che colpisce, che è il nostro mash

167
00:12:56,180 --> 00:13:01,940
‫proiettile e vedrai che sta usando il nome che abbiamo assegnato a questo componente in crea oggetto secondario predefinito.

168
00:13:01,940 --> 00:13:05,570
‫Quindi questa è una di quelle situazioni in cui viene utilizzato quel nome.

169
00:13:05,570 --> 00:13:09,830
‫Ora vedrai che dice che l'altro difetto dell'attore sottolinea zero.

170
00:13:09,830 --> 00:13:16,130
‫E questo perché questo attore di mesh statico che è il difetto ha il segno difetto di nome zero.

171
00:13:16,130 --> 00:13:22,160
‫A volte il motore inserisce un numero alla fine del suo nome interno per attori e componenti,

172
00:13:22,160 --> 00:13:26,630
‫e vedrai che succede la stessa cosa quando stampiamo altri comp.

173
00:13:26,630 --> 00:13:33,110
‫L'attore della mesh statica del difetto ha un componente mesh statico e il suo nome è componente mesh statico zero.

174
00:13:33,110 --> 00:13:40,610
‫Quindi questo ci fornisce un po' più di informazioni su quei parametri di input nella nostra funzione di callback su hit.

175
00:13:40,610 --> 00:13:47,600
‫E questo è utile perché abbiamo accesso a quegli oggetti in C++ se vorremmo fare qualcosa in risposta

176
00:13:47,600 --> 00:13:48,620
‫all'evento hit.

177
00:13:48,800 --> 00:13:56,210
‫Quindi, in sintesi, abbiamo appreso degli eventi di successo e di come questi vengono implementati come delegati multicast e abbiamo

178
00:13:56,210 --> 00:13:57,650
‫imparato come funzionano.

179
00:13:57,650 --> 00:14:05,030
‫Abbiamo creato una funzione chiamata On Hit and Bound, quella funzione per il delegato di hit del componente che la

180
00:14:05,030 --> 00:14:09,620
‫nostra mesh proiettile ha ereditato dalla tua classe di componenti primitivi.

181
00:14:09,620 --> 00:14:15,920
‫Ora non abbiamo distrutto il proiettile al momento del colpo, ma ora sappiamo che possiamo farlo facilmente perché abbiamo

182
00:14:15,920 --> 00:14:21,860
‫questa funzione di callback e possiamo inserire la logica in questa funzione come distruggere il proiettile.

183
00:14:21,860 --> 00:14:24,080
‫Quindi ce ne occuperemo in un video futuro.

184
00:14:24,080 --> 00:14:30,800
‫Per ora, datevi una pacca sulla spalla perché questa è una delle aree più complesse di Unreal Engine C++

185
00:14:30,800 --> 00:14:32,270
‫che avete imparato finora.

186
00:14:32,480 --> 00:14:33,890
‫Ci vediamo nel prossimo video.

