‫Ciao e bentornato.
‫Ora siamo pronti per iniziare a gestire l'input dell'utente.
‫Ciò significa che vorremmo premere i tasti della tastiera e spostare il mouse e fare clic con il mouse e vedere
‫il nostro serbatoio reagire a quell'input.
‫Ora, per farlo, dobbiamo prima ottenere effettivamente quell'input e inizieremo a farlo usando
‫le mappature degli assi.
‫Quindi parliamo di questo.
‫Ora qui nel progetto, andiamo a modificare e alle impostazioni del progetto.
‫E se scorriamo verso il basso e selezioniamo input, qui vediamo i nostri binding.
‫E sotto i collegamenti ci sono mappature delle azioni e mappature degli assi.
‫Per prima cosa entreremo nelle mappature degli assi.
‫Ora potresti avere qualche esperienza con questi, ma faremo un tuffo un po' più approfondito
‫su cosa fanno e come funzionano.
‫Quindi ne abbiamo tre.
‫E se clicco sulla freccia del menu a discesa, vedrò qui W e SW e questi stanno parlando dei tasti
‫W e SW sulla tastiera.
‫Questi sono assegnati a questa particolare mappatura dell'asse, chiamata Sposta in avanti.
‫Quindi discutiamo di come funziona questa mappatura degli assi.
‫Quindi abbiamo visto in The Unreal Editor che abbiamo questa mappatura degli assi chiamata Move Forward e ha W
‫e SCS assegnati a questa mappatura degli assi.
‫Quindi cosa significa esattamente?
‫Bene, in Unreal Engine, abbiamo qualcosa chiamato mappatura degli assi.
‫E la mappatura degli assi è qualcosa che ha elaborato ogni singolo fotogramma del gioco.
‫Si assegnano le chiavi a una mappatura degli assi.
‫Nel nostro caso, abbiamo assegnato W e S.
‫Ora dai un'occhiata accanto al tasto W qui.
‫Nel mio piccolo esempio di screenshot a destra, dice scala.
‫E accanto alla scala c'è un numero 1. 0.
‫E potresti aver notato che accanto all'SQ, la scala è -1. 0.
‫Quindi questi sono valori che influenzeranno le informazioni di input.
‫Ecco come funziona una mappatura degli assi.
‫La nostra mappatura degli assi avanti ha la capacità di essere associata a una funzione in C++.
‫Ora, quando si tratta di mappature Axis, se associamo una funzione a una mappatura Axis, deve prendere un parametro
‫di input di tipo float in modo da poter creare una funzione sul nostro pond chiamata MOVE che accetta un
‫float.
‫Chiameremo semplicemente questo valore del parametro di input.
‫Ora c'è un modo per prendere questa funzione e associarla alla nostra mappatura dell'asse di spostamento in avanti.
‫Diceva che leghiamo la funzione di spostamento alla mappatura dell'asse.
‫Quindi ogni fotogramma del sistema di input di Unreal Engine controllerà se stiamo premendo il
‫tasto W o il tasto.
‫E calcolerà un valore dell'asse a seconda che stiamo premendo o meno quei tasti e ogni singolo
‫fotogramma.
‫Chiamerà questa funzione in cui siamo obbligati ad andare avanti e a passare quel valore dell'asse.
‫Qualunque cosa accada all'interno di quella funzione dipende da noi come sviluppatori C++.
‫Ora ecco come funziona.
‫Se non stiamo premendo la W oi tasti, questo valore dell'asse ha il valore zero.
‫Quindi la funzione di spostamento associata alla mappatura dell'asse di spostamento in avanti viene chiamata ogni singolo fotogramma
‫e il valore float passato è zero.
‫Ora diciamo che stiamo premendo il tasto W.
‫Il tasto W ha la sua scala impostata su 1. 0.
‫Ciò significa che il nostro valore dell'asse sarà 1. 0 ed è ciò che viene passato alla funzione MOV.
‫Quindi ogni singolo fotogramma, la funzione di spostamento viene chiamata con un valore di 1. 0 è passato.
‫Ora diciamo invece di premere l'SRC che ha un valore di scala di -1. 0.
‫Ciò significa che ogni singolo fotogramma verrà chiamato la funzione di spostamento e -1. 0 sarà passato.
‫Ora, nel caso in cui stiamo premendo sia W che S, entrambi questi valori vengono sommati.
‫Quindi otteniamo l'1. 0 premendo il tasto W e otteniamo -1. 0 dalla pressione di SRC.
‫Ora entrambi si cancellano a vicenda.
‫Quindi, se stiamo premendo entrambi contemporaneamente, la funzione di spostamento verrà chiamata con zero passato.
‫Quindi, a seconda della combinazione di tasti che stiamo premendo, otterremo un valore diverso passato
‫nella nostra funzione MOVE e possiamo fare quello che vogliamo con quel valore, come usarlo per spostare il pedone.
‫Parleremo di spostare effettivamente il pedone abbastanza presto.
‫Per ora, lavoriamo solo per configurare noi stessi in modo da poter gestire queste informazioni dal
‫sistema di mappatura Axis.
‫Ok, quindi ora che sappiamo come funziona la mappatura dell'asse, è il momento di creare una funzione di callback
‫che possiamo associare alla mappatura dell'asse di spostamento in avanti.
‫Quindi chiuderò le impostazioni del progetto e tornerò al codice VS.
‫Quindi qui nel codice VS, vorremmo creare una funzione che possiamo associare alla mappatura dell'asse di spostamento in avanti.
‫Quindi qui nel serbatoio H possiamo creare una funzione privata.
‫Ora avrà.
‫Il tipo di ritorno void, e vorrei chiamare questa mossa.
‫Ora deve avere un parametro di input float e chiameremo questo valore.
‫Quindi prendiamo la nostra funzione di spostamento e definiamola qui in Tank.
‫CP Lo inserirò qui appena sotto il costruttore e abbiamo bisogno di un tank con l'operatore di risoluzione dell'oscilloscopio prima
‫del nome della funzione.
‫Quindi abbiamo questa funzione di spostamento e siamo pronti per associarla alla nostra mappatura dell'asse di spostamento in avanti.
‫E questo viene fatto all'interno di una funzione chiamata componente di input del lettore di installazione.
‫Dovrebbe suonare familiare.
‫Infatti, se apriamo il nostro explorer e torniamo a Base Pont H, possiamo scorrere verso il basso e vedere nella sezione pubblica
‫il componente di input del player di configurazione della funzione.
‫Vedremo che questo è un override di una funzione virtuale ereditata.
‫Ora la classe di spawn di base non ha davvero bisogno di impostare alcun input, ed è ciò che questa funzione
‫è per gestire l'input di un giocatore.
‫Ora, la nostra classe base bond non ha bisogno di gestire l'input, ma la nostra classe tank sì.
‫Quindi quello che possiamo fare è togliere questa funzione dal laghetto di base h, ma la copierò perché ne abbiamo bisogno
‫nel serbatoio.
‫Quindi, copiando questa funzione, andrò su Tank H e qui nella sezione pubblica la
‫incollerò.
‫E poiché non ne abbiamo bisogno nel laghetto di base, lo rimuoverò semplicemente dalla classe di laghetto di base.
‫E infatti andrò nello stagno di base CP e lo rimuoverò anche da qui.
‫Quindi andiamo avanti ed eliminiamo il componente di input del giocatore di configurazione da Base Pond.
‫CP E ora non è più nella classe base pond.
‫Quindi andiamo avanti e salviamo le nostre modifiche e chiudiamo Pond H e CP di base.
‫E ora abbiamo il componente di input del giocatore di configurazione dichiarato in Tank H, ma vogliamo anche definirlo e tank.
‫CP Quindi qui in Tank.
‫CP Aggiungerò la definizione appena sopra la funzione di spostamento.
‫Quindi questo è nullo ed è un componente di input del giocatore di configurazione del carro armato.
‫Ora torniamo a Tank H e vediamo qual è il suo tipo di parametro di input.
‫Vedrai che è dichiarato in avanti qui tra parentesi.
‫Questo è qualcosa che puoi fare se vuoi inoltrare, dichiarare un tipo di classe in un file di intestazione.
‫Quindi è dichiarato in avanti qui e abbiamo bisogno di questo tipo di puntatore del componente di input e il parametro è chiamato
‫componente di input del lettore.
‫Quindi abbiamo bisogno di questo parametro di input nel serbatoio.
‫CP Quindi, tra parentesi per l'impostazione del componente di input del giocatore, avremo un componente di input U
‫che è un puntatore e si chiama componente di input del giocatore.
‫Quindi ora la firma della funzione corrisponde a quella nella dichiarazione della funzione.
‫Ora di nuovo nel file CP, diamo a questa funzione un corpo di funzione e stiamo sovrascrivendo questa funzione
‫ed è una buona idea chiamare il componente di input del lettore super set up.
‫Ora, dal momento che chiamiamo la versione principale di setup player input component, dobbiamo passare un
‫input di tipo you input component.
‫Passeremo qui il parametro di input a questa funzione.
‫Quindi in questo modo la classe genitore chiamerà la sua versione.
‫Ora il serbatoio del laghetto di base non implementa questa funzione.
‫L'abbiamo appena rimosso.
‫Ma la classe genitore su cui basare -- chiamerà la sua versione.
‫E ogni volta che sovrascrivi una funzione virtuale come questa, chiamare la versione super è una buona idea.
‫Quindi non ci perdiamo nessuna funzionalità implementata nella versione genitore.
‫Allora perché lo stiamo facendo?
‫A cosa serve il componente di input del lettore di configurazione?
‫Bene, una delle cose per cui è utile è associare le funzioni per accedere alle mappature.
‫Vorremmo associare la nostra funzione di spostamento alla mappatura dell'asse di spostamento in avanti.
‫E lo facciamo qui.
‫Lo facciamo usando questo componente di input del lettore di parametri di input.
‫Ecco a cosa serve questo oggetto.
‫Prendiamo il componente di input del giocatore e su questo puntatore usiamo l'operatore freccia per accedere a una
‫funzione chiamata bind axis.
‫Ora Bind Axis accetta alcuni parametri di input.
‫Il primo è una stringa letterale, il che significa che useremo la macro di testo.
‫Ora cosa mettiamo tra le virgolette?
‫Mettiamo il nome della mappatura degli assi.
‫Abbiamo visto nell'editor che questa mappatura degli assi è chiamata sposta avanti.
‫Quindi stiamo scegliendo quella mappatura dell'asse da associare al secondo parametro di input.
‫Questo sarà un puntatore all'oggetto in cui associare la funzione per questo è un puntatore
‫all'istanza della classe particolare in cui n e poiché siamo nella classe tank, questo punterà all'istanza
‫del pedone tank nel gioco.
‫Ora il terzo parametro è l'indirizzo della funzione che stiamo vincolando.
‫Quindi abbiamo una mossa del carro armato.
‫Molto importante che abbiamo bisogno di completamente.
‫Qualifica il nome della funzione con il nome della classe.
‫E proprio qui davanti al nome della funzione, abbiamo bisogno dell'indirizzo dell'operatore.
‫Ora, se non hai familiarità con fare qualcosa del genere, questo sta semplicemente prendendo l'indirizzo di
‫una funzione.
‫Le funzioni possono avere indirizzi proprio come le variabili.
‫Quindi l'utilizzo dell'indirizzo dell'operatore è un modo per passare funzioni ad altre funzioni.
‫Ecco perché abbiamo bisogno dell'indirizzo dell'operatore.
‫Quindi abbiamo la nostra chiamata di funzione per associare l'accesso.
‫Ora probabilmente noterai che il puntatore di errore di IntelliSense al tipo di classe incompleto che hai inserito nel componente
‫non è consentito.
‫Ora sappiamo cosa può causare questo.
‫Per uno, potrebbe significare che dobbiamo includere un file di intestazione.
‫Un'altra possibilità è che si tratti di un falso errore.
‫Puoi scoprirlo facilmente compilando, quindi proviamo a compilare.
‫Vedremo che avremo una compilazione riuscita.
‫Quindi sappiamo che questo è un falso errore.
‫Ma ancora una volta, se lo desideri, puoi aggiungere l'inclusione solo per rimuoverlo.
‫Quindi non ti dà fastidio.
‫Ora sappiamo che il tipo di classe di cui si lamenta è il componente di input.
‫Quindi ecco il componente di input nella documentazione ed ecco l'inclusione.
‫E se lo aggiungiamo qui all'inizio del file CP del serbatoio, elimineremo quel fastidioso falso errore.
‫E ancora, poiché questi hanno il desiderio di Pragya di includere le guardie, sappiamo che i componenti di
‫input non verranno inclusi più di una volta e gli scarabocchi sono spariti.
‫Quindi ora sappiamo che questa funzione di spostamento verrà chiamata ogni fotogramma e il valore avrà un
‫valore float particolare a seconda che stiamo premendo la W o chiedendo.
‫Ora, sapere semplicemente che la funzione di spostamento è destinata ad andare avanti non è abbastanza.
‫Come sviluppatori, è bello avere una sorta di conferma che le cose stanno funzionando.
‫Quindi quello che mi piacerebbe che tu facessi come sfida è usare il log YUI nella funzione MOV per stampare
‫il valore che viene passato a spostare quel float chiamato valore.
‫Quindi usa percent f in uiy log per registrare il valore del valore float nel registro di output e quindi prova il gioco
‫e premi quei tasti e guarda cosa viene stampato sul registro.
‫Metti in pausa il video e aggiungilo alla funzione di spostamento ora.
‫Bene.
‫Quindi qui nella funzione mov, aggiungerò un registro dell'interfaccia utente.
‫E questo può essere un avviso di registrazione temporanea.
‫E per la macro di testo.
‫Metterò semplicemente il valore percentuale F e il valore.
‫Ora va bene.
‫Se hai usato una verbosità o un tipo di avviso diverso, se sai come fare quelle cose.
‫Va benissimo.
‫Userò solo un avviso qui e so che hai usato cose come percentuale se e formattato il tuo registro
‫con un valore di stringa.
‫Percentuale F, se non sei a conoscenza, è come formattare il registro dell'interfaccia utente con un valore float.
‫Quindi compiliamo questo e torniamo nell'editor, aprirò il registro di output e premo play e controllerò dove
‫spamming il registro di output con innumerevoli messaggi.
‫Ora faccio clic nella finestra e premo il tasto W.
‫C'è il mio valore di uno che ho intenzione di rilasciare.
‫È tornato a zero.
‫Premo il tasto ed è negativo.
‫E se premiamo entrambi contemporaneamente, otteniamo zero.
‫E quindi è esattamente come ci aspettavamo.
‫Perfetto.
‫Tutto bene.
‫Quindi, in questo video, abbiamo impostato il nostro laghetto per gestire alcuni input degli utenti.
‫Abbiamo parlato di mappature di accesso e abbiamo associato la nostra funzione di spostamento alla mappatura di accesso di spostamento in avanti.
‫Abbiamo quindi stampato quel valore di accesso utilizzando il registro YUI nella nostra funzione MOVE, ma in realtà vorremmo spostare il nostro
‫serbatoio piuttosto che stampare solo alcuni valori nel registro di output.
‫Quindi, nelle prossime lezioni, lo prepareremo in modo da poter effettivamente iniziare a spostare il nostro carro armato.
‫Ci vediamo presto.