Starten met Programmeren van een 3D omgeving in Unreal Engine – AEC Blueprints stap voor stap – Lichtschakelaar

print
Deze handleiding maakt deel uit van het programmeertraject:


Inhoud


Wat vooraf ging


Inleiding

Deze handleiding is geïnspireerd door deze tutorial op de Unreal Engine Learning website.

In deze handleiding werken we een light switch uit.

De bedoeling van deze handleiding is om stap voor stap een aantal belangrijke programmeertechnieken toe te passen.

Het is niet de bedoeling van deze handleiding om in detail te gaan, de bedoeling is om snel tot een werkend resultaat te komen. De details vindt u in andere handleidingen die ik in deze handleiding link. In tegenstelling tot de meeste van mijn andere handleidingen ga ik deze handleiding niet uitbreiden/verdiepen met aanvullende video’s.

Opmerking, ik volg de volgorde van de videotutorial maar persoonlijk had ik eerst de hoofdstukken Licht en Lichtschakelaar uitgewerkt om nadien de hoofdstukken van de Line Trace in één beweging uit te werken.

Situering van deze handleiding binnen Unreal Engine


Wat moet de light switch doen?

De lichtschakelaar wordt gebruikt om lichten aan en uit te schakelen.

  • We moeten beschikken over een lichtschakelaar, een Static Mesh die kan gemaakt zijn in een programma als 3Ds Max of Blender.
  • Er kunnen meerdere lichtschakelaars zijn die elk meerdere lichten kunnen bedienen. We moeten dus weten welke lichtschakelaar gebruikt wordt. Om de lichtschakelaar te detecteren maken we gebruik van een Line Trace, die als het ware een lijn trekt vanuit ons Character en detecteert waarmee deze lijn in contact komt.
  • De lichtschakelaar zal een Blueprint Class zijn, maar ook de lichten zullen deel uitmaken van een Blueprint Class. Er zal dus communicatie tussen deze Blueprint Classes tot stand moeten worden gebracht.
  • Het systeem moet flexibel en gebruiksvriendelijk zijn.
  • Omdat één lichtschakelaar meerdere lichten kan bedienen, of een licht door meerdere lichtschakelaars gaan we moeten gebruikmaken van een Array.

Welke programmeertechnieken worden gebruikt?

Onderstaande programmeertechnieken komen aan bod:


Wat hebben we ter beschikking?

Het project, dat we geïnstalleerd hebben in de inleidende handleiding, heeft ons het nodige materiaal aangereikt.

Waar we voor de automatische deur zelf de Blueprint Class diende aan te maken hebben we nu reeds Blueprint Classes die we kunnen gebruiken. Het project komt met deze Blueprints:

  • BP_Light_Switch
  • BP_Wall_Light

U ziet de Blueprints, en waar u ze kunt vinden, in onderstaande schermafdrukken.


Line Trace opzetten

Om de lichtschakelaar te detecteren maken we gebruik van een Line Trace, die als het ware een lijn trekt vanuit ons Character en detecteert waarmee deze lijn in contact komt.

We moeten dus vertrekken vanuit ons Character. We moeten daartoe de FirstPersonCharacter Blueprint openen.

  • Ga naar de folder FirstPersonBPLevel_BP en dubbelklik FirstPersonCharacter om de FirstPersonCharacter Blueprint te openen.

  • Merk op dat er reeds heel wat programmeercode aanwezig is (voor de besturing van ons Character, neem maar eens een kijkje).

  • Neem eens een kijkje onder Viewport, u ziet er de FirstPersonCamera.

Om de Line Trace te programmeren zouden we een functie kunnen aanmaken of… we kunnen de Line Trace in zijn eigen Graph plaatsen om zo de code van de Line Trace gescheiden te houden van de reeds aanwezige code. Zoals wel vaker het geval is zijn er meerdere opties om iets te programmeren.

  • Duid het +-teken aan op de hoogte van Graphs en klik vervolgens op New Graph.

  • Geef de gewenste naam LineTrace in.

We hebben nu een nieuwe Graph waar we, zonder gestoord te worden door de andere reeds aanwezige code, kunnen programmeren.

De Line Trace moet vertrekken vanuit het “oogpunt” van ons Character, dit is vanuit de locatie, in de wereld, van de FirstPersonCamera.

  • U vindt de FirstPersonCamera onder Components. Sleep de FirstPersonCamera in de Graph.
  • Zoek vervolgens vanuit de First Person Camera node naar GetWorldLocation om de locatie in de wereld van de FirstPersonCamera op te vragen.

We moeten ook weten in welke richting de FirstPersonCamera georiënteerd is, ik welke richting ons Character “kijkt”. We hebben dus zijn Forward Vector nodig.

  • Zoek vanuit de First Person Camera-node naar Get Forward Vector om de richting waarin de FirstPersonCamera “kijkt” op te vragen.

Merk op dat Return value van zowel GetWorldLocation als Get Forward Vector een gele pin is die staat voor een vector. Een vector bevat 3 waarden, een waarde voor de X-as, de Y-as en de Z-as.

De Line Trace moet pas uitgevoerd worden wanneer we op de linkermuisknop drukken, we hebben de linkermuisknop reeds gemapt met de Interact Action.

U vindt deze onder de Settings van het project.

  • Ga naar het menu EditProject Settings….

  • Ga onder Engine naar Input.
  • Ik heb hier de Action Mappings en Axis Mappings reeds open geklikt.
  • U ziet de Action Mapping Interact die gemapt is met de linkermuisknop.

  • Klik met de rechtermuisknop in de Graph en zoek naar Interact. Kies Action Events Interact.

  • U krijgt de Input Action Interact node met een pin voor Pressed en Released van de gemapte input (hier dus de linkermuisknop).

  • Als u op de linkermuisknop drukt moet u de Line Trace uitvoeren. Trek vanuit de Pressed-pin en zoek naar Line Trace By Channel.

  • De Line Trace verwacht een invoer voor Start en End.

De Start van de Line Trace zal de WorldLocation van de FirstPersonCamera zijn. Die hebben we reeds opgevraagd via GetWorldLocation van de First Person Camera.

De Line Trace kan niet oneindig lang zijn. U moet de lengte van de Line Trace bepalen. U zou kunnen zeggen, de lengte van uw armpje om op de lichtschakelaar te drukken. Ik ga er vanuit dat ik een lange arm heb en kies voor 400 cm. Deze waarde moeten we eerst vermenigvuldigen met de Forward Vector van de FirstPersonCamera en het resultaat optellen bij de WorldLocation van de FirstPersonCamera.

  • We gaan de afstand dus vermenigvuldigen met de Forward Vector van de FirstPersonCamera. Vanuit Return Value-pin van de GetForwardVector-node van de FirstPersonCamera trekt u een lijn en zoek naar vector * float. Het resultaat van de Forward Vector is een vector, de lengte is een float (kommagetal), vandaar dat we zoeken naar vector * float.

  • U vermenigvuldigt met 400. U geeft dus 400 in als waarde.
  • De uitkomst moet u optellen bij de WorldLocation van de FirstPersonCamera. U trekt vanuit de Return Value-pin van de GetWorldLocation-node van de FirstPersonCamera een lijntje en zoekt naar vector + vector.

  • U maakt de verbindingen zoals hieronder. De WorldLocation van de FirstPersonCamera is de Start voor de Line Trace.
  • De WorldLocation van de FirstPersonCamera + de afstand van 400 is de End van de Line Trace.

De Line Trace controleert of er iets geraakt wordt (of er een Hit is). Is er een Hit dan is de Return Value True, is er geen Hit dan is de Return Value False (het rode pinnetje staat voor een Boolean, een Boolean kan enkel True of False zijn).

Naargelang de Return Value van de Line Trace True of False is moet er iets anders gebeuren. We kunnen dus 2 richtingen uitgaan met ons programma. Dit kan via de Branch-node.

  • Trek een lijntje vanuit de Return Value van de Line Trace en zoek naar Branch.

  • Voeg deze Branch-node toe aan de Flow van het programma (door te verbinden met de Exec-in van de Line Trace zoals hieronder).

  • Ik heb even de tijd genomen om de nodige commentaar toe te voegen (selecteer de nodes en druk op de C-toets om zo’n kadertje te maken).

  • Compile en Save.

Nu we kunnen testen of de Line Trace een Hit heeft gaan we datgene uitwerken dat hij kan “Hitten”, namelijk de lichtschakelaar die op zijn beurt de lichten moet in- of uitschakelen. Als we dit gedaan hebben keren we terug naar deze Line Trace om de Hit af te werken.

Laat ons beginnen met het in– of uitschakelen van de lichten.


Lichten

We hebben programmeercode nodig die de lichten van de Wall Lights in en uitschakelt. Het in- uitschakelen van de lichten is een Event, een gebeurtenis, die veroorzaakt wordt door een actie van de gebruiker of de computer.

Er is reeds Blueprint BP_Wall_Light die we hiervoor kunnen gebruiken.

  • Open de Blueprint BP_Wall_Light.

  • De Wall Light heeft 2 Spot Lights.
  • Klik op Event Graph. Sleep de 2 Spot Lights in de Event Graph zodat we een referentie ter beschikking hebben naar deze Spot Lights.

  • Het in- uitschakelen van de lichten is een Event, een gebeurtenis, klik met de rechtermuisknop in de Event Graph en zoek naar Add Custom Event (zo’n Custom Event is eigenlijk gewoon een speciaal soort functie).

  • Geef de Custom Event een passende naam (bv. Switched).

  • Een licht gaat aan en dan weer uit, weer aan en uit aan en uit. Je zou dit Flip Flop(pen) kunnen noemen.
  • Vertrek vanuit de Exec-pin van de Custom Event en zoek naar Flip Flop.

  • Een licht is uit als de intensiteit op 0 staat. Vertrek vanuit een Spot Light en zoek naar Set Intensity. Laat de New Intensity op 0 staan.

We starten het spel met de lichten aan, dus bij de eerste keer Flip Flop moet het licht uit gaan (intensiteit = 0).

  • Verbind dus de A-pin van de Flip Flop met de Set Intensity node. U kunt eveneens de tweede Spot Light verbinden met deze Set Intensity node. De 2 Spot Lights delen immers deze instelling.

  • Herhaal dit nu voor een New Intensity van 200. Verbind dit met de B-pin van de Flip Flop. Verbind tevens beide Spot Lights.

  • We zijn klaar, plaats de programmeercode in een Commentaarvakje (selecteren en vervolgens op de C-toets drukken) voor we afsluiten.

  • Compile en Save.

Lichtschakelaar

Met de lichtschakelaar kunnen we één of meerdere lichten aan- of uitschakelen.

Ook hiervoor hebben we reeds een Blueprint beschikbaar, de Blueprint BP_Light_Switch.

  • Open de Blueprint BP_Light_Switch.

  • De Lichtschakelaar activeren is een Event, een gebeurtenis, klik met de rechtermuisknop in de Event Graph en zoek naar Add Custom Event.

  • Geef de Custom Event een passende naam (bv. Lichtswitch). Ik had beter de naam LightSwitch gebruikt zoals in de videotutorial, maar een naam is tenslotte maar een naam, we zullen met Lichtswitch verder moeten.

De lichtschakelaar moet één of meerdere lichten, van het type Wall Light, bedienen.

Hiervoor gaan we in eerste instantie een Variabele aanmaken.

  • Klik op het +-knopje onder Variables en kies + Variabele om een nieuwe variabele toe te voegen.

  • Geef een passende naam bv. Lights en kies als variabele een referentie naar de hierboven aangemaakte BP_Wall_Light (de videotutorial kiest hier voor het meer algemene type Actor en zal dit later Casten naar het type BP_Wall_Light, ik verkies meteen het juiste Variabele Type te nemen, iets minder werk).
  • Vink eveneens Instance Editable aan zodat we de variabele kunnen wijzigen in de Editor.

Maar… een variabele laat maar één waarde, één Wall Light, toe. De lichtschakelaar moet echter meerdere lichten kunnen aansturen, een lijst, een Array, van lichten.

  • Klik op het blauwe bolletje naast Variabele Type en kies voor Array.

  • Sleep de Array in de Event Graph (kies voor een Get).

We wensen alle elementen in de Array, alle Wall Lights die we gaan toekennen (dit moet nog gebeuren), één voor één te doorlopen.

  • Sleep een verbindingslijn uit de output-pin van de Array en zoek naar For Each Loop (voor ieder element in de Array).

  • Verbind de Exec-pin van de Custom Event Lichtswitch met de Exec-pin van de For Each Loop.
  • Sleep een verbindingslijn uit de Array Element-pin en zoek de hierboven aangemaakte functie Switched (in de videotutorial wordt hier eerst nog een Cast gedaan naar BP_Wall_Light).
  • Hieronder ziet u de volledige code met een mooi Commentaarkadertje.

  • Compile en Save.

Line Trace Hit afwerken

De functies voor de Lichten en de Lichtschakelaar zijn gemaakt. We werken nu onze Line Trace verder uit.

  • Ga naar de folder FirstPersonBPLevel_BP en dubbelklik FirstPersonCharacter om de FirstPersonCharacter Blueprint te openen.

Onderstaande code staat in de Line Trace Graph, we gaan hier verder op werken.

De Line Trace gaat dus nagaan of het een ander Actor Hit, overlapt, met de getrokken Line Trace.

Maar enkel wanneer we een Lichtschakelaar hitten moet er iets gebeuren. We moeten dus testen of het Actor dat we hitten een Lichtschakelaar is en als het een Lichtschakelaar (een BP_Light_Switch) is moeten we de net geprogrammeerde functie Lichtswitch uitvoeren.

  • Trek een verbindingslijn vanuit de LinetraceByChannel Hit Out-pin en kies voor Break Hit Result.

  • U krijgt een hele reeks Output-resultaten.

We zijn enkel geïnteresseerd in het hitten van een Lichtschakelaar. Om te zien of we een Lichtschakelaar gehit hebben trekken vanuit de Hit Actor-pin een verbindingslijn en zoeken we naar Cast To BP_Light_Switch. Een Casting brengt een communicatie tussen Blueprints tot stand. Als de Casting lukt hebben we de gewenste Blueprint (hier BP_Light_Switch) gehit.

  • Verbind deze Cast-node met de True-pin van de Branch.

  • Vanuit de As BP_Light_Switch-pin gaat u op zoek naar onze net aangemaakte functie Lichtswitch die, we willen uitvoeren. Dit zal dus enkel uitgevoerd worden indien de Casting naar BP_Light_Switch gelukt is en we dus een Lichtschakelaar gehit hebben.

  • Verbind de Exec-pinnen en we zijn klaar.

  • Compile en Save.

We zijn klaar om te testen.


Testen

Om te testen gaan we ervoor zorgen dat onze Line Trace zichtbaar is op het scherm (tijdens het Debuggen).

  • Nog steeds in de Line Trace Graph (zie hierboven) zet Draw Debug Type op For Duration in de LineTraceByChannel-node.

We moeten ook nog de Wall Lights aan de Lichtschakelaar toekennen.

  • In het Level, selecteer de BP_Light_Switch.
  • In het Details-panel vindt u normaal de Lights terug (is dit niet het geval keer dan terug naar de eigenlijke BP_Light_Switch en vink het oogje (de eigenschap Instanced Editable) aan voor de Array Lights).
  • Met het +-knopje voeg je de 2 BP_Wall_Lights toe.

  • Druk op Play.

Ga voor de Lichtschakelaar staan en druk op de linkermuisknop, het rode vierkantje in onderstaande schermafdrukken toont de Hit-locatie van de Line Trace aan.

De lichten gaan aan en uit, het werkt!

Geef een reactie

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

  • Abonneer je op deze website d.m.v. e-mail

    Voer je e-mailadres in om je in te schrijven op deze website en e-mailmeldingen te ontvangen van nieuwe berichten.