‫Welkom terug.
‫In deze video gaan we het hebben over populaire evenementen.
‫We willen graag detecteren wanneer het projectiel iets raakt en op die manier kunnen we iets doen als
‫reactie, zoals het projectiel vernietigen.
‫En later zullen we omgaan met het doen van schade en het veroorzaken van explosie-effecten en dergelijke.
‫Dus laten we het nu even hebben over hitgebeurtenissen.
‫Ons projectiel heeft een gaascomponent.
‫Het type is je statische mesh-component en je statische mesh-component is een klasse in een lange hiërarchie van
‫klassen en het onwerkelijke motorsysteem, een van zijn ouders, is je primitieve component.
‫Hier is de documentatiepagina voor uw primitieve component.
‫Het zegt dat primitieve componenten componenten zijn die een soort geometrie bevatten of genereren die over het
‫algemeen moet worden weergegeven of gebruikt als botsingsgegevens.
‫Het zijn dus eigenlijk scènecomponenten met enkele toegevoegde functies.
‫En als je naar beneden scrolt en naar de hiërarchie kijkt, zul je zien dat je een component
‫hebt gezien en daarvan afgeleid, je primitieve component, en je kunt naar beneden blijven scrollen en alle andere klassen zien die
‫van jou afkomstig zijn.
‫Primitieve component.
‫De reden dat we dit aangeven, is omdat je statische mesh-component deze functies
‫erft van je primitieve component en je primitieve component de mogelijkheid heeft om hit-events te genereren.
‫Wat bedoelen we nu met het genereren van hitgebeurtenissen?
‫Laten we zeggen dat we een bepaalde geometrie in onze wereld hebben, weergegeven door de rechthoek aan
‫de rechterkant, en we hebben een object met een statische mesh-component weergegeven door de cirkel aan de linkerkant.
‫Als dit object met een statisch mesh-onderdeel naar het blok beweegt, en als dit onderdeel is ingesteld om
‫treffergebeurtenissen af te handelen, dan wordt het treffergebeurtenis gegenereerd bij een botsing zodra het dat
‫blok raakt.
‫Nu zal een hitgebeurtenis enkele gegevens genereren met betrekking tot die botsing, inclusief de component die werd
‫geraakt.
‫Dus dit blok hier kan een statische mesh-component hebben.
‫We hebben toegang tot dat onderdeel bij een botsing.
‫We hebben ook toegang tot de geraakte acteur en het hoofdgebeurtenis genereert ook een EF-trefferresultaat.
‫We hebben wat geleerd over het F-trefferresultaat en we weten dat het veel variabelen bevat over
‫de treffergebeurtenis, zoals de trefferlocatie, een F-vector die een locatie in de wereld vertegenwoordigt.
‫Dus we hebben ons projectielgaas.
‫Dit is een variabele van het type statische mesh-componentaanwijzer.
‫Wanneer deze statische mesh-component iets in de wereld raakt, willen we een code hebben
‫die daarop reageert.
‫Nu het een statische mesh-component is, erft het dingen van de primitieve componentklasse van u.
‫Een van de dingen die het erft, is een variabele die op componenthit wordt genoemd.
‫Hier is de documentatie voor een component hit.
‫Het wordt beschreven als een gebeurtenis genaamd When a Component Hits of wordt geraakt door iets solides.
‫Als we nu naar beneden scrollen, zien we dat een componenthit de type F componenthit-signatuur heeft.
‫En als we hierop klikken, zien we dat de hitsignatuur van de F-component een struct is.
‫Als we nu teruggaan, kunnen we zien dat de documentatie zegt dat er een gebeurtenis wordt genoemd wanneer een component iets
‫stevigs raakt of wordt geraakt.
‫Dit kan gebeuren door zaken als karakterbewegingen met behulp van een ingestelde locatie met sweep
‫ingeschakeld of physics-simulatie voor gebeurtenissen waarbij objecten elkaar overlappen, zoals tegen een trigger aanlopen, zie de overlapgebeurtenis.
‫Er zijn dus hit-events en er zijn overlap-events.
‫We houden ons bezig met hitgebeurtenissen.
‫We weten dus dat een componenthit in de documentatie wordt beschreven als een hitgebeurtenis en we weten
‫dat een componenthit een struct is van het type F componenthitsignatuur.
‫Tot zover goed.
‫Nu is deze hitgebeurtenis op componenthit ook iets dat we een multicast-afgevaardigde noemen.
‫Aan een multicast-gemachtigde kunnen meerdere functies zijn gekoppeld.
‫Er kunnen functies zijn die in meerdere klassen voorkomen.
‫En als die functies aan deze multicast-afgevaardigde worden gebonden, worden ze toegevoegd aan iets dat een
‫aanroeplijst wordt genoemd.
‫Dit is een lijst met functies die moeten worden aangeroepen wanneer deze hitgebeurtenis ze allemaal vertelt dat ze moeten worden aangeroepen.
‫We zeggen dat dit hitevenement of multicast-afgevaardigde uitzendt wanneer er iets gebeurt.
‫Dus in het geval dat ons projectielnet iets raakt, dan zal de afgevaardigde uitzenden naar alle klassen die een
‫functie hebben die aan deze afgevaardigde is gebonden.
‫Zodra die uitzending is verzonden, worden al deze gebonden functies aangeroepen als reactie op de
‫uitzending.
‫Dit is een zeer krachtige functie van Unreal Engine.
‫Het stelt ons in staat om dit een afgevaardigde te noemen, die wacht op een gebeurtenis zoals een botsing.
‫En dan.
‫En de afgevaardigde wordt uitgezonden, wat resulteert in alle gebonden functies die worden aangeroepen als reactie op de uitzending.
‫Aangezien er meerdere functies aan dit delicate kunnen worden gebonden, noemen we het multicast.
‫Het zendt uit naar meerdere klassen waaraan hun functies zijn gebonden.
‫Hoe binden we nu een functie aan deze afgevaardigde?
‫Wel, on component hit heeft een aantal functies waarmee we dit kunnen doen, waarvan er één 'add
‫dynamic' wordt genoemd.
‫Dus als we de dynamische functie ADD aanroepen, hoeven we alleen maar twee parameters door te geven aan het
‫gebruikersobject waarvoor we dit kunnen gebruiken, en de callback-functie, het adres van een functie in onze
‫klasse.
‫Dus zodra we dit openen op component hit delegate en de add dynamische functie aanroepen, kunnen we het
‫gebruikersobject en de callback doorgeven.
‫En dit zal resulteren in het toevoegen van die callback aan de aanroeplijst van hitgebeurtenissen.
‫Nu bij het raken van een component, zullen we deze gedelegeerde uitzenden, wat resulteert in alle functies die eraan gebonden zijn om te worden aangeroepen.
‫Dus om deze gedelegeerde te binden, moeten we een callback-functie maken.
‫Dus hier is een projectiel en we willen graag een callback-functie voor de hitgebeurtenis.
‫Dus laten we hier een privé-functie maken en het zal nietig zijn.
‫En ik ga dit gewoon een hit noemen.
‫We kunnen dit alles noemen wat we willen, maar het lijkt beschrijvend genoeg.
‫Nu moet deze callback-functie de juiste handtekening hebben voor hitgebeurtenissen, wat betekent dat de
‫lijst met invoerparameters zeer specifiek moet zijn.
‫De eerste invoerparameter moet van het type primitieve componentaanwijzer zijn en heet hit comp.
‫Dit is het onderdeel dat het slaan doet.
‫In ons geval laten we ons projectielgaas dingen raken.
‫De volgende parameter is een actor-pointer genaamd Other Actor.
‫Dit wordt de acteur die geraakt is.
‫De volgende invoerparameter is een andere primitieve componentaanwijzer die andere comp wordt genoemd.
‫Dit is het andere onderdeel dat is geraakt.
‫Dus als we de statische mesh-component van een andere actor raken, dan zou dit die statische mesh-component zijn.
‫De volgende is een F-vector die normale impuls wordt genoemd.
‫Als we fysica simuleren, zal de fysica-engine een impuls geven als reactie op de botsing.
‫En deze f-vector vertegenwoordigt de richting en de grootte van die impuls.
‫En tot slot hebben we een invoerparameter van het type const F hit resultaat en dit is een const-referentie en het
‫wordt hit genoemd.
‫Dus wanneer een hit wordt gebeld, hebben we toegang tot een hitresultaat dat nog meer informatie over de hit
‫bevat.
‫Omdat we dit aan een gedelegeerde binden, moet het een U-functie zijn.
‫Dus we gaan dit met je functie markeren.
‫Nu zou u bekend moeten zijn met uw functie.
‫Het is net zoals je eigendom, het is alleen voor functies in plaats van variabelen.
‫Heel belangrijk dus.
‫Onze callback moet een u-functie zijn om dit te laten werken.
‫Nu hebben we de functie gedeclareerd.
‫Laten we doorgaan en de functie definiëren.
‫Dus terug in projectielen.
‫CP Net onder onze vinkfunctie, laten we deze functie definiëren.
‫We geven het een functielichaam en plaatsen de klassenaam net voor de functienaam, en nu hebben we
‫een callback-functie.
‫Dus we zijn klaar om dit op de hitfunctie te binden aan onze afgevaardigde en we moeten dit doen in het begin van het spel.
‫Als u het in de constructor doet, is dit te vroeg en soms kunt u problemen tegenkomen, zoals het feit dat uw gemachtigde
‫niet gebonden is.
‫Dus we gaan het hier doen en beginnen met spelen.
‫Dus we hebben ons projectielgaas en we zullen de pijloperator gebruiken om toegang te krijgen tot de variabele die van jou is geërfd.
‫Primitieve component aangeroepen op component hit en op component hit heeft de functie dynamisch toevoegen.
‫Vreemd genoeg werkt automatisch aanvullen niet voor dynamisch toevoegen, dus je zult de volledige
‫functienaam moeten typen.
‫Dit is de functie die we zullen gebruiken om onze callback aan een componenthit te binden en die functie toe te
‫voegen aan de aanroeplijst.
‫Nu hebben we eerst het gebruikersobject nodig dat dit zal zijn, omdat dit de klasse is waar de
‫functie voor wordt gebonden en vervolgens hebben we het adres nodig van de functie die het adres zal zijn van op hit.
‫Dus we gebruiken het adres van de operator en de functie een projectiel op treffer.
‫En hiermee hebben we onze functie gebonden en zijn we klaar om hit-events te genereren.
‫Nu kunnen we dit testen met een UEE-log en we kunnen log temp-waarschuwing gebruiken.
‫En voor de tekst kunnen we gewoon zeggen op hit.
‫En als we dit in het uitvoerlogboek zien, weten we dat onze on hit-functie is aangeroepen, laten we dit
‫compileren.
‫Dus ik heb het uitvoerlogboek hier geopend.
‫Ik ga op play drukken en een projectiel afvuren en daar wordt mijn logbericht bij hit gebeld.
‫Dit werkt dus.
‫Een kanttekening: als we naar BP-projectiel gaan en projectielgaas selecteren in het detailvenster, kunnen we naar
‫beneden scrollen naar het botsingsgedeelte.
‫En hier zien we dat de voorinstellingen voor botsingen zijn ingesteld om alle dynamiek te blokkeren en dat botsing
‫ingeschakeld is ingesteld op deze instelling voor botsingen ingeschakelde query en fysica.
‫Dit is nodig voor hit-events.
‫We moeten kunnen zoeken naar een hitgebeurtenis.
‫En natuurlijk zorgt de fysica ervoor dat de fysica-engine op het projectielgaas kan werken.
‫Dus nu we gebonden zijn aan de on-component hit afgevaardigde met onze on hit-functie en we een enorm logboek hebben
‫geplaatst om te controleren of het werkt, zou ik graag willen dat je deze functie een beetje meer verkent,
‫zodat we kunnen begrijp enkele van deze invoerparameters in onze on hit-functie.
‫Dus in de on hit-functie, voeg wat meer YOUI-logs toe.
‫Ik zou graag willen dat je de namen van sommige van deze invoerparameters afdrukt met behulp van de git-naamfunctie.
‫Ik zou graag willen dat je een YUI-log gebruikt om de naam van hitcom, andere acteur en andere comp af te drukken, zodat we de namen
‫kunnen zien van deze objecten die we raken.
‫U gaat het procent se-formaat gebruiken, specificeer de in de E log-tekstmacro.
‫En ter herinnering, telkens als we get name noemen, moeten we de asterisk gebruiken bij het doorgeven van die string in de YUI-logmacro,
‫bijvoorbeeld om de naam van een andere acteur te krijgen die we een andere acteur zouden noemen, naam en plaats
‫die asterisk te krijgen aan het begin gewoon om die C-stijl string terug te geven, wat je logt
‫verwacht als je het formatteert met een string.
‫Dus pauzeer de video en gebruik Yui log in onze on hit functie om de namen van hit comp, andere acteur en andere
‫comp nu af te drukken.
‫Oké.
‫Dus hier in projectiel CP, ik ga je log hier gebruiken.
‫Dus ik ga deze regel kopiëren waar ik Yui log gebruik en voor de string ga ik zeggen hit comp
‫procent s en net na de tekst die ik ga noemen hit comp get name en ik heb deze asterisk nodig om te
‫converteren van een F-tekenreeks naar een C-stijltekenreeks.
‫Nu ga ik dezelfde regel gebruiken, alleen ga ik de tekst veranderen om andere acteur te zeggen en we noemen
‫het deze keer de naam van een andere acteur.
‫En tot slot, ik ga andere comp-oproepen afdrukken, naam op andere comp krijgen.
‫Dus laten we compileren en terug hier in de editor, ik ga door en druk op play en schiet een
‫projectiel en bekijk dit.
‫We zien dat hitcom een projectielgaas is.
‫Onthoud dat we zeiden dat dit de component is die het slaan doet, wat onze projectielbrij is en je
‫zult zien dat het de naam gebruikt die we aan deze component hebben toegewezen in het maken van een standaard subobject.
‫Dit is dus een van die situaties waarin die naam wordt gebruikt.
‫Nu zul je zien dat er staat dat andere acteursfout nul onderstreept.
‫En dat komt omdat deze statische mesh-acteur die de fout is, de naam fout nul heeft.
‫Soms plaatst de engine een nummer aan het einde van zijn interne naam voor acteurs en componenten,
‫en je zult zien dat hetzelfde gebeurt als we andere comp uitprinten.
‫De statische mesh-acteur van de fout heeft een statische mesh-component en de naam is statische mesh-component nul.
‫Dit geeft ons dus wat meer informatie over die invoerparameters in onze on hit callback-functie.
‫En dit is handig omdat we toegang hebben tot die objecten in C++ als we iets willen doen als reactie op
‫de hitgebeurtenis.
‫Samenvattend hebben we geleerd over hitgebeurtenissen en hoe deze worden geïmplementeerd als multicast-afgevaardigden en we hebben geleerd
‫hoe die werken.
‫We hebben een functie gemaakt met de naam On Hit and Bound, die functie voor de on-component hit
‫afgevaardigde die ons projectielgaas heeft geërfd van de primitieve componentklasse u.
‫Nu hebben we het projectiel bij treffer niet vernietigd, maar we weten nu dat we dit gemakkelijk kunnen doen omdat
‫we deze callback-functie hebben en we kunnen logica in deze functie plaatsen, zoals het vernietigen van het projectiel.
‫Dus dat behandelen we in een toekomstige video.
‫Geef jezelf voor nu een schouderklopje, want dit is een van de meer complexe gebieden van Unreal Engine C++ die je tot
‫nu toe hebt geleerd.
‫Ik zie je in de volgende video.