‫Ciao e bentornato.
‫Ora siamo pronti per ruotare la torretta e vorremmo farlo usando il mouse.
‫E quella posizione del colpo di traccia che abbiamo fatto nel video precedente.
‫Quindi, mentre sposto il cursore del mouse, la torretta sta ruotando e rivolta nella direzione del cursore del mouse.
‫E anche quando clicco nella finestra e inizio a giocare, posso comunque spostare il cursore del mouse
‫per ruotare la torretta e impostarne la direzione.
‫Questo mi permetterà di mirare quando ho la capacità di sparare proiettili.
‫Bene.
‫Quindi, per raggiungere questo obiettivo, dobbiamo trovare la direzione in cui vogliamo che punti la nostra torretta.
‫E una volta trovata quella direzione, possiamo impostare la rotazione della mesh della torretta.
‫Ora, per ottenere la direzione in cui vorremmo puntare la torretta, dobbiamo fare un po' di
‫matematica vettoriale.
‫Quello che stiamo cercando è un vettore dalla torretta del carro armato alla nostra posizione di rilevamento.
‫Ora possiamo facilmente ottenere la posizione del nostro carro armato o di qualsiasi suo componente, come la posizione della torretta
‫del carro armato.
‫Chiameremo questa posizione, torretta, posizione.
‫E sappiamo anche come ottenere la posizione della testa di traccia.
‫Chiameremo questa traccia hit location.
‫Quello che ci interessa è il vettore dalla posizione della torretta per tracciare la posizione del colpo.
‫Chiameremo questo vettore come target.
‫Ora la matematica vettoriale per raggiungere l'obiettivo è in realtà abbastanza semplice.
‫Per ottenere un vettore da un punto iniziale a un punto finale è sempre il punto finale meno il punto iniziale.
‫Quindi, se prendiamo la nostra traccia, colpiamo la posizione e sottraiamo la posizione della torretta del vettore, il
‫vettore che ne risulta è il bersaglio.
‫Ora, una volta che abbiamo i due vettori di direzione target, vogliamo convertirlo in una rotazione in modo da poter
‫impostare la rotazione della torretta del carro armato.
‫E il tipo vettoriale ha una funzione incorporata chiamata rotazione.
‫Quindi, se prendiamo il nostro vettore di destinazione e chiamiamo rotazione su di esso, questo restituirebbe un rotatore F corrispondente a
‫quella direzione.
‫Ora dobbiamo tenere a mente qualcosa.
‫Il risultato del colpo di traccia sarà spesso sul pavimento e il vettore dalla torretta del carro armato al risultato
‫del colpo di traccia non sarà parallelo al suolo.
‫Ciò significa che se impostiamo la rotazione della torretta del carro armato sul rotatore che otteniamo da quel vettore di direzione, potremmo
‫ottenere qualcosa del genere in cui la torretta è inclinata verso il basso verso il suolo, ma non vogliamo che la
‫torretta del carro armato ruoti verso il basso.
‫Vogliamo che punti ancora avanti.
‫Quindi questo è il risultato che vogliamo.
‫In altre parole, vogliamo solo cambiare la componente sì della rotazione della torretta del carro armato.
‫In questo modo punta nella direzione corretta ma rimane comunque parallelo al suolo.
‫Abbiamo solo cambiato la sua imbardata, quindi torniamo al codice VS e creiamo una funzione per ruotare la torretta del carro
‫armato.
‫Ora ruoteremo la torretta sul carro armato, ma vorremmo anche ruotare la torretta sulla nostra
‫torre nemica e presto verrà creata la torre derivata dalla base pon, il che significa che se creiamo una
‫torretta rotante funzione possiamo inserirlo qui nella classe pong di base.
‫In questo modo sia il carro armato che la torre erediteranno questa funzione.
‫Poiché prevediamo di utilizzarlo sia nella torre che nel serbatoio, possiamo proteggere questa funzione.
‫Quindi aggiungerò una sezione protetta e tutte le funzioni e le variabili che posizioniamo nella sezione
‫protetta saranno accessibili in queste classi figlio, ma non in altre classi.
‫Quindi è limitato quasi quanto le variabili private.
‫Ora questa funzione può restituire void.
‫Chiamerò questa torretta rotante.
‫E per ruotare la torretta, avrò bisogno di una sorta di destinazione da guardare.
‫Questo può essere un vettore f e possiamo chiamarlo look at target.
‫Quindi l'idea è che se abbiamo una funzione che possiamo trasmettere in una sorta di posizione nel mondo, la
‫funzione dovrebbe comportare la rotazione della torretta verso quella posizione.
‫Quindi andiamo avanti e forniamo una definizione di funzione per ruotare la torretta.
‫Quindi qui nel pedone di base CP appena sotto il costruttore, implementerò la rotazione della torretta.
‫E ovviamente ho bisogno del nome di una classe pedina di base con l'operatore di risoluzione dell'ambito qui.
‫Quindi ora che ho la rotazione della torretta, pensiamo a come lo implementeremo.
‫La prima cosa di cui abbiamo bisogno è che per indirizzare il vettore dal componente della torretta al risultato del colpo di traccia
‫sotto il cursore del mouse.
‫Quindi questo può essere un vettore F locale chiamato a target e lo imposteremo uguale al risultato di alcuni
‫calcoli vettoriali.
‫Ricorda, sarà la destinazione meno il punto di partenza.
‫E la destinazione è guardare il bersaglio e il punto di partenza sarà la posizione della torretta del carro armato, in
‫altre parole, la posizione della maglia della torretta.
‫Quindi possiamo dire mesh della torretta e possiamo ottenere la posizione della mesh della torretta.
‫Ora il modo per ottenere la posizione mondiale di un componente è con questa funzione ottieni la posizione del componente.
‫Appartiene alla classe dei componenti della scena d'uso.
‫Quindi tutti i componenti della scena ce l'hanno.
‫Quindi dalla mesh della torretta chiameremo get component location.
‫Quindi guarda il bersaglio meno la posizione della mesh della torretta ci fornisce il vettore dalla mesh della torretta al bersaglio di
‫vedetta.
‫Ora, come ho già detto, possiamo ottenere un rotatore EF da un target usando la funzione di rotazione dei vettori F.
‫Quindi creeremo un rotatore F e possiamo chiamare questo sguardo a rotazione e lo imposteremo
‫uguale a rotazione del punto target.
‫Questa è una chiamata di funzione.
‫Quindi ora abbiamo il rotatore corrispondente a questo vettore di direzione target.
‫Ma il fatto è che ci preoccupiamo solo della YA.
‫Non vogliamo cambiare tono o ruolo.
‫Vogliamo solo ruotare la torretta attorno all'asse z e mantenerla parallela al suolo.
‫Ora possiamo farlo in molti modi.
‫Per uno, possiamo dare un'occhiata alla rotazione, al tono e azzerarlo.
‫In altre parole, impostalo uguale a zero.
‫Possiamo anche dare un'occhiata al ruolo del punto di rotazione e azzerarlo.
‫Ora, dopo aver impostato beccheggio e rollio a zero, abbiamo la rotazione che vogliamo, che è solo il componente.
‫Questo è un modo per farlo.
‫Un altro sarebbe quello di utilizzare uno dei sovraccarichi del costruttore del rotatore F.
‫Se abbiamo detto f rotator con parentesi e passato alcuni valori come punto zero F per il primo e il pop up
‫mi dice che quel primo input è il tono.
‫E poi per ya possiamo usare per indirizzare la rotazione.
‫Sì.
‫E poi per il ruolo potremmo usare il punto zero F.
‫Ora ciò che fa è creare un nuovo rotatore F con zero per il passo, zero per il ruolo e
‫il componente del rotatore restituito da due rotazioni target.
‫Quindi il valore restituito da questo ci darebbe lo stesso risultato di quello che abbiamo fatto qui con queste tre righe.
‫Quindi, poiché questo è un po 'più compatto ed elegante, penso che preferirei usarlo in modo da
‫poter inizializzare il vettore di rotazione con il rotatore F restituito chiamando il costruttore del rotatore F in questo modo.
‫Quindi rimuoverò questa riga qui sotto.
‫E ora diamo un'occhiata alla rotazione.
‫Ora l'ultima cosa da fare in questa funzione è impostare la rotazione per il mash della torretta.
‫Ora possiamo impostare la rotazione per un dato componente usando questa funzione imposta nuovamente la rotazione del mondo, appartiene all'uso
‫del componente della scena.
‫E il motivo per cui stiamo usando la rotazione delle parole impostate piuttosto che aggiungere una sorta di offset
‫di rotazione locale è perché abbiamo una rotazione nello spazio mondiale due target è un vettore di direzione dello spazio mondiale.
‫Prendiamo la posizione della mesh della torretta nello spazio mondiale e sottraiamo lo sguardo alla posizione target nello
‫spazio mondiale.
‫Quindi questa è una direzione spaziale mondiale.
‫Pertanto lo sguardo alla rotazione è una rotazione dello spazio mondiale.
‫Quindi useremo la rotazione del mondo impostata sulla mesh della torretta.
‫Quindi diremo torretta mesh, impostare la rotazione del mondo e passeremo in rassegna la rotazione.
‫Quindi ora abbiamo una funzione che può prendere qualsiasi bersaglio nel mondo e girare la mesh della torretta per
‫guardarlo, ma non ruoterà la mesh verso il basso.
‫Cambierà solo la sua imbardata, quindi ruoterà in modo tale che una torretta di un carro armato dovrebbe ruotare.
‫Quindi ora abbiamo una funzione per ruotare la torretta.
‫Ti sfiderò a chiamare questa funzione per impostare la rotazione della torretta, chiamare la funzione di rotazione della torretta
‫nella classe del carro armato.
‫Questa è una funzione protetta.
‫Quindi la classe del carro armato ha accesso ad esso.
‫Ora ruota la torretta prende un vettore F, guarda il bersaglio, userai quel punto di impatto nel risultato del colpo
‫F dal nostro tracciato di linea.
‫Quindi lascerò a te il compito di trovare la posizione corretta nel codice per chiamare questa funzione.
‫Quindi metti in pausa il video e posiziona la funzione di rotazione della torretta.
‫Chiama la classe del carro armato.
‫Bene.
‫Quindi abbiamo la nostra funzione di rotazione della torretta e siamo pronti a chiamarla.
‫Vado a fare il pieno ed ecco la mia funzione tick all'interno del check if per il controller del giocatore ref.
‫Ho il mio risultato hit e dopo che è stato chiamato un risultato get hit sotto il cursore, il risultato hit
‫avrà dati validi.
‫In effetti, stiamo usando quel punto di impatto del risultato del colpo e disegnamo la sfera di debug.
‫Ora, poiché non ho più bisogno di disegnare la sfera di debug, andrò avanti ed eliminerò quella.
‫E invece chiamerò la nostra funzione protetta ruota torretta.
‫E per quanto riguarda l'obiettivo, passerò il punto di impatto del punto del risultato del colpo.
‫Quindi ora ogni fotogramma ruoteremo la torretta verso quel punto di impatto dal risultato del nostro colpo.
‫Ora, prima di compilare questo, non utilizzo più gli helper di debug di disegno, quindi andrò avanti e rimuoverò quel
‫file di intestazione.
‫Bene.
‫Ora sono pronto per compilare.
‫Bene.
‫Sono tornato qui nell'editor.
‫Andiamo avanti e premiamo play e dai un'occhiata.
‫Questo è fantastico.
‫Posso ancora rotolare.
‫Posso muovere il mouse e la torretta ruota ovunque sposto il cursore del mouse.
‫Quindi questo è fantastico.
‫Ok, quindi prima di concludere, vorrei solo affrontare un paio di questioni.
‫Voglio che sia bello, lucido e bello da vedere.
‫Ora, il primo problema si verifica quando sposto il cursore del mouse vicino al centro del serbatoio e
‫poi lo attraverso.
‫Vedrai che ad un certo punto quella sorta di rotazione scatta molto rapidamente.
‫E se spostiamo il mouse in modo casuale, beh, non sembra molto bello.
‫Sta scattando.
‫Non abbiamo movimenti fluidi.
‫Quindi questo è un problema.
‫Ora, l'altro problema è che se clicco e giro e salgo fino al bordo, vedrò che la mia torretta scatta
‫nell'altra direzione quando sposto il cursore del mouse verso l'alto.
‫Allora cosa sta succedendo lì?
‫Bene, scopriamolo.
‫Torneremo a VS Code e vorrei riavere la mia sfera di debug.
‫Quindi, qui in Tank, andrò alla funzione tick subito prima di ruotare la torretta e
‫ancora una volta chiamerò draw debug sphere.
‫Ora per il mondo in cui sto passando per ottenere il mondo per il centro sto passando nel punto di
‫impatto del punto per il raggio userò 25 segmenti F di punti possono essere 12, il colore può essere F colore rosso le linee persistenti possono
‫essere false e la vita può essere negativa.
‫Quindi la stessa cosa che abbiamo fatto prima.
‫Quindi salverò questo avviso.
‫Non sto aggiungendo il file di intestazione di nuovo lì e questo perché gli helper di debug sono effettivamente inclusi per impostazione
‫predefinita, quindi tecnicamente non ne abbiamo bisogno.
‫Salverò solo il salto indietro nell'editor, eseguirò un kickoff di codifica dal vivo e premi play.
‫Quindi ora ho la mia sfera di debug.
‫Quindi andiamo fino al confine del mondo e io sposterò il cursore del mouse fino al punto
‫in cui cade nell'abisso.
‫Ed è qui che abbiamo il problema.
‫Vedete, non abbiamo un risultato di successo sotto il cursore quando il nostro cursore si sposta lassù perché non c'è niente
‫lì per noi da cui ottenere un risultato di successo.
‫Pertanto, il nostro punto di impatto non è definito.
‫Quindi ciò di cui abbiamo bisogno è qualcosa che colpisca quella traccia di linea.
‫Ora, Unreal Engine ha molti strumenti che possiamo usare.
‫Quello che farò è fare clic sul menu a discesa qui in alto e aprire il pannello dell'attore del mio posto e selezionare
‫questa icona che dice volumi e ottenere un volume di blocco.
‫Ecco il blocco del volume.
‫Ne trascinerò uno dentro.
‫Quindi ora ho questo volume di blocco.
‫Ora, per impostazione predefinita, i volumi di blocco dovrebbero essere invisibili.
‫Se vado al pannello dei dettagli per questo e scorro verso il basso fino a
‫collisione, vedo che è Collision Presets is Invisible Wall, il che sembra suggerire che dovrebbe bloccare quasi tutto.
‫L'unica cosa che non sta bloccando è il canale di visibilità e la nostra traccia di linea sembra
‫tracciare contro il canale di visibilità.
‫Tutto ciò che nel nostro mondo blocca il canale di visibilità sarà colpito dalla nostra traccia di linea.
‫Ma questo particolare volume non lo farà.
‫Dovrebbe essere invisibile.
‫Bene, possiamo andare ai preset di collisione, aprire il menu a discesa e selezionare personalizzato.
‫Questo ci consentirà di cambiarlo in modo da poter impostare la risposta alla collisione sul canale di visibilità.
‫È un blocco.
‫Quindi ora ho un volume invisibile, ma è impostato per bloccare il canale di visibilità, il che significa che
‫le tracce di linea che tracciano contro il canale di visibilità come il nostro lo colpiranno.
‫Quindi quello che posso fare è prendere questo volume di blocco e scalarlo.
‫Lo metterò appena oltre il muro.
‫In effetti, posso posizionarlo proprio qui, ai limiti del muro, e lo abbasso un po' in
‫modo che si sovrapponga al muro.
‫E in questo modo abbiamo questa barriera invisibile qui, e andrò avanti e la aumenterò
‫anche nella direzione Y.
‫Quindi lo prenderò bello e grande e lo posizionerò nel mezzo qui e gli darò un po' di imbottitura.
‫E lo aumenterò anche nella direzione Z.
‫Quindi ora è bello e grande e la nostra traccia di linea dovrebbe colpirlo.
‫Quindi testiamo quella teoria.
‫Facciamo clic nella finestra e saliamo al muro.
‫E abbastanza sicuro, sto colpendo quel volume di blocco con la mia traccia di linea e non ho quel problema in
‫cui la mia torretta si blocca per guardare una posizione indefinita.
‫Probabilmente sta guardando verso l'origine del mondo perché quel vettore del punto di impatto è tutto zero.
‫Ora, se salgo su questo muro, ho lo stesso problema.
‫Quindi abbiamo bisogno di questi volumi di blocco.
‫Tutto intorno al perimetro del nostro livello.
‫Ora, può essere abbastanza facile.
‫Tutto quello che devo fare è duplicare questo volume di blocco.
‫Ora posso passare dalla vista prospettica alla vista ortogonale dall'alto.
‫Quindi selezionerò la parte superiore e scorrerò verso l'esterno con la rotellina del mouse e semplicemente tieni premuto alt e duplirò
‫questo muro e ne posizionerò uno qui e posso premere E per entrare in modalità di rotazione.
‫Quindi terrò premuto alt e ruoterò di 90 gradi.
‫Questo mi darà una copia e poi premetterò il doppio u e farò partire la mia modalità di traduzione e lo
‫sposterò qui su questo lato e tieni premuto Alt e trascinerò una copia verso il basso da quel lato.
‫Quindi ora abbiamo quattro mura.
‫Ora posso tornare dalla vista dall'alto alla prospettiva e premere play, e ora posso salire su uno
‫qualsiasi di questi muri e non importa quale muro sono coperto, quindi sembra fantastico.
‫In modo che si occupi di uno dei nostri problemi.
‫Ma che dire di quest'altro?
‫Se spostiamo il mouse vicino al nostro carro armato, abbiamo ancora questo comportamento sporadico.
‫Quindi vorrei occuparmi anche di questo.
‫Ora, il modo in cui posso occuparmene è interpolando quella rotazione.
‫Quindi, invece di impostare direttamente questo valore di rotazione, possiamo utilizzare una funzione
‫di interpolazione che essenzialmente sposterà quella rotazione verso l'obiettivo che forniamo in modo fluido.
‫Quindi vediamo come funziona.
‫Ora, vorrei che questa interpolazione fosse nella nostra funzione di rotazione della torretta in modo da poter
‫tornare al pedone di base in basso per ruotare la torretta, e invece di impostare la rotazione del nostro mondo affinché
‫la torretta guardi la rotazione, possiamo impostarla uguale al valore restituito da una funzione di interpolazione.
‫Quindi eliminerò, guarderò la rotazione e invece chiameremo una funzione sulla libreria
‫matematica F chiamata R inter two.
‫Ora il nostro in due è progettato per gestire l'interpolazione per i rotatori.
‫Ora il suo primo parametro di input è un riferimento del rotatore const F chiamato corrente.
‫Questo è il valore attuale della cosa che stiamo cercando di cambiare.
‫La cosa che stiamo cercando di cambiare è la nostra rotazione delle torrette e possiamo ottenerla dalla nostra maglia della torretta.
‫Quindi diremo mesh della torretta e la funzione che vogliamo usare è ottenere la rotazione dei componenti.
‫Quindi è molto simile a ottenere la posizione del componente solo che sta ottenendo la rotazione.
‫Ora il prossimo input è un rotatore F chiamato Target.
‫Questo è il valore.
‫Vogliamo che questa rotazione della mesh della torretta interpreti per avvicinarsi senza intoppi.
‫Questo sarà il nostro sguardo alla rotazione.
‫Quindi dirò di guardare la rotazione.
‫Il prossimo input è il tempo delta.
‫Quindi conosciamo l'importanza del tempo Delta.
‫Se spostiamo oggetti o ruotiamo oggetti, vogliamo che il movimento sia indipendente dal frame rate.
‫Quindi, per questo, possiamo ottenere il tempo Delta.
‫Posso semplicemente includere le statistiche di gioco e se hai una buona memoria, ricorderai che l'inclusione
‫è la statica di gioco kismet slash.
‫Quindi otterrò le statistiche di gioco qui in modo da poter accedere alla funzione statica, ottenere secondi delta del mondo e
‫ricordare che ciò richiede un oggetto contesto mondiale.
‫Quindi passerò questo in quello.
‫E infine, abbiamo bisogno di una velocità interna.
‫Maggiore è il valore della velocità interna, più velocemente interpoleremo verso il target.
‫Quindi, se lo imposto su un valore, diciamo, cinque F, allora interpoleremo abbastanza lentamente.
‫Vediamo come appare ora.
‫Tutto questo è su una singola riga e scorre fuori dallo schermo.
‫Quindi quello che farò è posizionare l'input per impostare la rotazione del mondo sulla propria linea in questo modo.
‫Quindi proprio così.
‫E poi il nostro interprete, che ha questi quattro parametri di input anche fuori dallo schermo.
‫Quindi li metterò ciascuno sulle proprie linee.
‫In questo modo possiamo vedere tutti gli input senza dover scorrere lo schermo in quel modo.
‫Tutto bene.
‫Andrò avanti e lo salverò e avvierò la codifica dal vivo.
‫E ora se premo play e sposto il mouse, nota che ci vuole del tempo prima che avvenga quella rotazione.
‫Questo perché stiamo agevolmente interpolando verso quella rotazione del bersaglio.
‫Ora, questo è fantastico.
‫È esattamente quello che volevo.
‫Non importa come muovo il mouse, non avrò mai quel movimento scattante, a scatti e sporadico.
‫Ora, cinque è una velocità Internet terribilmente lenta, ma possiamo cambiarla.
‫Possiamo renderlo un po' più veloce.
‫Lo imposterò su 25, vedrò come appare e ti lascerò andare avanti e decidere il valore che ti piace
‫per il tuo gioco.
‫Quindi ancora una volta, dando il via alla codifica dal vivo e premendo play.
‫Ora ho un'interpolazione abbastanza veloce, ma non scatta.
‫È ancora veloce, ma non è uno scatto istantaneo.
‫Quindi, finché non faremo qualcosa del genere, beh, non lo otterremo.
‫Comportamento pazzo.
‫E, naturalmente, se vuoi una rotazione più lenta, sai come farlo ora e abbiamo finito con il disegno della
‫sfera di debug, quindi andrò avanti e lo rimuoverò.
‫Bene.
‫Quindi, in sintesi, abbiamo impostato la rotazione della torretta e diamo un'occhiata a Target, che è un vettore
‫F corrispondente a un punto nel mondo.
‫In questo momento stiamo solo usando il risultato di traccia hit.
‫Ora abbiamo inserito questa funzione nella classe base pong e l'abbiamo protetta, il che significa che siamo stati
‫in grado di ereditare la funzione nella classe tank.
‫E una volta che siamo pronti per creare una classe torre basata sulla base, allora quella classe
‫torre erediterà questa funzione di rotazione torretta e possiamo riutilizzarla.
‫Tutto quello che dobbiamo fare è passare.
‫In un nuovo sguardo a Target, lavoreremo sulla creazione di una classe tower derivata da base -- nelle prossime
‫lezioni.
‫Ci vediamo presto.