﻿1
00:00:04,370 --> 00:00:05,630
‫Ciao e Benvenuto.

2
00:00:05,630 --> 00:00:13,160
‫In questa lezione, capiremo i passaggi principali coinvolti nella compilazione di file C++ in

3
00:00:13,160 --> 00:00:13,730
‫Unreal.

4
00:00:13,940 --> 00:00:15,770
‫Entriamo e vediamo come funzionano.

5
00:00:16,910 --> 00:00:23,990
‫Quindi arriverà presto il momento di iniziare a utilizzare il codice dall'esterno, da altri file, e

6
00:00:23,990 --> 00:00:26,720
‫dobbiamo imparare come funziona in C++.

7
00:00:26,720 --> 00:00:31,190
‫Per farlo, dobbiamo fare una piccola deviazione e capire più in dettaglio cosa

8
00:00:31,190 --> 00:00:35,240
‫sta succedendo quando compiliamo il nostro codice C++ in binario.

9
00:00:35,240 --> 00:00:38,390
‫Quindi ecco i passaggi di compilazione che vengono utilizzati.

10
00:00:38,750 --> 00:00:44,450
‫Iniziamo con il tuo codice, i tuoi file C++, la tua testa di file, il tutto in vari file di testo.

11
00:00:44,900 --> 00:00:49,010
‫Questi vengono inseriti in uno strumento chiamato Unreal Handed Tool.

12
00:00:49,010 --> 00:00:56,210
‫Ora, questo strumento è responsabile di prendere tutti i pezzi di sintassi specifici irreali e di usarli

13
00:00:56,210 --> 00:00:58,490
‫per generare più codice C++.

14
00:00:58,910 --> 00:01:05,480
‫Quindi diamo un'occhiata ad alcuni esempi di dove abbiamo questa sintassi specifica irreale, questa nuova

15
00:01:05,540 --> 00:01:13,640
‫classe in lettere maiuscole che è una sintassi specifica irreale, e così è l'API Crypt Reader qui e il

16
00:01:13,640 --> 00:01:15,170
‫corpo generato lì.

17
00:01:15,530 --> 00:01:21,770
‫E fondamentalmente quello che sta succedendo qui è che lo strumento di intestazione irreale vedrà questi diversi pezzi di sintassi nel tuo

18
00:01:21,770 --> 00:01:24,470
‫codice e andrà, ok, devo fare il mio lavoro.

19
00:01:24,470 --> 00:01:26,810
‫Devo andare lì, devo aggiungere un sacco di cose.

20
00:01:27,080 --> 00:01:33,710
‫Sostituirà il tuo corpo generato con un mucchio di codice che ci semplifica la vita quando usi

21
00:01:33,710 --> 00:01:34,460
‫Unreal.

22
00:01:35,060 --> 00:01:38,240
‫Fa anche cose come le proprietà U e le funzioni U.

23
00:01:38,240 --> 00:01:43,340
‫Aggiunge tutte le cose di cui ha bisogno in modo che possa comunicare con il mondo del progetto.

24
00:01:43,730 --> 00:01:44,960
‫Quindi questo è il primo passo.

25
00:01:44,960 --> 00:01:49,010
‫Converte tutte le sue cose specifiche irreali in C++ reale.

26
00:01:49,580 --> 00:01:55,820
‫Una volta ottenuto il C++ effettivo, possiamo inserirlo in un processo di compilazione C++ standard, che

27
00:01:55,820 --> 00:01:56,990
‫richiede tre passaggi.

28
00:01:57,380 --> 00:02:04,370
‫Il primo è occuparsi del passaggio di pre-elaborazione, quindi questo toccherà effettivamente qualsiasi sintassi C++ e in realtà si occuperà

29
00:02:04,640 --> 00:02:07,580
‫solo di righe che iniziano con un hash.

30
00:02:07,580 --> 00:02:10,610
‫Quindi abbiamo alcune di queste direttive di preelaborazione.

31
00:02:10,940 --> 00:02:13,220
‫Questi sono gestiti dal preprocessore.

32
00:02:14,120 --> 00:02:16,610
‫Il passo successivo è quello che chiamiamo effettivamente compilatore.

33
00:02:16,880 --> 00:02:24,620
‫Prende un codice e lo converte in binario eseguibile, ma non completa del tutto il passaggio perché lo

34
00:02:24,620 --> 00:02:31,640
‫fa solo su singoli C++, quelle che sono note come unità di traduzione, fondamentalmente file C++.

35
00:02:31,880 --> 00:02:37,670
‫Quindi prende un file C++ e lo traduce in binario individualmente, ogni singolo file C++.

36
00:02:38,000 --> 00:02:44,300
‫E poi il terzo passaggio è il linker, che riunisce tutto ciò e genera un eseguibile che

37
00:02:44,300 --> 00:02:46,850
‫possiamo effettivamente eseguire un singolo eseguibile.

38
00:02:47,330 --> 00:02:52,730
‫Quindi diamo un'occhiata a questi passaggi di compilazione standard in modo un po' più dettagliato con un file di

39
00:02:53,060 --> 00:02:53,540
‫esempio.

40
00:02:53,990 --> 00:03:00,200
‫Quindi immagina di avere un game dot CP ed è un gioco molto, molto semplice perché tutto ciò che fa è sommare uno

41
00:03:00,200 --> 00:03:01,160
‫e uno insieme.

42
00:03:01,640 --> 00:03:07,790
‫Ma per sommare uno e uno insieme, deve usare una funzione dichiarata in un file diverso nella

43
00:03:07,790 --> 00:03:08,630
‫matematica due.

44
00:03:08,690 --> 00:03:13,850
‫H Quindi la matematica dichiara ad, ma in realtà non definisce cosa fa.

45
00:03:14,240 --> 00:03:16,790
‫Quindi questo è fatto nel passaggio del punto matematico.

46
00:03:16,790 --> 00:03:19,250
‫E puoi vedere che è davvero un'implementazione molto semplice.

47
00:03:20,090 --> 00:03:22,640
‫Ora, cosa succede nella fase di pre-elaborazione?

48
00:03:22,640 --> 00:03:28,040
‫Bene, come ho detto, si occupa di tutte le direttive del preprocessore, che sono cose che iniziano con un

49
00:03:28,040 --> 00:03:28,610
‫hash.

50
00:03:28,610 --> 00:03:34,700
‫Quindi l'hash include la matematica, che in pratica significa semplicemente copiare tutto in Master H qui.

51
00:03:35,120 --> 00:03:40,640
‫Quindi quello che fa è prendere questi due file e li combina insieme per creare un

52
00:03:40,640 --> 00:03:46,190
‫nuovo file di output chiamato game dot In pratica gioco da includere e puoi vedere che è incluso.

53
00:03:46,490 --> 00:03:52,700
‫La definizione di masturbazione ha sostituito la direttiva del preprocessore hash.

54
00:03:52,700 --> 00:04:02,540
‫Quindi ora game dot II ha una definizione per l'operazione di aggiunta e quindi eseguiamo il preprocessore su math dot

55
00:04:02,540 --> 00:04:03,170
‫CVP.

56
00:04:03,170 --> 00:04:07,490
‫Ma poiché non ha alcuna direttiva per il preprocessore, praticamente nulla viene modificato lì.

57
00:04:08,150 --> 00:04:12,830
‫Il passaggio successivo è che la compilazione è probabilmente il passaggio più importante

58
00:04:12,830 --> 00:04:21,290
‫e complicato, perché quello che fa è prendere quel C++ in ogni singolo file e convertirlo in binario, ma non è un binario completo

59
00:04:21,290 --> 00:04:28,610
‫perché, ad esempio, il mio gioco in realtà non lo fa sa come implementare e conosce solo la forma di quella

60
00:04:28,850 --> 00:04:30,350
‫funzione di aggiunta.

61
00:04:30,770 --> 00:04:34,940
‫Quindi deve essere compilato in seguito e compilato dal linker.

62
00:04:34,970 --> 00:04:40,880
‫Quindi il collegamento prenderà il binario, lo creerà per il file game dot obj e il binario creato

63
00:04:40,880 --> 00:04:47,060
‫per il file del metodo e li riunirà per creare un game dot xy che combina il binario per

64
00:04:47,360 --> 00:04:54,410
‫entrambi e infine è un eseguibile completo che noi può effettivamente funzionare perché ha la definizione per tutto ciò di cui ha

65
00:04:54,410 --> 00:04:55,040
‫bisogno.

66
00:04:55,340 --> 00:04:58,460
‫Ora, perché abbiamo un processo così complicato?

67
00:04:58,820 --> 00:05:02,060
‫L'idea qui è che velocizza il nostro tempo di compilazione.

68
00:05:02,060 --> 00:05:03,850
‫Perché se solo facessi una catena.

69
00:05:04,340 --> 00:05:06,230
‫Per giocare a dormire a puntino.

70
00:05:06,770 --> 00:05:10,290
‫In realtà non ho bisogno di eseguire l'intero processo di compilazione.

71
00:05:10,310 --> 00:05:16,610
‫Tutto quello che devo fare è eseguire i bit che coinvolgono il punto di gioco CBP, quindi eseguirei il preprocessore solo sul CP.

72
00:05:16,790 --> 00:05:19,280
‫Quindi eseguirei il compilatore solo sul gioco su I.

73
00:05:19,280 --> 00:05:23,510
‫E poi posso riutilizzare il file math dot obj di prima.

74
00:05:23,690 --> 00:05:26,810
‫Non ho bisogno di ricompilarlo perché non è cambiato nulla in questo.

75
00:05:27,080 --> 00:05:33,170
‫Allo stesso modo, se cambio solo il punto CP matematico, non dovrei ricompilare il gioco in un file OBJ, motivo per cui

76
00:05:33,170 --> 00:05:37,370
‫questo è un processo più efficiente e perché lo stiamo facendo in primo luogo.

77
00:05:37,730 --> 00:05:44,330
‫Quindi vorrei che facessimo un piccolo esperimento e cercassimo di capire perché includiamo spostare un punto h e spostare

78
00:05:44,330 --> 00:05:46,070
‫il suo file CP punto?

79
00:05:46,370 --> 00:05:47,690
‫Qual è il motivo?

80
00:05:47,700 --> 00:05:52,040
‫Perché non possiamo semplicemente compilare il file C++ senza includere il punto move h.

81
00:05:52,340 --> 00:05:56,540
‫Quindi l'esperimento che faremo è commentare la riga di inclusione dell'hash.

82
00:05:56,690 --> 00:06:01,940
‫Quindi, usando una doppia barra in avanti per fare un commento davanti a quella riga, che sostanzialmente

83
00:06:01,940 --> 00:06:07,280
‫lo farà essere rimosso dal preprocessore invece che dal preprocessore che lo sostituirà con il contenuto del

84
00:06:07,280 --> 00:06:07,880
‫file.

85
00:06:08,570 --> 00:06:15,020
‫Quindi ricompilare e vorrei che tu dessi un'occhiata ai messaggi di errore che escono e vedi cosa

86
00:06:15,020 --> 00:06:20,870
‫dice per vedere se puoi provare a capire per cosa stiamo includendo questa mossa.

87
00:06:21,350 --> 00:06:23,210
‫Metti in pausa il video e prova.

88
00:06:26,500 --> 00:06:26,980
‫Bene.

89
00:06:26,980 --> 00:06:27,760
‫Ben tornato.

90
00:06:28,150 --> 00:06:33,580
‫Quindi mettiamo una doppia barra all'inizio di questa riga, che sostanzialmente la rende nulla.

91
00:06:34,030 --> 00:06:40,300
‫E poi faremo un controllo alt f 11 e daremo un'occhiata all'output del live coding.

92
00:06:40,480 --> 00:06:44,650
‫Quindi guarda, abbiamo subito degli errori molto, molto presto.

93
00:06:44,650 --> 00:06:50,680
‫E quello che sta dicendo è che il tuo mover non è una classe o uno spazio dei nomi e ci sono altre cose

94
00:06:50,680 --> 00:06:51,070
‫quaggiù.

95
00:06:51,070 --> 00:06:56,650
‫Sta dicendo che il componente tecnologico primario è stato dichiarato super è nella classe o il proprietario dello spazio dei

96
00:06:56,650 --> 00:06:58,090
‫nomi è un identificatore sconosciuto.

97
00:06:58,510 --> 00:07:03,880
‫E fondamentalmente quello che sta dicendo è che hai parlato del tuo traslocatore qui, ma non l'hai comunque definito,

98
00:07:03,880 --> 00:07:05,860
‫non l'hai dichiarato da nessuna parte.

99
00:07:05,860 --> 00:07:07,150
‫Quindi non lo so.

100
00:07:07,180 --> 00:07:11,290
‫Il compilatore C++ dice, non so cosa sia.

101
00:07:11,680 --> 00:07:18,160
‫Ecco perché siamo hash includendo il punto motore h perché spostalo o H dichiara la classe.

102
00:07:18,160 --> 00:07:25,720
‫Dice che un motore U è una classe e deriva dal fatto che agisci come un componente e ha questi metodi, ecc.

103
00:07:25,720 --> 00:07:28,270
‫sta dichiarando cosa significa essere quella classe.

104
00:07:28,630 --> 00:07:35,260
‫Quindi, senza quella dichiarazione, il compilatore C++ non può continuare ed è per questo che dobbiamo includere quel file di

105
00:07:35,260 --> 00:07:35,920
‫intestazione.

106
00:07:36,760 --> 00:07:37,180
‫Roba fantastica.

107
00:07:37,180 --> 00:07:44,860
‫Quindi si spera che ora capiate un po' meglio il processo coinvolto nella compilazione di C++ e in particolare

108
00:07:44,860 --> 00:07:47,650
‫nella compilazione di C++ in Unreal.

109
00:07:47,920 --> 00:07:49,570
‫Ci vediamo alla prossima lezione.

