‫Ciao e bentornato.
‫Ora stiamo spostando il nostro carro armato avanti e indietro, ma non abbiamo modo di guidarlo effettivamente.
‫Quindi, in questo video, lavoreremo per girare effettivamente il serbatoio usando qualcosa chiamato rotazione locale.
‫Questo è l'analogo rotazionale per aggiungere l'offset locale dell'attore.
‫Ora aggiungi l'offset locale dell'attore aveva più parametri di input e abbiamo passato solo il primo poiché gli
‫altri tre erano opzionali.
‫Ma uno di quegli altri tre aveva a che fare con lo spazzamento.
‫E discuteremo un po' di spazzare prima di continuare a implementare la rotazione.
‫Quindi sono tornato nella documentazione per ADD Actor Local Offset.
‫Quindi diamo un'occhiata a questi parametri di input ancora una volta.
‫Il secondo si chiama B Sweep ed è un booleano.
‫Ora, se scorriamo un po' più in basso e leggiamo le informazioni qui per lo sweep B, si
‫dice se eseguiamo lo sweep verso la posizione di destinazione attivando sovrapposizioni lungo il percorso e fermandoci prima del bersaglio
‫se bloccati da qualcosa.
‫Continua anche dicendo che solo il componente radice viene spazzato e controllato per bloccare la collisione.
‫I componenti del bambino si muovono senza spazzare.
‫Se la collisione è disattivata, non ha alcun effetto.
‫Quindi parliamo di cosa significa ora nella programmazione dei giochi, lo sweep è una tecnica eseguita dal motore, purché
‫lo sweep sia abilitato.
‫Se abbiamo un oggetto in movimento come una sfera rappresentata da questo cerchio, ogni fotogramma mentre questa sfera si
‫muove, il motore esegue i controlli di scansione.
‫Ciò significa che sta verificando se quella mossa per questo particolare fotogramma avrebbe comportato una sovrapposizione
‫tra due oggetti.
‫Quindi ho questo blocco qui rappresentato da questo rettangolo.
‫Consideriamo ora che questi sono gli unici due oggetti al mondo.
‫Quindi, mentre lo sweep è abilitato mentre la sfera si muove verso l'oggetto, il motore controlla
‫se questi due oggetti si sovrappongono.
‫Ora, mentre la sfera continua a muoversi, diciamo che durante uno di questi fotogrammi la sfera si sarebbe
‫mossa in modo tale da sovrapporsi all'altro oggetto.
‫Ora ciò che fa lo sweep abilitato è che il motore rileverà questa sovrapposizione e sposterà quella sfera indietro
‫per quel particolare fotogramma in modo che non penetri mai effettivamente nell'oggetto.
‫Ora non vediamo mai effettivamente la sfera penetrare nell'oggetto.
‫Il motore cattura che si sovrappongono prima che il movimento sia effettivamente implementato.
‫Quindi il risultato è che vediamo che la sfera si ferma poco prima di sovrapporsi.
‫Quindi se questo rettangolo fosse un muro, per esempio, la sfera si fermerebbe sulla superficie del muro.
‫Questo è ciò che lo spazzamento ottiene per noi.
‫Ora la documentazione dice che se la collisione è disattivata, questo non ha alcun effetto.
‫Quindi la collisione deve essere abilitata affinché lo sweep funzioni.
‫Quindi, di nuovo qui in serbatoi CP nella funzione di spostamento, ecco la nostra chiamata per aggiungere l'offset locale dell'attore e
‫se vogliamo possiamo passare qui un altro parametro di input, il secondo è lo sweep booleano in modo da poter
‫passare true qui.
‫Quindi compiliamo questo e vediamo l'effetto dell'abilitazione dello sweep.
‫Ora, se premiamo play e proviamo a muoverci attraverso un muro, ad esempio, vedremo che ci muoviamo attraverso
‫il muro.
‫Quindi c'è qualcosa che non funziona qui.
‫Ora diamo un'occhiata a qual è il componente del percorso per il serbatoio dello stagno BP.
‫Ricordiamo, abbiamo utilizzato la componente capsula per il percorso.
‫Quindi con i componenti della capsula selezionati nel serbatoio dello stagno BP.
‫Andiamo al pannello dei dettagli e scorriamo verso il basso e vedremo qui una sezione chiamata Collisione.
‫E qui vediamo le preimpostazioni di collisione e ha un menu a discesa.
‫Quindi espandiamolo.
‫Ora, le preimpostazioni di collisione possono essere impostate su un numero qualsiasi di opzioni e per impostazione predefinita vediamo sovrapposizioni tutte dinamiche.
‫Ora, a seconda della versione di Unreal Engine che stai utilizzando.
‫Potresti vedere qualcos'altro qui, ma possiamo cambiarlo.
‫Se selezioniamo il menu a discesa e scegliamo blocca tutto dinamico, le opzioni in grigio sottostanti cambiano.
‫Ricorda che eravamo in sovrapposizione tutti dinamici e qui vediamo tre colonne di caselle di controllo.
‫Queste sono le risposte alle collisioni e la colonna a sinistra mostra un elenco di tipi di oggetti di collisione.
‫Quindi ogni dato componente ha il proprio tipo di oggetto di collisione.
‫Si noti che possiamo vedere il tipo di oggetto per la capsula impostato su dinamico mondiale.
‫E quando cambiamo i preset di collisione per bloccare tutta la dinamica, vedrai che le risposte
‫alle collisioni sono tutte controllate per bloccare in risposta a tutti gli altri tipi di oggetti di collisione.
‫Quindi premiamo play e vediamo cosa succede quando proviamo a passare attraverso le cose.
‫Vedrai che ci fermiamo poco prima di sovrapporci.
‫Gli altri stagni.
‫Ora, se sposto il serbatoio in modo da poter tentare di sovrapporci al muro e aggirare gli altri
‫stagni.
‫Ora, se premo play, blocco anche il muro.
‫Quindi questo blocco preimpostato di collisione, tutto dinamico imposta la risposta alla collisione per bloccare tutti gli altri tipi di oggetti.
‫E puoi sempre vedere il tipo di oggetto di collisione di un particolare componente selezionandolo nel pannello dei componenti
‫e scorrendo fino alla sezione di collisione nel pannello dei dettagli e aprendo il menu a discesa per i
‫preset di collisione.
‫Ho selezionato la mesh di base e il suo tipo di oggetto è dinamico mondiale ed è impostato per bloccare tutto.
‫Quindi ora vediamo che lo sweep funziona poiché abbiamo impostato i nostri preset di collisione per la composizione della capsula per bloccare
‫tutta la dinamica.
‫E abbiamo visto nella documentazione che solo il componente root viene spazzato e controllato per bloccare la collisione.
‫Quindi non importa davvero su cosa siano impostati gli altri componenti.
‫Stiamo solo verificando se il componente root sta bloccando qualcosa.
‫Ora, un problema che ha fatto inciampare alcuni studenti è che non possono muoversi non appena hanno impostato la
‫capsula per bloccare tutta la dinamica.
‫Ora, una delle ragioni potrebbe essere che la tua capsula si sovrappone al pavimento.
‫Se la capsula si sovrappone al pavimento, non sarai in grado di muoverti perché il motore
‫non consentirà al tuo serbatoio di muoversi se il componente della capsula si sovrappone a qualcosa che è impostato per bloccare.
‫Quindi una soluzione semplice per questo sarebbe assicurarsi che la capsula non si sovrapponga al pavimento.
‫Ora puoi entrare nel tuo serbatoio BP e assicurarti che la tua capsula sia appena sopra le ruote qui.
‫Vado in vista ortografica.
‫E seleziona la mia mesh di base e abbassala.
‫Quindi le ruote sono appena sotto il componente della capsula.
‫Quindi ora se la tua rete è solo sul pavimento e la capsula è appena sopra la rete.
‫Dovresti essere in grado di muoverti.
‫Quindi vado su play e ci siamo.
‫Quindi, ora che ci siamo tolti di mezzo, è tempo di iniziare a implementare la rotazione.
‫Torniamo alle impostazioni del nostro progetto.
‫Quindi andiamo a modificare le impostazioni del progetto, scorriamo verso il basso fino a input e nella sezione di input abbiamo le nostre mappature degli assi.
‫Ora ci siamo già occupati.
‫Vai avanti.
‫È ora di occuparsi del prossimo chiamato Turn e Turn ha D e A assegnati dove D ha una scala di
‫uno e A ha una scala di uno negativo.
‫Vorremmo usare D e AX per ruotare il serbatoio.
‫Quindi, per associare una funzione alla mappatura dell'asse di virata, abbiamo bisogno di una funzione da associare.
‫Quindi siamo tornati nel codice di V e andrò nel file del serbatoio in modo da poter creare una funzione da collegare a
‫quella mappatura dell'asse di virata.
‫Ora chiamerò questa funzione vuota girare e proprio come muovere.
‫Ha bisogno di un parametro di input float e chiameremo questo valore.
‫Quindi abbiamo dichiarato questa funzione, definiamola e tank CP e la metterò appena sotto la
‫funzione di spostamento.
‫Quindi gli ho assegnato un corpo di funzione e ho bisogno del nome della classe insieme ai due punti doppi appena prima del
‫nome della funzione.
‫Ora abbiamo una funzione adeguata.
‫Ora, questa non è l'unica cosa che dobbiamo fare.
‫Dobbiamo assicurarci che questa funzione sia legata alla mappatura degli assi chiamata turn.
‫Lo facciamo nel componente di input del giocatore di configurazione e lo facciamo proprio come abbiamo fatto per la mappatura dell'asse di spostamento in avanti.
‫Quindi diremo componente di input del giocatore, useremo l'operatore freccia e associamo l'asse.
‫Ora il primo parametro sarà il nome della mappatura dell'asse racchiuso in una macro di testo.
‫Quindi diremo girare perché era il nome della mappatura dell'asse.
‫Il prossimo è l'oggetto per cui stiamo legando la funzione.
‫Possiamo passare questo e infine passare la funzione che vorremmo legare di nuovo.
‫Ci serve l'indirizzo dell'operatore e sarà un turno di carro armato.
‫Quindi è così facile.
‫Abbiamo associato la funzione di svolta alla mappatura dell'asse di svolta.
‫L'unica cosa rimasta è fare qualcosa nella funzione turn.
‫Ora abbiamo visto che abbiamo l'offset locale dell'attore ADD, ma c'è un analogo rotazionale per questa funzione
‫e si chiama rotazione locale dell'attore ADD.
‫Ciò che fa è aggiungere una rotazione locale all'attore come suggerisce il nome, e vedrai che ci sono
‫due diverse versioni della funzione, una che accetta un rotatore F e una che prende qualcosa
‫chiamato F quad.
‫Utilizzeremo la versione che richiede un rotatore F.
‫Si chiama rotazione delta.
‫E proprio come ADD Actor Local offset, può anche accettare un parametro sweep e gli stessi altri due parametri di
‫input per aggiungere l'attore local offset.
‫E questi ultimi tre parametri di input sono opzionali, proprio come aggiungi l'offset locale dell'attore.
‫Quindi, invece di un vettore F, passeremo in un rotatore F.
‫Ora torniamo qui nella funzione turn, se creiamo un rotatore F e chiamiamo questa rotazione delta, vedremo che se facciamo clic
‫con il tasto destro del mouse su rotatore F e andiamo alla definizione, verremo portati a rotatore e ne
‫vedremo tre variabili membro pubbliche qui di tipo float.
‫Ora, proprio come il rotatore F vettore F ha solo queste tre componenti invece di X, Y e Z,
‫abbiamo imbardata e rollio.
‫Ora, l'imbardata è il componente che ci interessa.
‫Dice rotazione attorno all'asse in alto tra parentesi attorno all'asse Z.
‫E questo è l'unico tipo di rotazione che ci interessa ruotare attorno all'asse Z.
‫È così che possiamo guidare il nostro carro armato.
‫Ora, ti farò solo notare che ci sono più costruttori anche per il rotatore F e che
‫l'impostazione predefinita dice di nuovo nessuna inizializzazione, proprio come con il vettore F.
‫Quindi possiamo usare quello che accetta un singolo float e tutti i componenti verranno inizializzati su quel
‫valore float.
‫Ce n'è uno con tre valori float e puoi dare un'occhiata e vedere alcuni degli altri.
‫Ora, farò anche notare che c'è un rotatore zero e, a proposito, questo è un rotatore zero statico.
‫Ecco perché possiamo tornare al tank CP e dire qualcosa come uguale a F rotator zero rotator zero rotator è una variabile membro
‫statica e puoi accedere a funzioni membro statiche e variabili come questa specificando il nome della classe con
‫l'operatore di risoluzione dell'ambito e facendo riferimento a quello statico variabile o funzione per
‫nome.
‫È quello che stiamo facendo qui con te.
‫Le statistiche di gioco ottengono i secondi delta del mondo sono statici.
‫Funzione, il che significa che non abbiamo bisogno di un'istanza reale della classe statica di gioco del gioco
‫per poter accedere a quella funzione statica.
‫Esiste già.
‫Lo stesso con zero rotatore e zero vettore.
‫Quindi chiuderò il rotatore h e abbiamo questa rotazione delta ed è inizializzato su un rotatore
‫zero.
‫Ora il tuo passo e il tuo ruolo sono azzerati proprio come X, Y e Z sono azzerati per il vettore F.
‫Quindi dovremo cambiare quel tuo componente.
‫Quindi, proprio come ho fatto con la nostra posizione delta nella funzione MOV, creiamo uno pseudocodice per le rotazioni
‫delta.
‫Sì, vorremo che tutti voi siate impostati su un valore scalato in base al tempo Delta, ovviamente, perché vogliamo che questa svolta
‫sia indipendente dal frame rate, ma abbiamo anche bisogno di una sorta di velocità di svolta che possiamo chiamare questa
‫velocità di svolta.
‫Quindi, una volta impostato, sì, possiamo aggiungere quella rotazione locale che ruoterà l'attore in base al rotatore
‫F ogni fotogramma e che verrà ridimensionato in base al valore.
‫Quindi sarà zero se non stiamo premendo alcun tasto e avrà un valore se stiamo premendo DX
‫e ax.
‫Quindi ora hai una sfida.
‫Funzionerà proprio come aggiungere l'offset locale dell'attore.
‫L'unica differenza è che ora stiamo ruotando l'attore.
‫Quindi, dal momento che abbiamo bisogno di una sorta di velocità di rotazione per ruotare l'attore, creerai una variabile di
‫velocità di rotazione, la trasformerai in float e la inserirai nella sezione privata proprio accanto alla variabile di velocità.
‫Esponi questa variabile con la tua proprietà e scegli i nuovi identificatori di proprietà appropriati.
‫Ora nella funzione turn imposterai in particolare la rotazione delta, ci preoccupiamo che il tuo componente imposti il
‫valore uguale a value moltiplicato per la nostra variabile di turn rate e moltiplichiamo anche per delta time e quindi sei pronto per
‫chiamare add attore locale rotazione passando in questo f rotator ora per il secondo parametro vai avanti e passa in
‫true per l'input B sweep poiché vogliamo eseguire lo sweep durante la rotazione, mettere in pausa il video e implementare la
‫rotazione per il serbatoio ora.
‫Bene.
‫Quindi questo sarà abbastanza semplice.
‫Abbiamo solo bisogno di una variabile di turn rate.
‫Ora andrò in tank appena sotto velocità e creerò una velocità di virata flottante.
‫Ora probabilmente lo inizializzi su un certo valore e va bene.
‫Se è diverso da quello che sto scegliendo, andrò con 45 F e vedrò come funziona.
‫Ma lo esporremo ai progetti in modo da poterlo modificare durante lo sviluppo.
‫Ora mi piacerebbe che fosse modificato ovunque e lo inserirò nella stessa categoria movimento della velocità.
‫Quindi andrò avanti e ruberò questa tua proprietà e la incollerò proprio qui sopra, gira a destra in modo che
‫la metta ovunque.
‫Movimento di categoria ora e CP serbatoio.
‫Sono pronto a dare il via alla rotazione Delta.
‫Quindi diremo rotazione delta.
‫Sì.
‫E lo imposteremo uguale a value times, turn rate times, delta time.
‫E ovviamente possiamo ottenere il tempo Delta con le statistiche di gioco di U, ottenere i secondi delta del mondo che passano in
‫questo come oggetto del contesto mondiale.
‫Quindi lo incollerò proprio lì.
‫Ora so che il mio pseudocodice non corrisponde esattamente.
‫È nell'ordine sbagliato.
‫Il tempo delta è nel mezzo qui.
‫Non importa perché quando si moltiplicano tre valori insieme, è possibile moltiplicarli in qualsiasi ordine e ottenere
‫comunque lo stesso risultato.
‫Quindi, nel caso te lo stessi chiedendo, la matematica risulterà comunque la stessa se moltiplichi questi tre
‫valori in un ordine diverso.
‫Quindi non preoccuparti troppo.
‫Ora abbiamo la rotazione delta.
‫L'unica cosa rimasta da fare è chiamare la rotazione locale dell'attore aggiuntivo, e stiamo passando in rotazione delta e per il
‫secondo input passeremo in true per abilitare lo sweep durante la rotazione.
‫Quindi compiliamo questo.
‫Va bene, ora siamo compilati.
‫Potresti notare in un paio dei prossimi video che in queste linee mancano zero vettore e zero
‫rotatore.
‫Questo perché ho iniziato con questi inizializzati e mi sono reso conto in seguito che questi
‫dovrebbero probabilmente essere inizializzati almeno con valori zero.
‫Quindi non preoccuparti se vedi queste linee in seguito che appaiono così sull'inizializzazione, mantieni il tuo vettore zero e
‫il tuo zero rotatore e vedrai che lo catturerò in un prossimo video futuro.
‫Quindi non preoccuparti.
‫Se non vedi questi quelli di inizializzazione, dovrebbero essere lì.
‫E siamo tornati nell'editor.
‫Premiamo play e userò il tasto D e stiamo ruotando e il tasto A mi fa ruotare indietro nell'altro modo
‫e possiamo anche muoverci avanti e indietro.
‫Quindi ora che possiamo ruotare e andare avanti, abbiamo la possibilità di muoverci in tutto il mondo.
‫Questo è un grande traguardo.
‫Ora mi sto muovendo abbastanza lentamente, ma va bene perché posso selezionare il mio carro armato e posso cercare
‫la categoria di movimento e cambiare la velocità di virata a qualcosa di più alto, ad esempio 90.
‫Quindi andiamo avanti e premiamo play.
‫Ed è un po' più veloce.
‫Ora, se pensi che questo sia ancora un po' lento.
‫Ovviamente puoi regolarli.
‫Quindi selezionerò di nuovo il -- tank.
‫E invece di 400, facciamo 800.
‫Perché no?
‫Invece di 90, andiamo a dire 120.
‫Ora, se premo play, sono un po' più veloce.
‫Quindi questo sembra davvero, davvero buono.
‫Quindi, guardando indietro alla pianta della sezione, ora abbiamo un carro armato che può muoversi in tutto il mondo.
‫Quel primo punto elenco è definitivamente spuntato e stiamo gestendo il movimento WASD.
‫Non stiamo ancora gestendo l'input del mouse, ma ci arriveremo.
‫Ma siamo un passo più vicini al completamento di questo gioco.
‫Quindi, in sintesi, abbiamo imparato cos'è lo spazzamento e come possiamo consentirlo in modo che i nostri oggetti non si passino
‫l'uno attraverso l'altro.
‫Abbiamo aggiunto una rotazione locale degli attori e l'abbiamo fatto implementando una velocità di rotazione che potevamo regolare nei
‫dettagli.
‫Pannello nell'editor per rendere un po' più semplice lo sviluppo.
‫Ottimo lavoro.
‫Ora stiamo spostando il carro armato in tutto il mondo.
‫Ci vediamo nel prossimo video.