‫Ciao e Benvenuto.
‫In questa lezione introdurremo una novità nell'albero del comportamento, i servizi.
‫Scopriremo cosa sono i servizi, come ci aiutano con un comportamento di esecuzione persistente e come
‫possiamo scrivere i nostri in C++.
‫Entriamo subito.
‫Ora ci sono solo pochi pezzi di logica rimasti nel nostro controller aereo che non sono nel nostro albero del comportamento.
‫Uno di questi è l'impostazione della posizione di partenza.
‫Questo voglio ancora impostare qui dal controller dell'aria.
‫Ma cose come tic, ora che vorrei fare dall'interno di un albero del comportamento.
‫Cosa voglio fare qui?
‫Come faccio a farlo.
‫Da aggiungere alla posizione del nostro giocatore.
‫Per aggiornare l'ultima posizione conosciuta del giocatore.
‫Entrambi possiamo fare con qualcosa chiamato servizio di progetto.
‫Quindi andiamo ai nostri progetti e vediamo cosa sta succedendo.
‫Quindi, se vado dal mio alleato e apro l'albero del comportamento, lo parlo con la finestra principale, allora ho bisogno di mostrarti
‫quali servizi abbiamo usato prima.
‫Ed è essenzialmente un modo per eseguire qualcosa ogni volta o ogni tanto ogni volta che un particolare percorso è
‫attivo.
‫Quindi, se avessi un servizio qui sul comportamento Chase, allora qualcosa del codice sarebbe in grado di essere eseguito tutto il tempo in cui il comportamento
‫Chase è attivo, indipendentemente dal fatto che ci muoviamo, scattiamo, soppesiamo una qualsiasi di
‫queste cose, sarebbe sempre in esecuzione.
‫Ma se siamo dentro, indaghiamo, non lo sarebbe.
‫Quindi questo è esattamente il tipo di situazione in cui stiamo cercando di utilizzare un servizio.
‫Ora diamo un servizio di esempio.
‫Una cosa che notiamo quando suoniamo è che una volta che l'aria arriva nel nostro raggio
‫d'azione e ci muoviamo, non si gira per guardarci e possiamo aggiustarlo con un servizio già integrato qui.
‫Quindi fai clic con il pulsante destro del mouse su questa nota e vai su Aggiungi servizio e cerca il servizio di messa a fuoco predefinito.
‫Puoi vedere che è di un colore diverso, è verde.
‫E se selezioniamo quel servizio predefinito, va anche sotto i nodi della sequenza anziché sopra di essi, che è
‫ciò che fanno i decoratori.
‫Quindi, con la messa a fuoco predefinita selezionata, puoi quindi scegliere su cosa concentrarti.
‫In questo caso, vogliamo concentrarci sulla posizione del giocatore.
‫Vai avanti e premi Salva, premi Riproduci.
‫E ora se andiamo a dare un'occhiata e ci muoviamo, puoi vedere che sta ruotando per seguirci.
‫Roba forte.
‫Ora vogliamo essere in grado di implementare un servizio simile in C++ che aggiornerà la posizione del nostro
‫giocatore per tutto il tempo e aggiornerà la nostra ultima posizione del giocatore nota mentre stiamo inseguendo.
‫Quindi lo faremo come due servizi separati.
‫E puoi vedere come questo serva anche automaticamente in quanto può rendere le cose un po'
‫più efficienti rispetto a farlo in tecnologia perché puoi eseguire l'ultima posizione di gioco nota solo quando ti trovi nella parte giusta dell'albero
‫del comportamento.
‫Quindi torniamo al browser dei contenuti Sandbox.
‫Aggiungi una nuova nuova classe C++, mostra tutte le classi e cerca quali sono le nostre opzioni qui.
‫Stiamo cercando un servizio migliore.
‫E poi ci sono un paio di opzioni, proprio come avevamo con B. T. Compito.
‫Abbiamo la Blackboard Base e in realtà vorremo la Blackboard Base perché
‫vogliamo sapere quale chiave dovremmo aggiornare.
‫Ad esempio, dovrebbe essere la posizione del giocatore?
‫Dovrebbe essere l'ultima posizione conosciuta del giocatore?
‫Quindi andremo a fare clic su questo con la Blackboard Base, lo selezioneremo
‫e chiameremo questo servizio beta, sottolineeremo la posizione del giocatore in questo modo e andremo a come creare quella classe.
‫Quindi, una volta terminata la compilazione, andremo nel codice di Visual Studio e puoi vedere che abbiamo
‫questa posizione del lettore di servizi BT che eredita dal Service Blackwood Base Court.
‫Questo è ciò che vogliamo ora.
‫Quale funzionalità sposteremo in questo?
‫Bene, cercherò di spostare la funzionalità più semplice possibile, che è solo quella di impostare il
‫valore dell'ultima posizione conosciuta del giocatore.
‫Anche se questa chiave sarà configurata nell'albero del comportamento, non qui in un testo normale, ma otterrà la posizione
‫del giocatore e la imposterà su una chiave della lavagna.
‫E non farà nessuna delle ragioni del controllo della linea di vista se lo stiamo eseguendo nel nostro albero del
‫comportamento, solo quando stiamo inseguendo che non abbiamo bisogno del controllo della linea di vista.
‫Possiamo vedere il giocatore che è automaticamente sappiamo che è il caso.
‫Quindi un'altra semplificazione per farlo in un servizio.
‫Quindi questo dovrebbe essere abbastanza semplice se sappiamo come ottenere una chiamata al metodo qui nel servizio BT.
‫Quindi andiamo a dare un'occhiata a BT Service Dot per vedere cosa è disponibile lì.
‫Qual è la documentazione, cosa possiamo fare?
‫I metodi principali che puoi vedere qui sono sul diventare rilevanti su C rilevanti il nodo tick e all'inizio della
‫ricerca.
‫All'inizio della ricerca.
‫Non ci interessa particolarmente ma prendi nota.
‫Sì, è qui che riceveremo aggiornamenti ogni volta che questo servizio è su un percorso attivo.
‫Quindi è quello che vorremo implementare.
‫Andiamo a cercare in questo file per trovare la firma completa.
‫Qui possiamo vedere è qui.
‫Vediamo in che sezione si trova.
‫È nella sezione protetta.
‫Quindi andremo a battere il servizio che abbiamo creato e creeremo una sezione protetta.
‫E incolla, è automaticamente un override qui perché BT Service lo stava ereditando da una classe padre, ma
‫non è dannoso sovrascriverlo di nuovo noi stessi.
‫Possiamo fare un control shift P per creare l'implementazione e poi vogliamo chiamare a super.
‫Quindi vogliamo un nodo super tick e vogliamo passare il nostro comp e la nostra memoria del nodo.
‫E vediamo, ci sono altre cose qui dentro.
‫Abbiamo anche un Delta secondi.
‫Questo è ciò che dobbiamo rinunciare anche noi.
‫E infine finire con questo punto e virgola dovrebbe svanire dall'implementazione del nodo tick.
‫Ora qui in pratica vogliamo fare quel comportamento dal controller aereo.
‫CP, quello in cui otteniamo il componente lavagna, quindi impostando un valore come vettore.
‫Bene, sappiamo come ottenere i componenti della lavagna dai riferimenti dei componenti del proprietario.
‫Quindi è abbastanza semplice.
‫Faremo solo il punto di comp del proprietario e poi faremo i componenti di get blackboard ricordando che
‫abbiamo bisogno di includere hash qui per il componente blackboard con barra in avanti dell'albero del comportamento.
‫Quindi possiamo usare il nostro operatore freccia.
‫E quello che dovremmo essere in grado di fare qui è solo impostare il valore come vettore e che abbiamo bisogno di una chiave.
‫Bene, sappiamo come affrontarlo, ma rinfreschiamoci la memoria.
‫Se andiamo al nostro servizio BT underscore Blackboard Base, puoi vedere come per l'attività, abbiamo
‫la chiave della lavagna selezionata.
‫Questo è quello che useremo.
‫Ottieni chiave lavagna selezionata ottiene la chiave che è stata selezionata nell'albero del comportamento.
‫E poi vogliamo il nostro valore vettoriale in cui otterremo esattamente lo stesso valore del controller dell'aria.
‫Prenderemo il pool di giocatori.
‫E prima di tutto, quassù in alto, dobbiamo verificare se questo è nullo o meno.
‫E dobbiamo anche includere quella statica di gioco.
‫Quindi assicuriamoci di avere il gioco.
‫Le statistiche includono dal controller aereo, mantieni inclusa nel nostro lettore una posizione del giocatore di servizio.
‫Quindi faremo e se il giocatore -- è uguale a puntatore nullo, allora vorremo fare di nuovo
‫tornare in anticipo qui restituisce void così possiamo semplicemente fare un rapido ritorno anticipato.
‫Quindi possiamo usare il nostro lettore -- qui per ottenere semplicemente la posizione dell'attore e potremmo aver bisogno di includerlo qui.
‫Vedremo come andremo.
‫Bene, non fa male essere al sicuro, lo fa, ed esplicito su queste cose.
‫Quindi faremo un'inclusione per il framework del gioco e poi la barra in avanti sarà -- punto H in modo da poter essere
‫sicuri di avere tutto in ordine qui e poi semplicemente imposteremo il valore come tornare a quello dovrebbe essere
‫tutto ciò di cui abbiamo bisogno.
‫Andiamo a compilare e vediamo se funziona.
‫In effetti, un'altra cosa.
‫Probabilmente vogliamo un bel nome carino, quindi dovremmo avere un costruttore qui.
‫Quindi creerò una sezione pubblica con il costruttore, che sarà il nome della classe,
‫e poi andremo avanti e creeremo quell'implementazione.
‫Porterò la mia implementazione al di sopra dell'implementazione per tick node e
‫quindi avremo impostato il nome del nodo uguale a quello dovrebbe essere la posizione del giocatore di aggiornamento e costruiamo e vediamo se funziona.
‫Sembra che mi mancasse un punto e virgola.
‫Proviamolo di nuovo.
‫Una volta che è stato compilato con successo, possiamo andare oltre il nostro nemico e oltre all'impostazione del
‫focus, voglio aggiungere un nuovo servizio che abbiamo mostrato qui come posizione del giocatore in cui il bel nome
‫viene praticamente visualizzato come posizione di gioco dell'aggiornamento .
‫Puoi vedere che vuole che ti dica la frequenza di spuntare ogni punto per 2. 6 secondi.
‫È meglio che usare tick perché sappiamo che tick esegue ogni fotogramma qui.
‫Questo è in esecuzione meno frequentemente, il che è una buona cosa.
‫E possiamo entrare nei dettagli e creare un tasto lavagna, scorrere verso il basso e selezionare che
‫vogliamo aggiornare non solo come posizione di gioco, ma anche come ultima posizione nota del giocatore, perché accadrà ogni
‫fotogramma finché stiamo inseguendo e quello è il comportamento che vogliamo.
‫Quindi un altro nodo di servizio che vogliamo andare avanti e creare farà il comportamento dei controller.
‫Scenderemo a prendere e vedere cosa resta.
‫Per noi da fare qui è aggiornare la posizione del giocatore a condizione che abbiamo la linea di vista.
‫Quindi vogliamo che aggiorni la posizione di gioco.
‫Se abbiamo linee come cancellare la posizione se non lo facciamo.
‫Quindi sarà un nuovo servizio.
‫Nota che è un comportamento leggermente diverso.
‫Aggiungeremo una nuova, nuova classe C++.
‫Andremo a mostrare tutte le classi.
‫E ancora, sottolineeremo il servizio Blackboard Base come nostra classe base e
‫la chiameremo B. T. Servizio di sottolineatura.
‫Posizione del giocatore se vista.
‫E vai avanti e crea quella classe.
‫E poiché queste sono tutte cose che hai visto principalmente prima, sarà la tua sfida implementare
‫questo servizio.
‫Quindi implementerai tic node usando il codice nel controller aereo.
‫Come guida, dovrai procurarti il puntatore del controller aereo dall'interno del servizio BT.
‫Ora questo è esattamente lo stesso che abbiamo fatto nelle attività beat, quindi usalo come guida per ottenere
‫quel puntatore del controller.
‫Avrai bisogno del puntatore del controller dell'aria per verificare la linea di vista.
‫Ricorda, la linea di vista è un metodo sul controller aereo e quindi è necessario aggiornare o
‫cancellare la chiave a seconda del controllo della linea di vista e quindi posizionare questo nodo nell'albero del comportamento.
‫Dove pensi che sarà il livello corretto dell'albero del comportamento per l'esecuzione di questo servizio?
‫Pensaci un po' e fai un po' di grattamento al mento, pausa, video e prova.
‫Bene.
‫Ben tornato.
‫Quindi questo ha aperto un nuovo servizio di barbabietola nel codice di Visual Studio.
‫Ora sarà praticamente identico nell'intestazione.
‫Quindi andrò avanti e lo copierò in un'intestazione appena generata.
‫L'eccezione è che dobbiamo cambiare il nome del costruttore in modo che corrisponda.
‫Ora creeremo un'implementazione per il costruttore e gli daremo un nome di nodo per aggiornare la posizione
‫del giocatore se viene visualizzata.
‫E aggiungi un punto e virgola.
‫La fine qui.
‫Non dimentichiamolo questa volta.
‫Quindi di nuovo nel C++.
‫Sto implementando anche tick node.
‫E copierò solo se riusciamo a trovare la posizione del giocatore CP E copierò semplicemente la chiamata
‫a super e l'ottenimento del pedone del giocatore e il controllo del ritorno nullo.
‫In effetti, copierò l'intero corpo e lo modificheremo da lì.
‫Quindi, copiando tutto ciò, copieremo anche l'accesso al componente lavagna con l'inclusione per il componente lavagna,
‫le statistiche di gioco e il pedone, perché abbiamo bisogno dell'accesso a tutti
‫questi.
‫In effetti, gran parte della funzionalità è condivisa qui.
‫Potresti pensare di farli condividere in qualche modo questo codice, ma penso che non ci siano così tante duplicazioni
‫che ci interessano abbastanza.
‫Quindi quello che dovremo fare qui è anche controllare di avere un controller aereo.
‫Quindi farò un se il proprietario dei componenti del proprietario comp fa il punto ottiene un proprietario è uguale a puntatore nullo, allora vorremo
‫andare avanti e tornare in questa fase.
‫Quindi la prossima cosa che vorremo fare è controllare la nostra visibilità.
‫Quindi faremo un se il punto di comp del proprietario ottiene il proprietario dell'aria e quindi faremo una freccia qui
‫e dobbiamo includere un controller qui.
‫Quindi sarà l'hash include.
‫E sarà il controllore.
‫Quindi allora vogliamo fare la linea e vedere qual è l'uso corretto qui se andiamo al controller dell'aria.
‫CP La linea di vista due è ciò che vogliamo, quindi la linea di vista fino ad allora dobbiamo fare la linea di vista per
‫il gioco.
‫Una pedina in questo caso.
‫Abbiamo una linea di visuale sul pedone del giocatore?
‫È quello che stiamo facendo nel CPA?
‫Ricontrolliamolo.
‫Sì.
‫Quindi vorremo andare avanti e impostare i valori in modo diverso.
‫Quindi stiamo impostando il valore del vettore sulla posizione dell'attore di cattura del pedone del giocatore.
‫Sì, se abbiamo un'altra linea di visuale.
‫Se non abbiamo linea di vista, sappiamo che dobbiamo cancellare quel valore.
‫Quindi avremo ancora il componente proprietario, otterremo il componente lavagna.
‫Quindi sarà un valore chiaro e cancelleremo ancora il valore della chiave
‫della lavagna selezionata, e questo dovrebbe praticamente coprirci per l'implementazione della posizione del giocatore.
‫Se visto, andiamo a compilare e vediamo se funziona bene.
‫La compilazione è riuscita.
‫Entriamo nell'albero del comportamento.
‫Ora il livello che voglio che questo esegua è fondamentalmente al livello più alto nel selettore iniziale, perché voglio che aggiorni
‫la posizione del giocatore praticamente tutto il tempo perché dobbiamo essere in grado di interrompere uno qualsiasi di
‫questi altri comportamenti in base al giocatore posizione impostata.
‫Quindi dobbiamo essere in grado di impostare un disinserimento in qualsiasi momento.
‫Quindi andrò a fare clic con il pulsante destro del mouse sul selettore di livello superiore e sul servizio nella posizione di gioco, se visto.
‫E poi selezioneremo quel nodo di servizio e selezioneremo la sua chiave della lavagna, che sarà la
‫nostra posizione di gioco.
‫In modo che uno impostato nella posizione di gioco, la posizione del giocatore di aggiornamento, quello più stupido stia
‫aggiornando l'ultima posizione del giocatore conosciuta.
‫E ora dovremmo essere in grado di passare al nostro controller aereo ed essenzialmente rimuovere tutto questo
‫codice nella tecnologia perché è stato invece sostituito dai nostri servizi.
‫E possiamo andare avanti e compilare e vedere se funziona.
‫Andiamo all'editor e giochiamo e vediamo se abbiamo ancora il nostro nemico che si avvicina a noi.
‫Viene di corsa da noi, perde di vista, poi torna verso di noi, inizia a sparare.
‫Sì.
‫Fondamentalmente tutto funziona come prima, tranne che ora lo sta facendo interamente tramite servizi che abbiamo
‫scritto per noi stessi in C++.
‫Nella prossima lezione, correggeremo quel fastidioso bug in cui l'IA continua a sparare e
‫alla fine riesce a uccidersi.
‫Lo vedrò.