‫Hoi.
‫Welkom terug.
‫Nu hebben we ons projectiel, en we weten dat het treffers genereert, dus we moeten
‫iets doen als het projectiel ons doel raakt.
‫Dat gaat gepaard met schade aanrichten, wat betekent dat we een manier nodig hebben om de gezondheid bij te houden.
‫Dus we gaan een klasse maken voor het omgaan met gezondheid en schade, een gezondheidscomponent genoemd.
‫En de reden dat deze functionaliteit een eigen klasse krijgt, is dat we deze kunnen hergebruiken voor verschillende klassen,
‫zoals de tank en de toren.
‫Laten we het dus hebben over deze gezondheidscomponent.
‫Nu zijn we bekend met de use scene component class.
‫Welnu, deze klasse is afgeleid van een klasse die je actorcomponent wordt genoemd.
‫In feite is hier de documentatie over het gebruik van scènecomponenten.
‫En in de overervingshiërarchie kun je zien dat het bovenliggende element jouw actorcomponent is.
‫Nu is het onderdeel dat je speelt fundamenteler dan het onderdeel dat je hebt gezien.
‫Het heeft geen transformatie.
‫Dus locatie, rotatie en schaal is niet iets dat de je-acteurcomponent zelfs heeft.
‫Het ondersteunt geen bijlage.
‫U kunt geen actieve component koppelen aan bijvoorbeeld een statische mesh-component of een capsulecomponent.
‫Het is gewoon iets dat van de acteur is.
‫En omdat er geen visuele representatie of transformatie is, hoeven we het nergens aan vast te maken.
‫Vergelijk dit met de use scene component, die wel degelijk een transformatie heeft en de mogelijkheid heeft om
‫zich aan andere componenten te hechten of zich daaraan te laten hechten.
‫Dus om de gezondheid in de gaten te houden en schade te verzorgen, hebben we dat allemaal niet nodig.
‫Dus je acteert een onderdeel dat hier perfect voor is.
‫Dus laten we teruggaan naar de editor en van onze nieuwe act een componentklasse maken.
‫Dus we gaan naar tools en de nieuwe C++-klasse.
‫En als ik naar beneden scrol, zie ik de acteurscomponent.
‫Dit is wat we gaan selecteren.
‫Wees nu voorzichtig.
‫Selecteer geen acteur.
‫Dat is een andere klas.
‫Het is eigenlijk een grotere klasse en heeft veel meer dingen dan de acteurscomponent.
‫We hebben specifiek een actorcomponent nodig, dus selecteer die, klik op volgende.
‫En dit kunnen we gewoon Health Component noemen.
‫Laten we klikken op Klasse maken.
‫Nu hebben we hier onze nieuwe gezondheidscomponenten en CP-bestanden en je kunt hier zien dat je gezondheidscomponent, de
‫klasse die we zojuist hebben gemaakt, is afgeleid van je acteercomponent.
‫Zorg er dus voor dat je hier het juiste type hebt en je zult zien dat het in zijn U staat.
‫Klasse macro.
‫Deze meta specificeert waar en het zegt blauwdrukken spawn-tabelcomponent.
‫Hierdoor kunnen we dit onderdeel rechtstreeks in blauwdrukken toevoegen, wat we nu
‫gaan doen.
‫De nieuwe gezondheidscomponent gaat zorgen voor gezondheid, wat betekent dat we een aantal variabelen nodig hebben.
‫Laten we doorgaan en deze toevoegen en ik ga ze privé maken.
‫Dus laten we doorgaan en een privégedeelte toevoegen net onder het beschermde gedeelte, en we kunnen een
‫aantal gezondheidsvariabelen toevoegen.
‫Dit worden drijvers en ik ga de eerste Max Health noemen.
‫Dit is de maximale hoeveelheid gezondheid die we kunnen hebben en we kunnen dit instellen op een
‫standaardwaarde zoals 100 F.
‫Nu zullen we, naast Max gezondheid, een gezondheidswaarde hebben die de huidige gezondheid zal zijn en
‫dit zal veranderen als we schade oplopen.
‫Dus laten we nog een float maken en deze gewoon gezondheid noemen.
‫Nu kunnen we gezondheid initialiseren op nul F en dan de waarde instellen en beginnen met spelen.
‫En de reden dat we dat zullen doen, is omdat Max Health zijn eigen u-eigenschap zal hebben, waardoor we
‫het vanuit het detailvenster kunnen instellen.
‫Dus laten we dit een U-eigenschap geven en het overal laten bewerken.
‫Op die manier kunnen we het veranderen terwijl we ons ontwikkelen.
‫En dan in gezondheidscomponenten CP hier en beginnen met spelen, kunnen we gezondheid eenvoudig gelijk stellen aan de waarde van
‫maximale gezondheid.
‫Dus als het spel begint, heeft gezondheid de waarde van maximale gezondheid, zelfs nadat we het in
‫het detailvenster hebben gewijzigd.
‫Oké, dus laten we dit compileren en hier in de editor, ik ga BP openen -- tank en de
‫volledige blauwdruk-editor openen.
‫En nu kan ik deze gezondheidscomponent hier in het componentenpaneel toevoegen.
‫Dus ik ga op Toevoegen en zoeken naar gezondheid klikken.
‫En hier zien we gezondheid.
‫Nu noemden we het gezondheidscomponent in C ++.
‫En in feite laat de pop-up zien dat het gezondheidscomponent wordt genoemd.
‫Dus het verwijdert dat onderdeel als het hier wordt weergegeven.
‫En je hebt misschien gemerkt dat wanneer je zoekt naar statische mesh-componenten of capsulecomponenten, je
‫het woord component hier ook niet ziet.
‫Dus klik op gezondheid en nu hebben we onze gezondheidscomponent en je zult zien dat we onder gezondheidscomponent maximale gezondheid hebben
‫en deze is ingesteld op 100 en we zien geen gezondheid omdat we die variabele niet hebben blootgelegd.
‫Dus nu heeft BP -- tank een gezondheidscomponent en er staat dat de tank deze gezondheidscomponent bezit, de BP
‫-- tank.
‫Is de eigenaar van deze gezondheidscomponent.
‫Laten we de BP-torentje compileren en opslaan en sluiten en openen en de volledige blauwdrukeditor openen en we kunnen
‫ook een gezondheidscomponent aan het vijvertorentje toevoegen.
‫Dus laten we klikken op componenten toevoegen, zoeken naar gezondheid en gezondheid selecteren.
‫En nu hebben we ook een gezondheidscomponent op de toren.
‫Dus ik ga deze compileren en opslaan, close out en save all.
‫Dus we hebben nu een gezondheidscomponent en we zeiden dat we graag een gezondheidscomponent zouden hebben, zodat we
‫deze kunnen hergebruiken met verschillende klassen.
‫Dus als we een pion in de wereld hebben, laten we zeggen onze toren, dan krijgt die zijn eigen gezondheidscomponent
‫en dan kan onze tank zijn eigen gezondheidscomponent hebben.
‫Nu, wanneer ons projectiel met een van deze interageert, bijvoorbeeld wanneer het een treffer
‫genereert, wanneer het een van deze dingen raakt, dan kunnen onze pionnen enige functionaliteit
‫in de gezondheidscomponent activeren en die gezondheidswaarden veranderen.
‫Onze gezondheidsfunctionaliteit in een component plaatsen en die component vervolgens aan een klasse toevoegen, heeft enkele voordelen ten opzichte
‫van het alternatief, dat zou zijn om de gezondheidsfunctionaliteit bijvoorbeeld eenvoudig in de basispionklasse te plaatsen
‫en die over te nemen in de tank en toren.
‫Dit stelt ons in staat om onze tank- en torenklassen klein te houden en alleen de gespecificeerde functionaliteit voor die klassen
‫te behandelen.
‫Terwijl de gezondheidscomponent aan elke andere actor kan worden toegevoegd, zoals dingen die zich niet als tanks of
‫torens gedragen.
‫We kunnen bijvoorbeeld een vernietigbare muur maken die vernietigd kan worden zodra er voldoende schade
‫is.
‫Dus laten we een beetje praten over hoe we dit nu kunnen laten gebeuren.
‫Unreal Engine heeft ingebouwde schadefunctionaliteit en het beschadigde systeem is eigenlijk behoorlijk geavanceerd.
‫Elke acteur in ons spel erft een aantal schadegebeurtenissen, waarvan er één wordt opgeroepen om enige schade op te nemen.
‫Dit is een multicast-afgevaardigde, net als bij componenthit.
‫Nu gaan we gezondheidscomponenten toevoegen aan onze pionnen en deze zullen gebaseerd zijn op onze U.
‫Klasse gezondheidscomponent.
‫Dus omdat we weten dat onze pionnen dit zullen erven bij het nemen van een schadeafgevaardigde, als we onze
‫eigen aangepaste functie maken in de gezondheidscomponentklasse, dan kunnen we deze functie gebruiken als een callback en
‫deze binden aan de on take eventuele schade delegeren.
‫Dus telkens wanneer een schadegebeurtenis wordt gegenereerd, kan de eventuele schadeafgevaardigde uitzenden en alle functies die
‫eraan zijn gebonden in zijn aanroeplijst worden aangeroepen.
‫Dus de volgende vraag is hoe we die afgevaardigde daadwerkelijk zover krijgen om uit te zenden?
‫We hebben een manier nodig om een schadegebeurtenis te genereren.
‫Welnu, er is een functie in je gameplay-statistieken die precies dat zal doen en dat wordt schade aanbrengen genoemd.
‫Als we deze statische functie uit je gameplay-statistieken gebruiken om schade toe te passen, heeft het toepassen van schade
‫een aantal parameters nodig, waaronder de acteur die beschadigd raakt.
‫Dus als we schade toepassen noemen, worden de acteurs die een schadeafgevaardigde oppakken, ontslagen en wordt die
‫terugroepfunctie als reactie aangeroepen.
‫Schade aanbrengen is dus de oorzaak van de schadegebeurtenis.
‫Dus om dit allemaal in te stellen, hebben we drie stappen.
‫Maak eerst een callback-functie en aangezien deze verplicht is om eventuele schade op te nemen, moet deze
‫de juiste invoerparameters hebben, zodat bij het nemen van eventuele schade deze wordt aangeroepen en alle
‫bijbehorende informatie over de schade-gebeurtenis doorgeeft.
‫Stap twee is om deze callback aan de gemachtigde te binden.
‫We hebben gezien hoe dit te doen met de on component hit gedelegeerde met behulp van de dynamische functie toevoegen.
‫We gaan hier hetzelfde doen.
‫En de derde stap is om de schadegebeurtenis te genereren door de you game play statische functie, toegepaste schade aan
‫te roepen.
‫Dus laten we teruggaan naar de code en beginnen met het opzetten hiervan.
‫Oké.
‫Dus we zijn hier in de gezondheidscomponent en we gaan een callback-functie toevoegen.
‫Dit kan nietig zijn en we kunnen het noemen zoals we willen.
‫Ik noem deze schade genomen.
‫En omdat we dit aan een gedelegeerde binden, moet het de juiste invoerparameters hebben die geschikt zijn
‫voor die gedelegeerde.
‫Voor functies die zijn gebonden aan de gemachtigde om eventuele schade op te nemen, moet de lijst met invoerparameters als volgt zijn.
‫De eerste is een acteur-aanwijzer genaamd Damaged Actor, en zo klinkt het.
‫Het is de acteur die de schade oploopt.
‫De volgende is een float genaamd schade en dit is het werkelijke schadebedrag.
‫Vervolgens hebben we een aanwijzer voor het type schade dat u schade toebrengt, het schadetype.
‫En de reden dat we deze invoerparameter hebben, is omdat Unreal Engine het concept van schadetypes heeft.
‫U kunt aangepaste soorten schade maken met extra gegevens die u kunnen informeren om verschillende dingen te doen, afhankelijk van
‫het soort schade dat u heeft.
‫Brandschade.
‫Gif schade.
‫Explosieve schade enzovoort.
‫En als u voor elk schadetype aangepaste functionaliteit wilt implementeren, dan zou u dat in
‫uw eigen aangepaste schadetype implementeren.
‫Nu maken we niet ons eigen aangepaste schadetype, maar omdat we deze functie binden aan de gemachtigde
‫om eventuele schade op te nemen, moet deze deze invoerparameters hebben.
‫Dus we nemen het hier op.
‫Nu is de volgende parameter een A-controlleraanwijzer en dit wordt aanstichter en het Unreal Engine Damage
‫System genoemd.
‫Een aanstichter is de verantwoordelijke voor de schade.
‫Dus als de schade uiteindelijk is veroorzaakt door een speler die een pion bestuurt, dan is de aanstichter de controller die
‫die pion in bezit heeft.
‫Nu hoeft er niet altijd een aanstichter te zijn.
‫Als er geen was, zou dit gewoon nul zijn.
‫En nu krijg ik de rode kronkels zodat ik de A-controllerklasse hier tussen haakjes voor de functie
‫kan declareren.
‫Nu is de laatste parameter een A-acteuraanwijzer en deze heet Schadeveroorzaker.
‫Dit is de werkelijke acteur die de schade veroorzaakt.
‫Dit zou het projectiel zelf zijn.
‫Dus hebben we deze schade terugroepfunctie verklaard en net als onze andere terugroepfunctie op hit.
‫Dit moet een u-functie zijn.
‫Dus we gaan het de functiemacro geven om er zeker van te zijn dat het werkt zodra we het binden aan de
‫gemachtigde om eventuele schade op te nemen.
‫En nu we het hebben gedeclareerd, zijn we klaar om het in het CPP-bestand te definiëren.
‫Dus hier in gezondheidscomponenten, CPP.
‫Beneden ga ik verder en geef dit een functielichaam en kwalificeer de functie volledig met
‫de klassenaam.
‫En nu hebben we een terugroepactie.
‫Dus nu moeten we dit aan de afgevaardigde binden.
‫Maar de afgevaardigde bestaat niet op de gezondheidscomponent, hij bestaat specifiek op actoren.
‫We willen dit binden aan de eventuele schadeafgevaardigde in de pion die dit onderdeel bezit.
‫Dus hoe krijgen we toegang tot de eigenaar van dit onderdeel zodat we ons kunnen binden aan een van zijn afgevaardigden?
‫Welnu, we zouden dit doen en beginnen met spelen en de manier waarop we toegang kunnen krijgen tot de eigenaar
‫van een component is via de git-eigenaarfunctie.
‫Als je de muisaanwijzer eroverheen beweegt, zie je dat het een actor-aanwijzer retourneert.
‫Dit is de verwijzing naar de actor die eigenaar is van een component.
‫Componenten kunnen eigendom zijn van pionnen, ze kunnen eigendom zijn van acteurs, dus het zal de eigenaar
‫teruggeven in de vorm van een acteurswijzer.
‫Dus we hebben onze callback-functie en onze tweede stap is om deze te binden aan de gedelegeerde bij het nemen van eventuele
‫schade die zal ontstaan op de pion die de gezondheidscomponent bezit.
‫Dus aangezien je ervaring hebt met het terugbellen naar afgevaardigden, zal dit je uitdaging zijn in de
‫klas gezondheidscomponent.
‫In Begin Play ga je de geleden schade toekennen aan de eventuele schadeafgevaardigde van de eigenaar
‫van het onderdeel.
‫U krijgt dus toegang tot die gemachtigde via de functie eigenaar ophalen.
‫Met andere woorden, je gaat de eigenaar bellen en van daaruit ga je toegang krijgen tot eventuele schade.
‫En vanaf daar weet je hoe je callbacks aan afgevaardigden kunt binden met behulp van Dynamisch toevoegen als
‫je vastloopt, kijk hoe we de on-hit callback hebben gekoppeld aan de on-component hit-delegate, pauzeer de video en bind de
‫geleden schade aan de on-take any damage-delegate nu.
‫Oké.
‫Dus we zijn hier terug in de gezondheidscomponent en we zijn klaar om de binding van onze callback-functie te doen.
‫Dus hier en beginnen met spelen, we gaan toegang krijgen tot de eigenaar met behulp van de git-eigenaarfunctie en van daaruit
‫gaan we de pijl-operator gebruiken om toegang te krijgen tot die gedelegeerde die is opgeroepen, eventuele schade op te nemen en eventuele schade
‫op te nemen heeft de toegevoegde dynamiek functie en er zijn gewoon een gebruikersobject en een functienaam voor nodig.
‫Nu is het gebruikersobject het object waarvoor we de functie binden.
‫Het is de klasse die de callback-functie heeft en dat wordt dit.
‫En tot slot hebben we onze terugbelfunctie, die jij gaat worden.
‫Schade aan gezondheidscomponent genomen.
‫Nu moeten we het adres van de operator onthouden, omdat dit eigenlijk een adres van de functie nodig heeft.
‫Dus nu genomen schade is gebonden aan het nemen van enige schade en het wordt toegevoegd aan de aanroeplijst van die afgevaardigde.
‫Dus wanneer we schadegebeurtenissen genereren, krijgen we een uitzending van deze afgevaardigde, wat ertoe leidt dat de
‫functie voor het nemen van schade wordt gebeld.
‫Samengevat hebben we onze eigen gezondheidscomponent gemaakt en een van deze toegevoegd aan zowel de
‫tankblauwdruk als de torenblauwdruk.
‫We hebben een callback-functie gemaakt met de naam Damage Taken en we hebben deze gekoppeld aan de gemachtigde om eventuele schade op te nemen.
‫De volgende stap is het genereren van een schadegebeurtenis die zal resulteren in het uitzenden van de gemachtigde om
‫eventuele schade op te nemen, zodat onze callback-functie voor schade als reactie wordt aangeroepen.
‫En dat stellen we in de volgende video in.
‫Ik zie je snel.