‫Ben tornato.
‫Ora abbiamo una modalità di gioco e vorremmo utilizzare la modalità di gioco per determinare quando possiamo iniziare il gioco.
‫Ora, alcuni giochi hanno un ritardo o un conto alla rovescia che inizia all'inizio del gioco.
‫E dopo un determinato periodo di tempo, il giocatore può spostare il personaggio o, nel nostro caso, il carro
‫armato in giro per il mondo.
‫Quindi lo implementeremo in questo video.
‫Ciò comporterà prima la disabilitazione dell'input in modo da non poterci muovere quando il gioco inizia per la prima
‫volta, quindi imposteremo un timer e dopo un determinato periodo di tempo, quindi potremo abilitare l'input.
‫Quindi torniamo a mettere a punto la modalità di gioco dei carri armati e aggiungiamo un paio di cose qui.
‫Per prima cosa, vorrei aggiungere un float per la quantità di tempo che dovrebbe trascorrere all'inizio del gioco prima che
‫possiamo iniziare a muoverci.
‫Quindi questo float verrà chiamato ritardo di avvio e lo inizializzerò su tre punti F in modo che dobbiamo
‫aspettare 3 secondi prima di poter iniziare il gioco.
‫Ora, non appena il gioco inizia, vorrei avviare questo timer, il che significa che vorrei una funzione
‫che avvii questo timer e renderò anche questa una funzione privata.
‫Farò di questa una funzione vuota chiamata handle game start.
‫Ora posso implementare la gestione dell'avvio del gioco nella modalità di gioco dei carri armati.
‫Scendi qui sotto inizia a giocare.
‫Ora non dimenticherò di aggiungere il nome della classe della modalità di gioco dei carri armati qui e ora ho una funzione di avvio del gioco
‫con maniglia.
‫Ora il posto in cui chiamarlo sarebbe Begin Play.
‫Poiché Begin Play viene chiamato all'inizio del gioco.
‫Quindi chiamerò handle game, inizierò da qui e inizierò a giocare.
‫E dal momento che stiamo facendo un paio di cose qui all'inizio del gioco in cui impostare il carro
‫armato e la messa a punto dei carri armati, il giocatore, le variabili del controller, mi piacerebbe spostarle nella gestione dell'avvio del gioco.
‫Quindi sposterò quelli direttamente in handle game start e in questo modo il controller del giocatore tank
‫e tune tank sarà impostato poiché chiameremo handle game start qui e iniziare a giocare.
‫Quindi qui è dove vorrei iniziare un conto alla rovescia dopo il quale possiamo abilitare l'input dell'utente.
‫Ora, prima di avviare il timer, disabiliterò l'input in modo da non poter ancora spostare il serbatoio.
‫E questo richiederà la nostra funzione.
‫Abbiamo posizionato qui in serbatoi di messa a punto, il controller del giocatore chiamato imposta lo stato abilitato del giocatore.
‫E questo significa che userò i carri armati, il controller del giocatore.
‫E se ho intenzione di usare il controller del giocatore di tune tank, è una buona idea assicurarmi che sia valido.
‫Quindi ho intenzione di dire se sintonizzare carri armati, giocatore, controller e se raggiungiamo l'interno
‫di questa dichiarazione if, allora posso prendere sintonizzare carri armati, controller del giocatore e chiamare lo stato abilitato del giocatore e passare in false.
‫E in questo modo il nostro carro armato non potrà muoversi.
‫E vedo gli scarabocchi rossi e questo perché ho detto carri armati, controller del giocatore piuttosto che sintonizzazione dei carri
‫armati.
‫Quindi, scrivendolo correttamente ora non ottengo errori lì.
‫Quindi ora dobbiamo avviare un timer.
‫Ora sappiamo che i timer implicano l'uso di un handle di timer F e possiamo effettivamente creare un handle di timer
‫F piuttosto che avere una variabile membro che appartiene alla classe.
‫Quindi andrò avanti e lo farò e chiamerò questa maniglia del timer di abilitazione del giocatore.
‫E poi, abbiamo bisogno di impostare un timer ora per la funzione di richiamata per il nostro timer, vorrei usare
‫imposta lo stato abilitato del lettore, ma imposta lo stato abilitato del lettore è una funzione che richiede un input di tipo booleano.
‫Ora non abbiamo visto come impostare un timer utilizzando una richiamata che richiede parametri di input.
‫Ciò comporterà un nuovo concetto chiamato delegato timer.
‫Quindi diamo un'occhiata al sistema di timer di Unreal Engine.
‫Ancora una volta, sappiamo che esiste un gestore di timer mondiale che gestisce i nostri timer e ha una funzione timer impostata.
‫Ora ci sono più sovraccarichi della funzione timer impostata.
‫Ne abbiamo già visto uno.
‫Ora parlerò di un'altra versione di questa funzione.
‫E questa versione richiede un handle del timer, una velocità del timer o un tempo di ritardo durante il quale dobbiamo attendere prima che la
‫nostra funzione di callback venga chiamata.
‫E invece di prendere direttamente l'indirizzo di una funzione di callback, può richiedere qualcosa chiamato delegato del
‫timer.
‫Questa è una struttura di delegato timer di tipo F, che ci consente di creare un oggetto che può associare una funzione
‫direttamente ad esso.
‫E i delegati timer possono associare funzioni che richiedono parametri di input.
‫Ora possiamo creare una variabile del delegato del timer EF e inizializzarla usando la funzione di creazione dell'oggetto dal
‫delegato del timer f.
‫Questo creerà un nuovo delegato timer e lo inizializzerà in base a ciò che passiamo tra parentesi.
‫Ciò richiederà un oggetto utente che è di.
‫Naturalmente, la classe su cui esiste la nostra funzione di callback.
‫E poi prende l'indirizzo della funzione di callback stessa, seguito da tutti i valori di input che vorremmo passare
‫al nostro callback una volta che viene chiamato.
‫Da lì possiamo chiamare set timer dal world timer manager e utilizzare il sovraccarico che richiede un delegato
‫timer.
‫Questo sovraccarico richiede lo stesso handle del timer, il delegato del timer, la frequenza di riproduzione o un float che determina il
‫ritardo prima del quale verrà chiamata la nostra callback, e quindi un valore booleano per determinare se il nostro timer deve
‫essere eseguito in loop, in modo da sapere come creare un Delegato temporizzatore F.
‫Quindi vorrei che ne creassi uno nella funzione handle game start all'interno della nostra nuova istruzione if.
‫Quindi crea un delegato del timer f locale e usa il delegato del timer f.
‫Crea il tuo oggetto.
‫Ora avremo bisogno di passare un oggetto utente e di solito lo abbiamo usato come oggetto utente,
‫ma la funzione che vorremmo chiamata esiste sul controller del giocatore.
‫Quindi passa al controller del giocatore di carri armati a sintonizzazione variabile come primo input che sarà l'oggetto utente
‫e la funzione di callback verrà impostata sullo stato abilitato del giocatore quella funzione che abbiamo aggiunto al nostro controller
‫del giocatore personalizzato.
‫Non dimenticare l'indirizzo dell'operatore e come terzo input passeremo il valore.
‫È vero, questo è ciò che verrà passato allo stato impostato per il giocatore abilitato quando il nostro callback verrà chiamato
‫alla fine del timer.
‫Quindi metti in pausa il video e provalo ora.
‫Quindi, appena sotto il nostro handle del timer, creerò un delegato del timer F locale e
‫chiamerò questo delegato del timer di abilitazione del giocatore.
‫Va bene.
‫Se l'hai chiamato qualcos'altro.
‫Ora lo inizializzerò usando f timer, delegherò, creerò il tuo oggetto.
‫E questo richiederà prima un oggetto utente e quello sarà il nostro controller del giocatore di carri armati.
‫Quindi dirò sintonizza il controller del giocatore dei carri armati come primo input.
‫E per il secondo abbiamo bisogno della nostra funzione di richiamata e quella sarà un giocatore di carri armati, lo
‫stato abilitato del giocatore del set di controller.
‫E non posso dimenticare, ho bisogno dell'indirizzo dell'operatore per questo indirizzo di funzione e il valore che vorrei
‫passato a questa funzione di callback sarà vero in questo modo.
‫Alla fine del tempo di ritardo, quando questo callback viene chiamato true sarà il valore passato alla
‫funzione di callback.
‫Ora sono pronto per chiamare il timer impostato, il che significa che devo chiamare get world timer manager.
‫E poi da lì posso chiamare il timer impostato.
‫E il sovraccarico della funzione che stiamo usando per primo prende un handle del timer e quello sarà un handle del timer
‫di abilitazione del giocatore.
‫Il prossimo input che passerò sarà il delegato.
‫Quindi sarà abilitato al giocatore, delegato del timer.
‫Prossimo.
‫Abbiamo bisogno del nostro tempo di ritardo e questo sarà il ritardo di inizio, che è il galleggiante che abbiamo appena creato.
‫Quindi il prossimo passo è in ritardo di avvio.
‫E infine, non voglio che questo timer si ripeta, quindi passerò false in modo da non ottenere un comportamento
‫in loop.
‫Ora vado avanti e indenta questi input in modo che sembri carino.
‫E ora chiamiamo il timer impostato utilizzando il nostro nuovo delegato timer.
‫E alla fine di questo tempo di ritardo dovremmo ottenere la nostra funzione di callback imposta lo stato abilitato del lettore chiamato con
‫il valore true passato ora poiché il ritardo di avvio è di 3 secondi e stiamo chiamando lo stato abilitato del
‫lettore impostato che passa in falso prima di impostare il nostro timer.
‫Quando premiamo play, non dovremmo essere in grado di muoverci fino a quando questo ritardo di tre secondi non è scaduto.
‫Quindi compiliamo questo e vediamo come funziona.
‫Quindi vado avanti e premo play e provo a muovermi e non ci riesco.
‫E dopo 3 secondi posso improvvisamente muovermi.
‫E controlla anche questo.
‫Si noti che il mio cursore è il mirino.
‫Potrebbe essere difficile da vedere sullo schermo, ma dovresti riuscire a vederlo bene sullo schermo.
‫E questo mi rende molto più facile mirare e controllare i miei carri armati.
‫Rotazione della torretta.
‫Perfetto.
‫Quindi, in sintesi, abbiamo creato una funzione di avvio del gioco handle per la modalità di gioco e la chiamiamo e
‫iniziamo a giocare.
‫E abbiamo anche impostato un timer utilizzando un delegato timer su cui abbiamo associato la nostra funzione di stato abilitato per il giocatore impostato sul
‫controller del giocatore.
‫Questo ci ha permesso di avere una funzione di callback per il nostro timer che accetta i parametri di input e lo
‫usiamo per abilitare l'input dell'utente dopo un ritardo di tre secondi all'avvio del gioco.
‫Ora, questo potrebbe essere frustrante per un giocatore se non avesse una sorta di segnale visivo, una sorta di
‫fargli sapere che l'input non è abilitato.
‫Qualcosa come un conto alla rovescia sullo schermo.
‫Quindi ce ne occuperemo nei prossimi video.
‫Ma per ora, congratulazioni.
‫Ora sai come associare una funzione che accetta parametri di input a un delegato timer.
‫Ci vediamo nel prossimo video.