Inhoud
- Wat vooraf ging
- Gebruikte terminologie
- Inleiding
- Licht aan bij het opstarten
- Licht aan bij het binnengaan en uit bij het verlaten
- Deur openen
Wat vooraf ging
- U hebt basiskennis van het programmeren van Blueprint Visual Scripting.
- U bent vertrouwd met de werkomgeving van Unreal Engine.
- U weet wat een Blueprint Class is.
We hebben reeds in de allereerste kennismaking met Blueprint Visual Scripting gezien hoe u een licht kunt aan en uit doen. Ik heb deze code hier herhaald.
Gebruikte terminologie
Objects
The base building blocks in the Unreal Engine are called Objects and contain a lot of the essential “under the hood” functionality for your game assets. Just about everything in Unreal Engine 4 inherits (or gets some functionality) from an Object.
Actors
An Actor is any object that can be placed into a level. Actors are a generic Class that support 3D transformations such as translation, rotation, and scale. Actors can be created (spawned) and destroyed through gameplay code (C++ or Blueprints).
Blueprints
The Blueprints Visual Scripting system in Unreal Engine is a complete gameplay scripting system based on the concept of using a node-based interface to create gameplay elements from within Unreal Editor. As with many common scripting languages, it is used to define object-oriented (OO) classes or objects in the engine. As you use UE4, you’ll often find that objects defined using Blueprint are colloquially referred to as just “Blueprints.”
Level
A Level is a user defined area of gameplay. Levels are created, viewed, and modified mainly by placing, transforming, and editing the properties of the Actors it contains. In the Unreal Editor, each Level is saved as a separate .umap file, which is also why you will sometimes see them referred to as Maps.
Inleiding
U hebt reeds voldoende kennis van de werkomgeving en u beheerst de basis om een level te bouwen. U hebt reeds enige programmeerkennis. Tijd om interactie toe te voegen met de omgeving door te programmeren.
Situering van deze handleiding binnen Unreal Engine
Licht aan bij het opstarten
- Start een nieuw Third Person Desktop/Console project van Maximum Quality With Starters Content en geef het een passende naam.
- Bouw eventueel een “Huisje” zoals we dit gezien hebben in de handleiding Prototyping.
De actors die toegevoegd zijn aan het level ziet u in de World Outliner.
Normaal is er reeds een PointLight toegevoegd, indien niet:
- Zoek links in het Modes-panel naar Lights – Point Light.
- Sleep de Point Light dit ergens in het decor van het level. U zou normaal het licht moeten zien branden.
- Selecteer het toegevoegde PointLight en bekijk de eigenschappen.
Merk op dat de eigenschap Visible aangevinkt is. Inderdaad, als we het level starten brandt het licht reeds.
- Omdat we het licht willen laten branden via programmeercode vinken we de eigenschap Visible uit.
Blueprint Licht aan
- Open de Level Blueprint opnieuw door in de knoppenbalk van de Viewport op Blueprints – Open Level Blueprint aan te klikken.
De Level Blueprint wordt geopend in de zogenaamde Event Graph. De Level Blueprint kent enkel maar deze Event Graph.
In de Events Graph worden de events geprogrammeerd.
Events
Een event is een gebeurtenis, iets dat kan plaatsvinden, die getriggerd wordt door het systeem of door de gebruiker.
Een klassiek voorbeeld is het klikken op een knop. Het klikken op een knop triggert de Click-event horende bij die knop.
In Level Blueprint ziet u reeds twee events klaar staan (al zijn ze beiden nog grijs want geen van beiden is momenteel verbonden met een instructie):
- BeginPlay – deze event wordt uitgevoerd wanneer het spel start (voor de actor, in het meeste geval voor de speler).
- Tick – Deze event wordt iedere frame uitgevoerd (bij 60 fps (frames per second) dus 60 keer per seconde).
Merk op dat beiden events dezelfde stijl hebben (rode bovenrand). Alle events gebruiken deze stijl en zijn zo meteen herkenbaar als events.
We willen dat “Als het level start, de speler begint te spelen, het licht brandt”.
Concreet:
Als het spel start, Event BeginPlay, moet de eigenschap Visible van het object PointLight aan, op true, gezet worden.
We moeten dus de eigenschap van het object PointLight wijzigen, object georiënteerd, hiertoe moeten we eerst een referentie naar het object PointLight toevoegen aan Level Blueprint.
Referentie naar een object toevoegen
- Zorg dat het object PointLight geselecteerd is.
- Klik nu met de rechtermuisknop in de Level Blueprint.
- Omdat het object PointLight geselecteerd is kunt u nu klikken op Create a reference to PointLight.
De referentie naar het object PointLight, komende uit het Persistent Level, wordt toegevoegd aan Level Blueprint.
We moeten nu de eigenschap Visible van het object PointLight kunnen wijizgen.
- Sleep een verbindingslijn vanuit de PointLight-node en zoek naar Visibility.
U ziet verschillende opties verschijnen.
Toggle betekent zet aan indien uit en uit indien aan (schakelen dus). Ik zou hiervoor kunnen kiezen en dit zal werken (onderstaande video doet dit).
Maar eigenlijk wil ik de eigenschap Visibility een andere waarde geven (Set). Ik kies dus voor Set Visibility.
Ik kan nu nog kiezen uit Set Visibility (Lightcomponent) of Set Visibility (PointLightcomponent). Omdat een PointLightcomponent eigenlijk ook een Lightcomponent is maakt ook dit geen verschil uit. Ik kies misschien het meest specifieke, in dit geval dus Set Visibility (PointLightcomponent).
- Klik op Set Visibility (PointLightcomponent).
- Versleep de nodes een beetje zodat het er overzichtelijker uitziet.
Merk op dat hij er automatisch een derde node heeft aan toegevoegd. Dit is de conversie (of casting) van ons PointLight naar het PointLightcomponent.
Ok, eigenlijk is deze conversie niet nodig want PointLight is reeds een PointLightcomponent maar C++, de achterliggende programmeertaal is nogal heel strikt en vraagt altijd de juiste conversie (ook al is het op zich niet nodig) en aangezien het automatisch gebeurt laten…
We zien dat de functionaliteit Set Visibility (merk de F op in de blauwe rand) een Target verwacht, het PointLightcomponent waarvoor de Visibility moet gewijzigd worden. Deze Target is reeds verbonden met ons object PointLight. De functionaliteit Set Visibility biedt ook de mogelijkheid een New Visibility in te stellen door het aankruisvakje aan te vinken.
- Vink New Visibility aan.
- Verbindt, via de Exec-pin, de event BeginPlay met de functie Set Visibility.
- Compileer het Level Blueprint door te klikken op de knop Compile. Vergeet dit niet!
- Build en start het level. Merk op dat het licht aan is (ok, dit was het daarvoor ook al maar nu hebben we het geprogrammeerd (How cool is that?).
Onderstaande video demonstreert het bovenstaande.
Een alternatieve uitvoering uit een andere reeks die ik ga gebruiken.
Oké, dit werkt, maar eigenlijk hebben we nu iets geprogrammeerd dat reeds werkte en dat ook gewoon kon door voor het object PointLight de eigenschap Visibility aan te vinken. Laten we het nog iets praktischer maken, iets dat niet kan zonder te programmeren.
Licht aan bij het binnengaan en uit bij het verlaten
Als u, de speler, het “huisje” binnenstapt moet het licht aangaan, als hij het weer verlaat moet het licht weer uitgaan.
Eerst gaan we ons bestaande Level Blueprint moeten wijzigen. Het licht mag immers niet langer aan staan bij het starten van het level, het moet uit zijn bij starten van het level en pas aan als ik het “huisje” binnenstap.
- Open Level Blueprint.
- Vink New Visibility uit.
Triggerbox
Als we het huisje binnen gaan moet het licht aan gaan.
We gaan dus iets nodig hebben, iets moeten plaatsen in het level, waardoor het systeem weet dat het huisje wordt binnen gestapt en dat een event triggert (meer bepaald een Overlap-event). Laten we eens zoeken wat Unreal Engine aan opties biedt.
- Typ in het zoekvakje van de Place mode de tekst Trigger in.
Unreal Engine komt met een aantal Triggers in een aantal vormen. De Box Trigger past het best in ons “Huisje”.
- Plaats en schaal een Trigger Box binnen het “Huisje”.
- Geef het een passende naam (bv. TriggerBoxHuisje)
Event OnActorBeginOverlap
- Selecteer vervolgens de Trigger Box.
- Ga naar Level Blueprint.
- Binnen Level Blueprint, klik met de rechtermuisknop in de editor. Met de TriggerBoxHuisje geselecteerd krijgt u een snelmenu specifiek voor deze Triggerbox.
- Klik op Add events for Trigger Box Huisje – Collision – Add on Actor Begin Overlap. Dit is de event die wordt getriggerd als een actor, ons karakter, de Triggerbox begint te “overlappen”.
Een nieuwe OnActorBeginOverlap-event is toegevoegd.
Als we deze TriggerBox beginnen te overlappen, als we dus het huisje binnengaan, moet het licht aan gaan, of andersgezegd, moet de Visibility van object PointLight op true staan.
- Het object PointLight is reeds toegevoegd aan het level, we kunnen dit gewoon kopiëren en plakken.
- Sleep een verbindingslijn vanuit de PointLight-node en zoek naar Visibility.
- We kiezen echter deze keer voor Toggle Visibility, dit heeft ons een grotere herbruikbaarheid van de functie (zie hieronder).
Merk de gelijkenissen op met de functionaliteit Set Visibility.
Beiden ontvangen als Target het object PointLight dat eerst nog geconverteerd wordt naar PointLightComponent.
Toggle Visibility zal echter de Visibility automatisch veranderen van aan naar uit of omgekeerd. Er is dus geen setting van een New Visibility beschikbaar.
- Verbindt, via de Exec-pin, de event OnActorBeginOverlap met de functie Toggle Visibility.
- Compileer het Level Blueprint door te klikken op de knop Compile. Vergeet dit niet!
- Build en start het level, het licht is uit en gaat pas aan als u het “Huisje” binnenstapt, dus als u de TriggerBox begint te overlappen.
We hebben echter nog een probleem, het licht gaat wel aan als we het “Huisje” binnengaan, maar niet uit als we het “Huisje” verlaten. Als we dan opnieuw het “Huisje” binnengaan wordt het licht nu uitgedaan. Er wordt dus enkel mar geschakeld bij het binnengaan en niet bij het naar buitengaan.
Maar eerst gaan we nog een kleine pauze inlassen tussen het binnengaan en het licht dat aangaat.
Een delay (pauze) toevoegen
- Sleep een verbindingslijn vanuit de event OnActorBeginOverlap.
- Zoek naar de functionaliteit Delay.
Merk op dat deze nieuwe functie zich meteen plaatst tussen event OnActorBeginOverlap en de functie Toggle Visibility zodat er een continuïteit blijft bestaan in de volgorde van de instructies.
- Eerst een Delay
- Dan pas het licht schakelen.
- Eventueel kunt u nog de tijdspanne van de Delay (pauze) wijzigen door de eigenschap Duration te wijzigen naar bv. 0,5.
Event OnActorEndOverlap
We hebben echter nog een probleem, het licht gaat wel aan als we het “Huisje” binnengaan, maar niet uit als we het “Huisje” verlaten. Als we dan opnieuw het “Huisje” binnengaan wordt het licht nu uitgedaan. Er wordt dus enkel mar geschakeld bij het binnengaan en niet bij het naar buitengaan.
De oplossing is het licht eveneens te schakelen als het “Huisje” verlaten wordt. We hebben dus ook een event nodig die wordt getriggerd als de TriggerBoxHuisje wordt verlaten.
- Zorg er eerst voor dat TriggerBoxHuisje geselecteerd is.
- Binnen Level Blueprint, klik met de rechtermuisknop in de editor. Met de TriggerBoxHuisje geselecteerd krijgt u een snelmenu specifiek voor deze Triggerbox.
- Klik op Add events for Trigger Box Huisje – Collision – Add on Actor End Overlap. Dit is de event die wordt getriggerd als een actor, ons karakter, de Triggerbox beëindigt met te “overlappen”.
Een nieuwe OnActorEndOverlap-event is toegevoegd.
We kunnen nu identiek hetzelfde doen als bij OnActorBeginOverlap. Maar aangezien de nodes er toch staan kunnen we ze evengoed kopiëren en plakken.
- Selecteer alle nodes onder OnActorBeginOverlap, maak hiervoor gebruik van de Ctrl-toets.
- Kopieer en plak ze.
- Verbindt de gekopieerde Delay-functie met de OnActorEndOverlap-event.
- Compileer het Level Blueprint door te klikken op de knop Compile. Vergeet dit niet!
- Build en start het level. Het werkt nu zoals gewenst.
Onderstaande video demonstreert het bovenstaande.
Deur openen
Nu we het licht kunnen aan en uit doen, misschien tijd om een deur toe te voegen aan ons “huisje” en deze deur automatisch te openen van zodra we ervoor staan.
We hebben reeds gezien hoe een deur kan worden toegevoegd aan een level.
- Sleep de Static Meshes SM_Door en SM_DoorFrame in het level.
- Gebruik de gekende technieken om deze actors de plaatsen en eventueel te roteren en te schalen.
- Omdat de deur moet kunnen roteren moet de Mobility van SM_Door op Movable staan.
Om een object, een deur, interactief te maken moet u een Trigger toevoegen.
- Voeg een BoxTrigger (die ik de naam DeurTriggerBox heb gegeven) toe zodat deze de deur langs beide zijden van de deur overlapt.
Met alle actors op zijn plaats en correct ingesteld kunnen we aan de programmeren slaan.
De deur openen via Blueprints Visual Scripting
Een deur moet open gaan, of meer specifiek, de deur moet 90° roteren. De deur (SM_Door) is het object waarmee iets moet gebeuren.
- Selecteer SM_Door.
Het programmeren gebeurt in Level Blueprint.
- Met SM_Door nog steeds geselecteerd, klik in de knoppenbalk van de Viewport op Blueprints – Open Level Blueprint.
- Klik met de rechtermuisknop ingeduwd in Level Blueprint. Omdat we de actor SM_Door geselecteerd hebben kunnen we gemakkelijk een referentie naar de actor aanmaken door te kiezen voor Create a Reference to SM_Door.
Een referentie naar de actor SM-Door uit het persistent level is toegevoegd.
Nu we een referentie naar ons object MS_Door toegevoegd hebben aan Level Blueprint kunnen we dit gebruiken.
Wat moet er gebeuren met deze deur? Wel, de deur moet roteren rond zijn eigen as. Dit kan via de functionaliteit SetActorRelativeRotation (omdat de rotatie relatief is ten opzichte van de actor zal deze ook blijven werken moesten we de actor verplaatsen). Moest u zich afvragen of ik met deze kennis (dat de functionaliteit SetActorRelativeRotation moet gebruikt worden) geboren ben, wel, nee. Dit is een kwestie van opzoeken en een beetje gezond verstand gebruiken.
- Sleep dus een node vanuit onze referentie naar MS_Door en zoek naar SetActorRelativeRotation.
- Klik deze aan als u ze gevonden hebt. Merk op dat SM_Door als Target wordt gekoppeld.
- Er moet 90° geroteerd worden rond de Z-as. U kunt nu gewoon die 90 intypen bij Z.
Wanneer moet dit gebeuren?
Wanneer moet de deur open gaan?
Wel, wanneer de “speler” de ruimte bepaald door de DeurTriggerBox binnen treedt. Of nog meer concreet bij de Event OnActorBeginOverlap van de actor DeurTriggerBox.
- Selecteer de DeurTriggerBox in uw level.
- Keer terug naar Level Blueprint en klik met de rechtermuisknop ingedrukt in Level Bleuprint.
- Omdat onze DeurTriggerBox geselecteerd is, kunt u gemakkelijk events voor deze DeurTriggerBox toevoegen. De event die we zoeken vindt u onder Collision – Add On Actor Begin Overlap.
- Klik deze aan.
De Event OnActorBeginOverlap van de actor DeurTriggerBox is toegevoegd.
- Verbindt de node van de Event OnActorBeginOverlap met de node SetActorRelativeRotation.
Oke, laten we dit testen.
- Compileer Level Blueprint door te klikken op de knop Compile. Vergeet dit niet!
- Build en start het level.
Het werkt!
Toch bijna, de deur vliegt open en eens open gaat ze niet meer dicht.
Ah, geen probleem, we voegen een Delay toe zoals bij de lamp. Oké, maar nee, een Delay zal er enkel voor zorgen dat het iets langer duurt voor de deur met dezelfde snelheid open vliegt. Het is het openen van de deur zelf die moet vertraagd worden.
De oplossing ligt in het gebruik van een Timeline. Ik heb ik dit uitgewerkt in een afzonderlijke handleiding.
Behandelde Basiscompetenties uit de module ICT Programmeren – Specifieke ontwikkelomgeving: eenvoudige functionaliteiten
- IC BC017 – kan ICT veilig en duurzaam gebruiken
- IC BC234 – kan de basisprincipes van programmeren in een specifieke ontwikkelomgeving toepassen
- IC BC236 – kan eenvoudige wijzigingen aan een programma aanbrengen
- IC BC241 – kan een programma in een specifieke ontwikkelomgeving maken
- IC BC247 – kan de bouwstenen van een specifieke ontwikkelomgeving gebruiken
- IC BC249 – kan de instellingen van een specifieke ontwikkelomgeving wijzigen
- IC BC250 – kan bij het programmeren in functie van een specifieke ontwikkelomgeving, een juiste logica volgen