‫Hallo en welkom terug.
‫Nu zijn we klaar om gebruikersinvoer te gaan verwerken.
‫Dat betekent dat we de toetsenbordtoetsen willen indrukken en de muis willen bewegen en met de muis willen klikken om onze tank
‫op die invoer te zien reageren.
‫Om dat te doen, moeten we eerst die invoer daadwerkelijk krijgen en dat gaan we eerst
‫doen met behulp van astoewijzingen.
‫Laten we het hier dus over hebben.
‫Laten we nu hier in het project naar de instellingen voor bewerken en projecteren gaan.
‫En als we naar beneden scrollen en input selecteren, dan zien we hier onze bindingen.
‫En onder bindingen zijn er actietoewijzingen en astoewijzingen.
‫We gaan eerst in op assentoewijzingen.
‫Nu heb je misschien wat ervaring hiermee, maar we gaan wat dieper in op wat
‫deze doen en hoe ze werken.
‫We hebben er dus drie.
‫En als ik op de vervolgkeuzepijl klik, zie ik hier W en SW en deze hebben het over de W-
‫en SW-toetsen op het toetsenbord.
‫Deze zijn toegewezen aan deze specifieke astoewijzing, die Move Forward wordt genoemd.
‫Laten we dus bespreken hoe deze assentoewijzing werkt.
‫Dus we zagen in The Unreal Editor dat we deze as-mapping genaamd Move Forward hebben en dat de
‫W en SCS zijn toegewezen aan deze as-mapping.
‫Dus wat betekent dit precies?
‫Welnu, in Unreal Engine hebben we iets dat een asmapping wordt genoemd.
‫En axis mapping is iets dat elk frame van het spel verwerkt.
‫U wijst sleutels toe aan een astoewijzing.
‫In ons geval hebben we W en S toegewezen.
‫Kijk nu hier naast de W-toets.
‫In mijn kleine screenshot-voorbeeld aan de rechterkant staat schaal.
‫En naast schaal is er een nummer 1. 0.
‫En je hebt misschien gemerkt dat naast de SQ de schaal -1 is. 0.
‫Dit zijn dus waarden die van invloed zijn op die invoerinformatie.
‫Hier ziet u hoe een astoewijzing werkt.
‫Onze axis mapping move forward heeft de mogelijkheid om te worden geassocieerd met een functie in C++.
‫Als het nu gaat om Axis-toewijzingen, als we een functie associëren met een Axis-toewijzing, moet deze een invoerparameter van
‫het type float nemen, zodat we een functie op onze vijver met de naam MOVE kunnen maken die een float nodig
‫heeft.
‫We noemen deze invoerparameterwaarde gewoon.
‫Nu is er een manier om deze functie te gebruiken en te associëren met onze voorwaartse astoewijzing.
‫Er staat dat we de verplaatsingsfunctie binden aan de asmapping.
‫Dus elk frame van het invoersysteem van de game Unreal Engine gaat controleren of we op de
‫W-toets of de toets drukken.
‫En het gaat een aswaarde berekenen, afhankelijk van het al dan niet indrukken van die toetsen en elk
‫afzonderlijk frame.
‫Het gaat deze functie aanroepen die we zeker vooruit moeten gaan en die aswaarde doorgeven.
‫Wat er ook binnen die functie gebeurt, is aan ons als C++-ontwikkelaar.
‫Hier is hoe het werkt.
‫Als we niet op de W of de toetsen drukken, heeft deze aswaarde de waarde nul.
‫Dus de verplaatsingsfunctie die is gebonden aan de toewijzing van de voorwaartse as, wordt elk afzonderlijk frame genoemd
‫en de ingevoerde zwevende waarde is nul.
‫Laten we nu zeggen dat we op de W-toets drukken.
‫De W-toets heeft zijn schaal ingesteld op 1. 0.
‫Dit betekent dat onze aswaarde 1 wordt. 0 en dat wordt doorgegeven aan de MOV-functie.
‫Dus voor elk frame wordt de verplaatsingsfunctie aangeroepen met een waarde van 1. 0 kwam binnen.
‫Laten we nu zeggen dat we op de SRC drukken die een schaalwaarde van -1 heeft. 0.
‫Dit betekent dat voor elk frame de verplaatsingsfunctie wordt aangeroepen en -1. 0 wordt doorgegeven.
‫In het geval dat we zowel op W als S drukken, worden beide waarden bij elkaar opgeteld.
‫Dus we krijgen de 1. 0 door op de W-toets te drukken en we krijgen -1. 0 door op de SRC te drukken.
‫Nu heffen deze elkaar beide op.
‫Dus als we beide tegelijk indrukken, wordt de verplaatsingsfunctie aangeroepen waarbij nul wordt doorgegeven.
‫Dus afhankelijk van de toetsencombinatie die we indrukken, krijgen we een andere waarde doorgegeven aan
‫onze MOVE-functie en kunnen we met die waarde doen wat we willen, bijvoorbeeld om de pion te verplaatsen.
‫We zullen het snel genoeg hebben over het daadwerkelijk verplaatsen van de pion.
‫Laten we er nu gewoon aan werken om onszelf zo in te stellen dat we deze informatie uit
‫het Axis-kaartsysteem kunnen verwerken.
‫Oké, dus nu we weten hoe de Axis-mapping werkt, is het tijd om een callback-functie te
‫maken die we kunnen binden aan de vooruit-as-mapping.
‫Dus ik ga de projectinstellingen sluiten en teruggaan naar de VS-code.
‫Dus hier in VS-code willen we een functie maken die we kunnen binden aan de toewijzing van de voorwaartse as.
‫Dus hier in tank H kunnen we een privéfunctie creëren.
‫Nu gaat het hebben.
‫Het void return-type, en ik zou deze zet willen noemen.
‫Nu moet het een float-invoerparameter hebben en we gaan deze waarde noemen.
‫Dus laten we onze verplaatsingsfunctie nemen en deze hier in Tank definiëren.
‫CP Ik plak het hier net onder de constructor en we hebben een tank nodig met de scope-resolutie-operator
‫vóór de functienaam.
‫Dus we hebben deze verplaatsingsfunctie en we zijn klaar om deze te binden aan onze voorwaartse astoewijzing.
‫En dat wordt gedaan in een functie genaamd setup player input component.
‫Dat zou bekend moeten klinken.
‫Als we onze verkenner openen en teruggaan naar Base Pont H, kunnen we naar beneden scrollen en
‫in het openbare gedeelte de functie-instelling spelerinvoercomponent zien.
‫We zullen zien dat dit een overschrijving is van een overgeërfde virtuele functie.
‫Nu hoeft de basisspawn-klasse niet echt invoer in te stellen, en dat is wat deze functie is voor
‫het verwerken van invoer van een speler.
‫Nu hoeft onze basisbindingsklasse geen invoer te verwerken, maar onze tankklasse wel.
‫Dus wat we kunnen doen is deze functie uit basisvijver h halen, maar ik ga hem kopiëren omdat we hem in de
‫tank nodig hebben.
‫Dus als ik deze functie kopieer, ga ik naar Tank H en hier in het openbare gedeelte ga ik
‫het plakken.
‫En aangezien we het niet nodig hebben in de basisvijver, ga ik het gewoon uit de basisvijverklasse verwijderen.
‫En in feite ga ik naar de basisvijver CP en verwijder het hier ook.
‫Dus laten we doorgaan en de spelerinvoercomponent van de basisvijver verwijderen.
‫CP En nu zit hij niet meer in de basisvijverklasse.
‫Dus laten we doorgaan en onze wijzigingen opslaan en de basis Pond H en CP sluiten.
‫En nu hebben we een spelerinvoercomponent gedeclareerd in Tank H, maar we willen het ook definiëren en tanken.
‫CP Dus hier in Tank.
‫CP Ik ga de definitie net boven de verplaatsingsfunctie toevoegen.
‫Dit is dus ongeldig en het is een spelerinvoercomponent voor het opzetten van een tank.
‫Laten we nu teruggaan naar Tank H en kijken wat het invoerparametertype is.
‫U zult zien dat het hier tussen haakjes voorwaarts wordt gedeclareerd.
‫Dit is iets wat je kunt doen als je wilt forwarden, een klassetype declareren in een headerbestand.
‫Dus het wordt hier voorwaarts gedeclareerd en we hebben dit nodig. U voert het type componentaanwijzer in en de
‫parameter wordt spelerinvoercomponent genoemd.
‫Dus we hebben deze invoerparameter nodig in tank.
‫CP Dus tussen haakjes voor het instellen van de spelerinvoercomponent, hebben we een U-invoercomponent
‫die een aanwijzer is en die spelerinvoercomponent wordt genoemd.
‫Dus nu komt de functiehandtekening overeen met die in de functiedeclaratie.
‫Nu terug in het CP-bestand, laten we deze functie een functie-body geven en we overschrijven deze functie en het
‫is een goed idee om de super set-up player input component aan te roepen.
‫Omdat we nu de bovenliggende versie van de setup-spelerinvoercomponent aanroepen, moeten we een invoer doorgeven
‫van het type dat u invoercomponent.
‫We gaan hier de invoerparameter doorgeven aan deze functie.
‫Dus op deze manier zal de bovenliggende klasse zijn versie aanroepen.
‫Nu voert de basisvijvertank deze functie niet uit.
‫We hebben het zojuist verwijderd.
‫Maar de bovenliggende klasse om te baseren -- zal zijn versie aanroepen.
‫En wanneer je een virtuele functie als deze overschrijft, is het een goed idee om de superversie aan te roepen.
‫We missen dus geen enkele functionaliteit die in de bovenliggende versie is geïmplementeerd.
‫Dus waarom doen we dit?
‫Waar is de spelerinvoercomponent goed voor?
‫Welnu, een van de dingen waar het goed voor is, is het binden van functies om toegang te krijgen tot toewijzingen.
‫We willen onze verplaatsingsfunctie binden aan de toewijzing van de voorwaartse as.
‫En dat doen we hier.
‫We doen dat met behulp van deze invoerparameter speler invoercomponent.
‫Daar is dit object voor ontworpen.
‫We nemen de spelerinvoercomponent en op deze aanwijzer gebruiken we de pijloperator om toegang te krijgen tot een functie
‫die bind-as wordt genoemd.
‫Nu neemt Bind Axis een paar invoerparameters.
‫De eerste is een letterlijke tekenreeks, wat betekent dat we de tekstmacro gaan gebruiken.
‫Wat zetten we nu tussen de aanhalingstekens?
‫We zetten de naam van de astoewijzing.
‫We zagen in de editor dat deze assentoewijzing vooruit bewegen wordt genoemd.
‫Dus we kiezen die astoewijzing om te binden aan de tweede invoerparameter.
‫Dit wordt een pointer naar het object waar het binden van de functie hiervoor een pointer is naar
‫de instantie van de bepaalde klasse waar n en aangezien we in de tankklasse zitten, zal dit verwijzen naar de
‫instantie van de tankpion in de spel.
‫Nu is de derde parameter het adres van de functie die we binden.
‫We hebben dus een tankbeweging.
‫Heel belangrijk dat we volledig moeten.
‫Kwalificeer de functienaam met de naam van de klasse.
‫En hier voor de functienaam hebben we het adres van de operator nodig.
‫Nu, als je niet bekend bent met het doen van zoiets als dit, is dit gewoon het adres van een
‫functie nemen.
‫Functies kunnen adressen hebben, net zoals variabelen dat kunnen.
‫Dus het gebruik van het adres van de operator is een manier om functies door te geven aan andere functies.
‫Daarom hebben we dat adres van de operator nodig.
‫Dus we hebben onze functieaanroep om toegang te binden.
‫Nu merk je waarschijnlijk dat de IntelliSense-foutaanwijzer naar een onvolledig klassetype dat je invoercomponent niet
‫is toegestaan.
‫Nu weten we wat dit kan veroorzaken.
‫Ten eerste kan het betekenen dat we een headerbestand moeten opnemen.
‫Een andere mogelijkheid is dat het een valse fout is.
‫Je kunt er gemakkelijk achter komen door te compileren, dus laten we proberen te compileren.
‫We zullen zien dat we een succesvolle compilatie hebben.
‫We weten dus dat dit een valse fout is.
‫Maar nogmaals, als je wilt, kun je de opname toevoegen om die te verwijderen.
‫Dus het boeit je niet.
‫Nu weten we dat het klassetype waarover het klaagt, de invoercomponent is.
‫Dus hier is je input component in de documentatie en hier is de include.
‫En als we dit hier bovenaan het CP-bestand van de tank optellen, zijn we van die vervelende valse fout af.
‫En nogmaals, omdat deze de pragya-behoeften hebben, inclusief bewakers, weten we dat invoercomponenten niet meer dan één
‫keer zullen worden opgenomen en daar gaan de kronkels, ze zijn weg.
‫Dus nu weten we dat deze verplaatsingsfunctie elk frame zal worden genoemd en dat de waarde een bepaalde
‫float-waarde zal hebben, afhankelijk van of we op de W drukken of vragen.
‫Nu is het niet voldoende om te weten dat de verplaatsingsfunctie zeker vooruit zal gaan.
‫Als ontwikkelaars is het fijn om een soort bevestiging te hebben dat de dingen werken.
‫Dus wat ik zou willen dat je doet als je uitdaging, is om YUI log in de MOV-functie te gebruiken om de
‫waarde af te drukken die wordt doorgegeven aan move that float genaamd waarde.
‫Gebruik dus procent f in uiy log om de waarde van de float-waarde in het outputlog te loggen en speel dan het spel testen en druk op
‫die toetsen om te zien wat je in het log uitgeprint krijgt.
‫Pauzeer de video en voeg deze nu toe aan de verplaatsfunctie.
‫Oké.
‫Dus hier in de mov-functie ga ik een uii-log toevoegen.
‫En dit kan een log temp-waarschuwing zijn.
‫En voor de tekstmacro.
‫Ik ga gewoon waarde procent F en waarde zetten.
‫Dat is oké.
‫Als je een ander breedsprakigheid of waarschuwingstype hebt gebruikt, als je weet hoe je die dingen moet doen.
‫Dat is helemaal goed.
‫Ik ga hier gewoon een waarschuwing gebruiken en ik weet dat je dingen als procent se hebt gebruikt en je
‫log hebt opgemaakt met een tekenreekswaarde.
‫Percentage F, als u het niet weet, is hoe u uw UI-logboek kunt formatteren met een float-waarde.
‫Dus laten we dit compileren en terug in de editor, ik ga het output log openen en op play drukken en kijken
‫waar ik het output log spam met talloze berichten.
‫Nu ga ik in de viewport klikken en op de W-toets drukken.
‫Er is mijn waarde van een die ik ga vrijgeven.
‫Het is terug naar nul.
‫Ik ga op de toets drukken en het is negatief.
‫En als we beide tegelijk indrukken, krijgen we nul.
‫En dus is het precies zoals we hadden verwacht.
‫Perfect.
‫Oke.
‫Dus in deze video hebben we onze vijver opgezet om wat gebruikersinvoer te verwerken.
‫We hebben het gehad over toegangstoewijzingen en we hebben onze verplaatsingsfunctie gekoppeld aan de voorwaartse toegangstoewijzing.
‫Vervolgens hebben we die toegangswaarde afgedrukt met behulp van het YUI-logboek in onze MOVE-functie, maar we zouden eigenlijk onze tank willen verplaatsen in
‫plaats van alleen enkele waarden naar het uitvoerlogboek af te drukken.
‫Dus in de komende lezingen gaan we het zo opzetten dat we onze tank daadwerkelijk kunnen gaan verplaatsen.
‫Ik zie je snel.