‫Hallo en welkom terug.
‫Nu bewegen we onze tank naar voren en naar achteren, maar we hebben geen manier om de tank daadwerkelijk te sturen.
‫Dus in deze video gaan we werken aan het daadwerkelijk draaien van de tank met behulp van iets dat lokale rotatie wordt genoemd.
‫Dit is de roterende analoog om de lokale offset van de actor toe te voegen.
‫Voeg nu actor lokale offset toe had meerdere invoerparameters en we hebben alleen de eerste doorgegeven omdat de
‫andere drie optioneel waren.
‫Maar een van die andere drie had te maken met vegen.
‫En we gaan een beetje praten over vegen voordat we doorgaan met het implementeren van rotatie.
‫Dus ik ben terug in de documentatie voor ADD Actor Local Offset.
‫Laten we dus nog eens naar deze invoerparameters kijken.
‫De tweede heet B Sweep en is een Boolean.
‫Als we nu een beetje meer naar beneden scrollen en de informatie hier lezen voor B-sweep,
‫staat er Of we naar de bestemmingslocatie vegen, overlappingen veroorzakend onderweg en stoppen voor het doel als
‫iets wordt geblokkeerd.
‫Het gaat ook verder met te zeggen dat alleen de rootcomponent wordt geveegd en gecontroleerd op het blokkeren van botsingen.
‫Onderliggende onderdelen bewegen zonder te vegen.
‫Als de botsing is uitgeschakeld, heeft dit geen effect.
‫Dus laten we het hebben over wat dit nu betekent in het programmeren van games, sweeping is een techniek die door de engine
‫wordt gedaan, zolang sweeping is ingeschakeld.
‫Als we een bewegend object hebben, zoals een bol die wordt weergegeven door deze cirkel, en elk frame terwijl
‫deze bol beweegt, voert de motor sweep-controles uit.
‫Dit betekent dat het controleert of die beweging voor dit specifieke frame zou hebben geleid tot een overlap
‫tussen twee objecten.
‫Dus ik heb dit blok hier weergegeven door deze rechthoek.
‫Laten we nu eens bedenken dat dit de enige twee objecten ter wereld zijn.
‫Dus terwijl vegen is ingeschakeld terwijl de bol naar het object toe beweegt, controleert de engine
‫of deze twee objecten elkaar overlappen.
‫Nu, terwijl de bol blijft bewegen, laten we zeggen dat tijdens een van deze frames de bol zo zou
‫zijn bewogen dat hij het andere object overlapt.
‫Wat vegen nu doet, is dat de engine deze overlap detecteert en die bol terugbeweegt voor
‫dat specifieke frame, zodat het nooit echt het object binnendringt.
‫Nu zien we de bol nooit echt het object binnendringen.
‫De motor vangt die overlap op voordat de beweging daadwerkelijk wordt uitgevoerd.
‫Dus het resultaat is dat we zien dat de bol net stopt met overlappen.
‫Dus als deze rechthoek bijvoorbeeld een muur zou zijn, zou de bol stoppen aan het oppervlak van de muur.
‫Dat is wat vegen voor ons bereikt.
‫Nu zegt de documentatie dat als de botsing is uitgeschakeld, dit geen effect heeft.
‫Dus moet de botsing zijn ingeschakeld om het vegen te laten werken.
‫Dus hier in tanks CP in de verplaatsingsfunctie, hier is onze oproep om de lokale offset van de actor toe te
‫voegen en als we willen, kunnen we hier een andere invoerparameter doorgeven, de tweede is de sweep-boolean, zodat we hier
‫waar kunnen doorgeven.
‫Dus laten we dit compileren en het effect zien van het inschakelen van sweeping.
‫Als we nu op play drukken en we proberen bijvoorbeeld door een muur te gaan, zullen we zien dat we dwars door de
‫muur gaan.
‫Er gaat hier dus iets niet helemaal goed.
‫Laten we nu eens kijken naar wat die routecomponent voor de BP-vijvertank is.
‫Bedenk dat we de capsulecomponent voor de route hebben gebruikt.
‫Dus met capsulecomponenten geselecteerd in BP vijvertank.
‫Laten we naar het detailpaneel gaan en naar beneden scrollen en we zullen hier een sectie zien met de naam Botsing.
‫En hier zien we Collision Presets en het heeft een vervolgkeuzelijst.
‫Laten we dat dus uitbreiden.
‫Nu kunnen Botsingsvoorinstellingen worden ingesteld op een willekeurig aantal opties en standaard zien we overlap allemaal dynamisch.
‫Nu, afhankelijk van de versie van Unreal Engine die u gebruikt.
‫Mogelijk ziet u hier iets anders, maar we kunnen dit veranderen.
‫Als we de vervolgkeuzelijst selecteren en alle dynamische blokkeren kiezen, veranderen de onderstaande grijze opties.
‫Onthoud dat we allemaal dynamisch overlappen en hier zien we drie kolommen met selectievakjes.
‫Dit zijn botsingsreacties en de kolom aan de linkerkant toont een lijst met botsingsobjecttypen.
‫Dus elk gegeven onderdeel heeft zijn eigen type botsingsobject.
‫Merk op dat we het objecttype voor de capsule kunnen zien die is ingesteld op werelddynamiek.
‫En wanneer we de voorinstellingen voor botsingen wijzigen om alle dynamische te blokkeren, ziet u
‫dat de botsingsreacties allemaal zijn aangevinkt om te blokkeren in reactie op alle andere typen botsingsobjecten.
‫Dus laten we op play drukken en kijken wat er gebeurt als we dingen proberen te passeren.
‫Je zult zien dat we net stoppen met overlappen met.
‫De andere vijvers.
‫Nu, als ik de tank verplaats zodat we kunnen proberen de muur te overlappen en rond de andere vijvers te
‫gaan.
‫Als ik nu op play druk, blokkeer ik ook de muur.
‫Dus dit voorinstellingsblok voor botsingen, alle dynamisch stelt de botsingsreactie in om alle andere objecttypen te blokkeren.
‫En u kunt altijd het type botsingsobject van een bepaald onderdeel zien door het te selecteren in
‫het onderdelenpaneel en omlaag te scrollen naar het botsingsgedeelte in het detailvenster en de vervolgkeuzelijst voor Botsingsvoorinstellingen
‫te openen.
‫Ik heb het basisnet geselecteerd en het objecttype is werelddynamisch en het is ingesteld om alles te blokkeren.
‫Dus nu zien we dat vegen werkt, omdat we onze voorinstellingen voor botsingen hebben ingesteld voor de capsule-comp om alle
‫dynamiek te blokkeren.
‫En we zagen in de documentatie dat alleen de rootcomponent wordt geveegd en gecontroleerd op blokkerende botsingen.
‫Het maakt dus niet echt uit waar de andere componenten op zijn ingesteld.
‫We controleren alleen of de rootcomponent iets blokkeert.
‫Een probleem dat sommige studenten heeft doen struikelen, is dat ze niet kunnen bewegen zodra ze de capsule hebben
‫ingesteld om alle dynamiek te blokkeren.
‫Een reden hiervoor kan zijn dat uw capsule de vloer overlapt.
‫Als de capsule de vloer overlapt, kun je niet bewegen omdat de
‫motor je tank niet laat bewegen als het capsuleonderdeel overlapt met iets dat het moet blokkeren.
‫Dus een gemakkelijke oplossing hiervoor zou zijn om ervoor te zorgen dat uw capsule niet overlapt met de vloer.
‫Nu kun je in je BP-tank gaan en ervoor zorgen dat je capsule hier net boven de wielen is.
‫Ik ga naar de orthografische weergave.
‫En selecteer mijn basisgaas en breng het gewoon naar beneden.
‫De wielen zitten dus net onder het capsuleonderdeel.
‫Dus als je mesh nu net op de grond ligt en de capsule net boven de mesh.
‫Je moet je kunnen verplaatsen.
‫Dus ik ga op play drukken en daar gaan we.
‫Dus nu we uit de weg zijn geruimd, is het tijd om rotatie te implementeren.
‫Laten we teruggaan naar onze projectinstellingen.
‫Dus we gaan de projectinstellingen bewerken, scrollen naar beneden naar invoer en in het invoergedeelte hebben we onze astoewijzingen.
‫Nu hebben we al gezorgd.
‫Ga vooruit.
‫Het is tijd om te zorgen voor de volgende genaamd Turn en Turn heeft D en A toegewezen, waarbij D een schaal van
‫één heeft en A een schaal van min één heeft.
‫We willen de D en AX gebruiken om de tank te draaien.
‫Dus om een functie te binden aan de toewijzing van de draaias, hebben we een functie nodig om te binden.
‫Dus we zijn terug in de code van V en ik ga naar het tankbestand zodat we een functie kunnen maken om te
‫binden aan die draaiastoewijzing.
‫Nu ga ik deze leegte-functie gewoon turn noemen en net als verplaatsen.
‫Het heeft een float-invoerparameter nodig en we noemen deze waarde.
‫Dus we hebben deze functie gedeclareerd, laten we het definiëren en CP tanken en ik ga het net onder
‫de verplaatsingsfunctie plaatsen.
‫Dus ik heb het een functielichaam gegeven en ik heb de klassenaam nodig samen met de dubbele dubbele punten net voor
‫de functienaam.
‫Nu hebben we een goede functie.
‫Dit is niet het enige wat we moeten doen.
‫We moeten ervoor zorgen dat deze functie is gebonden aan de astoewijzing die draai wordt genoemd.
‫We doen dat in de spelerinvoercomponent en we doen het net zoals we deden bij het in kaart brengen van de voorwaartse as.
‫Dus we gaan zeggen spelerinvoercomponent, we gaan de pijloperator gebruiken en de as binden.
‫Nu wordt de eerste parameter de naam van de astoewijzing, verpakt in een tekstmacro.
‫Dus we gaan omdraaien zeggen, want dat was de naam van de astoewijzing.
‫Het volgende is het object waarvoor we de functie binden.
‫We kunnen dit doorgeven en uiteindelijk geven we de functie door die we opnieuw willen binden.
‫We hebben het adres van de machinist nodig en het wordt een tankbeurt.
‫Zo makkelijk is het dus.
‫We hebben de draaifunctie gebonden aan de draaiastoewijzing.
‫Het enige dat overblijft is om daadwerkelijk iets te doen in de turn-functie.
‫Nu hebben we gezien dat we lokale ADD actor-offset hebben, maar er is een rotatie-analoog aan deze functie
‫en het heet ADD Actor lokale rotatie.
‫Wat dit doet, is een lokale rotatie aan de actor toevoegen, zoals de naam al doet vermoeden, en je zult zien dat er
‫twee verschillende versies van de functie zijn, een die een F-rotator nodig heeft en een die iets dat een F-quad
‫wordt genoemd, neemt.
‫We gaan de versie gebruiken die een F-rotator nodig heeft.
‫Het heet Delta-rotatie.
‫En net als ADD Actor Local Offset, kan het ook een sweep-parameter en dezelfde andere twee invoerparameters
‫gebruiken als lokale actor-offset toevoegen.
‫En deze laatste drie invoerparameters zijn optioneel, net als lokale offset van actoren toevoegen.
‫Dus in plaats van een F-vector, gaan we een F-rotator passeren.
‫Nu terug hier in de draaifunctie, als we een F-rotator maken en we noemen dit Delta-rotatie, we zullen zien dat als
‫we met de rechtermuisknop op F rotator klikken en naar definitie gaan, we naar de rotator gaan en we zullen
‫drie zien openbare lidvariabelen hier van het type float.
‫Net zoals de F-vector F-rotator deze drie componenten alleen heeft in plaats van X, Y en Z, hebben we
‫pitch yaw en roll.
‫Gieren is het onderdeel waarin we geïnteresseerd zijn.
‫Er staat rotatie rond de opwaartse as tussen haakjes rond de Z-as.
‫En dat is het enige type rotatie dat we belangrijk vinden om rond de Z-as te roteren.
‫Zo kunnen we onze tank sturen.
‫Nu ga ik je erop wijzen dat er ook meerdere constructors zijn voor de F-rotator, en dat
‫de standaard opnieuw zegt dat er geen initialisatie is, net als bij de F-vector.
‫Dus we kunnen degene gebruiken die een enkele float nodig heeft en alle componenten zullen worden geïnitialiseerd naar
‫die float-waarde.
‫Er is er een met drie float-waarden en je kunt een kijkje nemen en enkele van de anderen zien.
‫Nu wil ik er ook op wijzen dat er een nulrotator is en trouwens, dit is een statische nulrotator.
‫Daarom kunnen we teruggaan naar tank CP en iets zeggen als is gelijk aan F rotator nul rotator nul rotator is een statische
‫lidvariabele en u kunt toegang krijgen tot statische lidfuncties en variabelen zoals deze door de klassenaam op te
‫geven met de scope-resolutie-operator en te verwijzen naar die statische variabele of functie op
‫naam.
‫Dat is wat we hier met jou doen.
‫Gameplay-statistieken krijgen werelddelta-seconden is een statische.
‫Function, wat betekent dat we geen echte instantie van de game-gameplay-statica-klasse nodig hebben om toegang
‫te krijgen tot die statische functie.
‫Het bestaat gewoon al.
‫Hetzelfde met nulrotator en nulvector.
‫Dus ik ga rotator h afsluiten en we hebben deze delta-rotatie en het is geïnitialiseerd op een
‫nul-rotator.
‫Nu worden je toonhoogte en rol op nul gezet, net zoals X, Y en Z op nul worden gezet voor de F-vector.
‫Dus we zullen je component moeten veranderen.
‫Dus net zoals ik deed met onze delta-locatie in de MOV-functie, laten we wat pseudocode maken voor
‫delta-rotaties.
‫Ja, we willen natuurlijk dat jullie allemaal worden ingesteld op waarde geschaald door Delta-tijd, omdat we willen dat deze draaiing
‫onafhankelijk is van de framesnelheid, maar we hebben ook een soort draaisnelheid nodig die we deze draaisnelheid
‫kunnen noemen.
‫Dus als we dat eenmaal hebben ingesteld, ja, dan kunnen we die lokale rotatie toevoegen die de acteur volgens
‫de F-rotator elk frame gaat roteren en dat je op waarde wordt geschaald.
‫Dus het is nul als we geen toetsen indrukken en het heeft een waarde als we op de DX en de
‫bijl drukken.
‫Dus nu heb je een uitdaging.
‫Dit gaat net zo werken als het toevoegen van de lokale actor-offset.
‫Het enige verschil is dat we de acteur nu rouleren.
‫Dus omdat we een soort draaisnelheid nodig hebben om de acteur te roteren, ga je een draaisnelheidsvariabele
‫maken, dit een float maken en deze in het privégedeelte direct naast de snelheidsvariabele plaatsen.
‫Geef deze variabele weer met uw eigenschap en kies de juiste nieuwe eigenschapspecificaties.
‫Nu ga je in de draaifunctie in het bijzonder Delta-rotatie instellen, we geven om je component,
‫stel de waarde in op waarde maal onze draaisnelheidsvariabele en vermenigvuldig ook met delta-tijd en dan ben je klaar om lokale
‫actor toe te voegen rotatie die nu in deze f rotator passeert voor de tweede parameter, ga je
‫gang en passeer waar voor de B-sweep-invoer, omdat we wel willen vegen tijdens het roteren, de video pauzeren en nu
‫rotatie voor de tank implementeren.
‫Oké.
‫Dit wordt dus vrij eenvoudig.
‫We hebben alleen een draaisnelheidsvariabele nodig.
‫Nu ga ik net onder de snelheid in de tank gaan en een vlotterdraaisnelheid creëren.
‫Nu initialiseer je dit waarschijnlijk naar een bepaalde waarde en dat is oké.
‫Als het anders is dan wat ik kies, ga ik voor 45 F en kijk hoe dat werkt.
‫Maar we gaan dit blootstellen aan blauwdrukken, zodat we het kunnen veranderen terwijl we aan het ontwikkelen zijn.
‫Nu wil ik dat het overal kan worden bewerkt en ik ga het in dezelfde categorie beweging plaatsen als snelheid.
‫Dus ik ga je gang en stel dit je eigendom en plak het hier hierboven, sla rechtsaf, zodat het ergens
‫kan worden geplaatst.
‫Categorie beweging nu en tank CP.
‫Ik ben klaar om het ja voor Delta-rotatie in te stellen.
‫Dus we gaan Delta-rotatie zeggen.
‫Ja.
‫En we gaan het gelijk stellen aan waardetijden, draaisnelheidstijden, deltatijd.
‫En natuurlijk kunnen we Delta-tijd krijgen met U-gameplay-statistieken, wereld-delta-seconden hierin laten passeren
‫als het wereldcontext-object.
‫Dus die ga ik daar plakken.
‫Nu weet ik dat mijn pseudocode niet precies overeenkomt.
‫Het staat in de verkeerde volgorde.
‫Delta-tijd is hier in het midden.
‫Het maakt niet uit, want als je drie waarden met elkaar vermenigvuldigt, kun je ze in willekeurige volgorde vermenigvuldigen
‫en toch hetzelfde resultaat krijgen.
‫Dus voor het geval je je dat afvroeg, de wiskunde zal nog steeds hetzelfde zijn als je deze drie
‫waarden in een andere volgorde vermenigvuldigt.
‫Maak je daar dus niet al te veel zorgen over.
‫Nu hebben we deltarotatie.
‫Het enige wat je nog hoeft te doen is om lokale rotatie toe te voegen, en we passeren in Delta-rotatie en voor de tweede
‫invoer gaan we waar doorgeven om vegen mogelijk te maken tijdens het roteren.
‫Dus laten we dit compileren.
‫Oké, we zijn nu samengesteld.
‫In een aantal van de volgende video's zult u misschien opmerken dat de nulvector en de nulrotator in deze lijnen
‫ontbreken.
‫Dat komt omdat ik begon met deze geïnitialiseerd en later besefte dat deze waarschijnlijk op
‫zijn minst met nulwaarden moeten worden geïnitialiseerd.
‫Dus maak je geen zorgen als je deze lijnen er later zo uitziet als ze zijn geïnitialiseerd, bewaar je nulvector en je
‫nulrotator en je zult zien dat ik dit in een nabije toekomstige video kan zien.
‫Dus maak je geen zorgen.
‫Als u deze initialisatie-items niet ziet, zouden ze daar moeten zijn.
‫En we zijn weer terug in de editor.
‫Laten we op play drukken en ik ga de D-toets gebruiken en we draaien en de A-toets draait me de andere kant op
‫en we kunnen ook vooruit en achteruit gaan.
‫Dus nu we kunnen roteren en vooruit kunnen gaan, hebben we de mogelijkheid om over de hele wereld te bewegen.
‫Dit is een geweldige mijlpaal.
‫Nu beweeg ik vrij langzaam, maar dat is oké, want ik kan mijn tank selecteren en
‫ik kan zoeken naar de bewegingscategorie en de draaisnelheid wijzigen in iets hogers, zoals 90.
‫Dus laten we doorgaan en op play drukken.
‫En dat is een stuk sneller.
‫Als je denkt dat dit nog steeds een beetje traag is.
‫Deze kun je natuurlijk aanpassen.
‫Dus ik ga de -- tank opnieuw selecteren.
‫En in plaats van 400, laten we er 800 van maken.
‫Waarom niet?
‫Laten we in plaats van 90 zeggen 120.
‫Als ik nu op play druk, ben ik een stuk sneller.
‫Dus dit ziet er echt heel goed uit.
‫Dus terugkijkend op het sectieplan, hebben we nu een tank die over de hele wereld kan bewegen.
‫Dat eerste opsommingsteken is zeker afgevinkt en we behandelen WASD-beweging.
‫We zijn nog niet bezig met muisinvoer, maar daar komen we op terug.
‫Maar we zijn een stap dichter bij het voltooien van dit spel.
‫Samenvattend hebben we dus geleerd wat vegen is en hoe we dat kunnen inschakelen zodat onze objecten elkaar
‫niet passeren.
‫We hebben een actor lokale rotatie toegevoegd en we hebben dit gedaan door een draaisnelheid te implementeren die we in de details konden
‫aanpassen.
‫Paneel in de editor om de ontwikkeling een beetje gemakkelijker te maken.
‫Goed werk.
‫We verplaatsen de tank nu over de hele wereld.
‫Ik zie je in de volgende video.