Deze handleiding maakt deel uit van het programmeertraject:
Inhoud
- Wat vooraf ging
- Gebruikte terminologie
- Inleiding
- Variabelen
- Datatypen
- Waarden toekennen en opvragen (SET en GET)
- Constanten
- Extra – Variabelen beschikbaar maken
- Extra – Casting
- Extra – Referentie
- Extra – Objecten
- Extra – Enumeraties
Wat vooraf ging
- U hebt de Blueprint Visual Scripting introductie doorgenomen.
- U kent de basis van het werken met variabelen.
Gebruikte terminologie
Variable
Variables are properties that hold a value or reference an Object or Actor in the world.
Inleiding
Deze handleiding herneemt de basishandleiding en voegt er een aantal gevorderde begrippen aan toe. U vindt deze met de aanduiding Extra aangevuld met de vervolgvideo’s.
- Extra – Variabelen beschikbaar maken
- Extra – Casting
- Extra – Referentie
- Extra – Objecten
- Extra – Enumeraties
Situering van deze handleiding binnen Unreal Engine
Variabelen
Algemeen
In een voorgaande post heb ik onderstaande “definitie” gebruikt voor het begrip variabele.
Een variabele is een voorbehouden locatie in het computergeheugen waar u een waarde kunt bijhouden/stokkeren voor later hergebruik. De variabele heeft een naam en is vaak van een specifiek type. Het type bepaalt het aantal bytes dat gereserveerd wordt in het computergeheugen voor deze variabele en de naam van de variabele wordt gebruikt om toegang te krijgen tot deze locatie in het computergeheugen. De waarde die wordt bijhouden in die locatie, en waar de variabele naar verwijst, kan in de loop van het programma variëren/wijzigen.
Laten we dit nu even meer in detail bekijken en wat uitbreiden en duiden specifiek voor Blueprint Visual Scripting:
- Een variabele is een voorbehouden locatie in het computergeheugen waar u een waarde kunt bijhouden/stokkeren voor later hergebruik.
- Zoals u wellicht weet is het computergeheugen vluchtig. Dit wil zeggen dat het wordt leeggemaakt als u uw computer uitschakelt. Dit betekent dat de variabelen, die zich in het computergeheugen, en niet op een schijf, bevinden, eveneens hun gewijzigde waarde zullen verliezen. De wijzigingen zijn dus niet blijvend.
- De variabele heeft een naam (identifier). De naam van de variabele wordt gebruikt om toegang te krijgen tot deze locatie in het computergeheugen.
- De variabele is van een specifiek datatype. Het datatype bepaalt het aantal bytes dat gereserveerd wordt in het computergeheugen voor deze variabele en bepaalt ook welk soort/type data de variabele kan bevatten (integer, float, string, vector, actor, …).
- De waarden die opgeslagen worden in variabelen kunnen in de loop van het programma variëren, ze zijn dus variabel.
- Een variabele moet binnen dezelfde blueprint uniek zijn. Dezelfde naam mag dus binnen dezelfde blueprint geen tweede keer hergebruikt worden voor een tweede variabele.
- Een variabele wordt een waarde toegekend, we spreken dan van een SET.
- De waarde van een variabele kan worden opgevraagd, we spreken dan van een GET.
Een variabele aanmaken
- Start een nieuw Third Person Desktop/Console project van Maximum Quality With Starters Content en geef het een passende naam.
Stel, we willen aan ons Karakter 4 eigenschappen toevoegen. We gaan hiervoor gebruik maken van een variabele (weet dat wanneer u wenst dat deze eigenschappen blijvend zijn ze zullen moeten bewaard worden, maar dit zijn zorgen voor later). De gewenste eigenschappen zijn:
- IsLevend – deze eigenschap houdt bij of ons karakter nog steeds in leven is of niet.
- Naam – de naam die we ons karakter wensen te geven.
- Gezondheid – een waarde tussen 0 en 100 die aanduidt hoe gezond ons karakter nog is.
- MaxGezondheid – de maximale gezondheid voor mijn karakter
Deze eigenschappen willen we toevoegen aan ons ThirdPersonCharacter, we gaan deze dus moeten toevoegen aan de Blueprint Class van ons karakter. Omdat ons karakter reeds toegevoegd is aan het level vindt u deze in de World Outliner als ThirdPersonCharacter.
- Klik op Edit ThirdPersonCharacter in de World Outliner.
Er zijn 2 manieren om een variabele toe te voegen aan deze Blueprint Class.
In het tabblad My Blueprint, klik op Add New – Variable.
In het tabblad My Blueprint, klik op ket +-teken achter Variables.
- Gebruik nu één van bovenstaande methode om een variabele toe te voegen.
- Deze nieuwe variabele komt met de standaardnaam NewVar_0 (of een ander volgnummer).
- Wijzig deze naam in IsLevend en druk op Enter (of klik buiten het invulvak).
- Herhaal dit proces nu voor de andere 3 variabelen die moeten worden aangemaakt.
We hebben nu de nodige eigenschappen (als variabelen) toegevoegd.
Indien u eventueel nog wijzigingen wenst aan te brengen (zoals de naam veranderen, kopiëren of verwijderen), klik dan met de rechtermuisknop ingedrukt op de variabele die u wenst te wijzigen en kies de gewenste actie.
Zoals onderstaande video toont kunt u ook variabelen aanmaken door een invoer- of uitvoerpin te promoten tot variabele (Promote to variable).
Datatypen
Een variabele moet van een bepaald datatype zijn. Voor onze eigenschappen (variabelen) geldt dat:
- IsLevend – bevat een waarde Waar of Onwaar.
- Naam – bevat een niet opgemaakte tekst.
- Gezondheid – een geheel getal (we zouden ook een decimaal getal kunnen kiezen).
- MaxGezondheid – een geheel getal (we zouden ook een decimaal getal kunnen kiezen).
Hieronder ziet u de meest gebruikte datatype maar er zijn er nog en eigenlijk kan iedere klasse dienst doen als een datatype via een referentie naar die klasse.
Boolean | Een Boolean-variabelen kan maar één van twee mogelijke waarden bevatten: Waar of nietwaar, ja of neen, aan of uit, 0 of 1, …. | |
Integer | Een Integer-variabele kan een geheel getal bevatten. | |
Float | Een Float-variabele kan een decimaal getal bevatten. | |
String | Een String-variabele kan een tekst bevatten. | |
Text | Een Tekst-variabele kan een opgemaakte tekst bevatten. | |
Vector | Een Vector-variabele kan een vector bevatten of eigenlijk drie Float-getallen en kan bijgevolg dus ook gebruikt worden om bv. een kleur bij te houden (RGB). | |
Rotator | Een Rotator-variabele bevat de waarden van een rotatie. | |
Transform | Een Transform-variabele kan transformatiewaarden (positie, rotatie en schaal) bevatten. | |
Object | Een Object-variabele kan een verwijzing naar een object/actor bevatten. |
Vertaald naar onze eigenschappen (variabelen) wordt dit:
- IsLevend – bevat een waarde Waar of Onwaar = Boolean.
- Naam – bevat een niet opgemaakte tekst = String.
- Gezondheid – een geheel getal (we zouden ook een decimaal getal kunnen kiezen en als we delingen wensen uit te voeren zouden we dit beter doen) = Integer.
- MaxGezondheid – een geheel getal (we zouden ook een decimaal getal kunnen kiezen en als we delingen wensen uit te voeren zouden we dit beter doen) = Integer.
Merk op hoe Unreal Engine kleuren gebruikt om de datatypen visueel te duiden.
Als u nu kijkt naar de door ons aangemaakte variabelen dan hebben die allemaal een rode kleur. Ze zijn dus allemaal van het datatype Boolean.
Dit Boolean-type is oké voor de variabele IsLevend, maar niet voor de andere variabelen, deze gaan we moeten wijzigen.
De variabele Naam moet van het type String zijn.
- Selecteer de variabele Naam.
- In het Details-panel selecteert u String uit de keuzelijst Variable Type.
De variabele Gezondheid moet van het type Integer zijn.
- Selecteer de variabele Gezondheid.
- In het Details-panel selecteert u Integer uit de keuzelijst Variable Type.
De variabele MaxGezondheid moet van het type Integer zijn.
- Selecteer de variabele MaxGezondheid.
- In het Details-panel selecteert u Integer uit de keuzelijst Variable Type.
Aan de kleuren herkent u de toegekende datatypen.
Waarden toekennen en opvragen (SET en GET)
Standaardwaarden
We wensen de volgende waarden aan onze variabelen toe te kennen:
- IsLevend – waar.
- Naam – uw eigen naam.
- Gezondheid – bij het opstarten moet Gezondheid dezelfde waarde krijgen als MaxGezondheid.
- MaxGezondheid – 100.
De variabelen IsLevend, Naam en MaxGezondheid kunnen allen een standaardwaard (Default Value) krijgen.
- Selecteer de variabele IsLevend.
- In het Details-panel zet u een vinkje (aangevinkt staat voor Waar) bij Default Value.
- Selecteer de variabele Naam.
- In het Details-panel typt u uw naam in bij Default Value.
- Selecteer de variabele MaxGezondheid.
- In het Details-panel geeft u de waarde 100 in bij Default Value.
SET
De variabele Gezondheid moet de waarde krijgen van de variabele MaxGezondheid.
Dit kan het best gebeuren bij het starten van het programma, dus bij het uitvoeten van de event BeginPlay.
- Ga naar de Event Graph van de ThirdPersonCharacter Blueprint (wellicht staat u hier al).
U ziet reeds verschillende events geprogrammeerd staan.
- Versleep, met de rechtermuisknop ingedrukt, de inhoud van de Event Graph zodat u in een lege ruimte van de Event Graph komt (en niet meer gestoord wordt door de bestaande events).
- Sleep, gewoon met de linkermuisknop ingedrukt, nu de variabele Gezondheid naar de Event Graph.
U krijgt de keuze uit Get Gezondheid of Set Gezondheid.
- U kunt ook de variabele slepen met de Ctrl-toets ingedrukt om meteen een Get te krijgen.
- U kunt ook de variabele slepen met de Alt-toets ingedrukt om meteen een Set te krijgen.
Het verschil is:
- Get Gezondheid zal een waarde opvragen.
- Set Gezondheid zal een waarde toekennen.
We wensen een waarde aan de variabele Gezondheid toe te kennen dus kiest u voor Set.
- Selecteer Set Gezondheid. U ziet de SET Gezondheid node.
GET
De waarde die momenteel aan de variabele Gezondheid zou worden toegekend is 0.
Ik zou hier simpelweg 100 kunnen intypen, de standaardwaarde van de variabele MaxGezondheid, maar dit zou geen goede manier van werken zijn. Immers moesten we de standaardwaarde van de variabele MaxGezondheid wijzigen dan zouden we er ook moeten aan denken deze hier te wijzigen en misschien zou u dit wel eens kunnen vergeten.
Wat gaan we dan wel doen? Wel, we gaan de waarde van de variabele MaxGezondheid opvragen (Get).
- Sleep de variabele MaxGezondheid naar de Event Graph.
U krijgt weer de keuze uit Set MaxGezondheid en Get MaxGezondheid.
- U wenst de waarde op te vragen dus kiest u voor Get MaxGezondheid. Onderstaande GET MaxGezondheid node wordt toegevoegd.
Merk de verschillen op tussen de SET en GET nodes.
GET | De GET-node heeft geen invoerpin, enkel een uitvoerpin. | |
SET | De SET-node heeft een invoerpin en ook een uitvoerpin, net als Exec-pinnen waardoor de SET-node deel kan uitmaken van de instructies. De SET-node is dan ook een instructie. |
- Om nu de waarde van de variabele MaxGezondheid toe te kennen aan de variabele Gezondheid moet u de uitvoerpin van GET MaxGezondheid verbinden met de invoerpin van SET Gezondheid. Of anders gezegd, de variabele Gezondheid krijgt, als invoer, de waarde van MaxGezondheid.
Merk ook de kleuren op van de nodes, dit is dezelfde cyaan kleur van de variabele (geen toeval).
Om deze code effectief uit te voeren moeten we nog bepalen wanneer deze code moet worden uitgevoerd, bij welke event.
We wensen dat deze code wordt uitgevoerd bij het starten van het spel, dus bij de event BeginPlay.
- Sleep een verbindingslijn vanuit de inkomende (linkse) Exec-pin van de SET Gezondheid node.
- Zoek naar Event BeginPlay en klik deze aan.
De verbinding is gemaakt en als u begint te spelen zal de variabele Gezondheid de waarde krijgen van de variabele MaxGezondheid.
Conversies
Om dit te controleren gaan we de waarde van de variabele Gezondheid “uitprinten” op het scherm.
- Trek een verbindingslijn vanuit de rechtse Exec-pin van de SET Gezondheid node en zoek naar Print String (eens gevonden klikt u het aan).
- Verbind nu de uitvoerpin van de SET Gezondheid node met de invoerpin In String van de node Print String.
Merk op dat er een conversienode is toegevoegd. In String is immers van het type String (en verwacht dus een String als invoer) terwijl de variabele Gezondheid van het type Integer is. Deze Integer wordt dus eerst geconverteerd naar het type String voor deze wordt toegekend aan In String. Unreal Engine verzorgt deze conversies automatisch.
Let op, niet iedere conversie zal lukken. Stel dat u een String die uw naam bevat wilt toekennen aan een Integer dan zal dit niet lukken. Unreal Engine zal dit opvangen door een 0 toe te wijzen.
Tijd om te compileren en te bewaren.
- Klik op de knoppen Compile en Save.
- Start vervolgens het programma. Als alles goed verlopen is ziet u gedurende 2 seconden in de linkerbovenhoek van uw scherm het getal 100. De waarde van de variabele Gezondheid.
Constanten
Het verschil tussen een variabele en een constante is dat de waarde van een variabele in de loop van het programma mag en kan variëren. Bij een constante kan en mag de initiële waarde niet veranderen. Een constante is dus eigenlijk Read Only. Een praktisch voorbeeld is het getal Pi (u weet wel het getal 3.14159 dat gebruikt wordt voor o.a. berekeningen van cirkels).
In ons voorbeeld kunnen we de variabele MaxGezondheid constant maken.
In Unreal Engine Blueprints doet u dit door de eigenschap Blueprint Read Only aan te vinken.
- Selecteer de variabele MaxGezondheid.
- In het Detail-panel, vink Blueprint Read Only aan.
Merk op dat als u nu de variabele MaxGezondheid in de Blueprint sleept u enkel maar de GET kunt selecteren. U kunt dus enkel maar de waarde opvragen en niet wijzigen.
Onderstaande video toont nog eens wat hier besproken is met de nadruk op Datatypen.
Extra – Variabelen beschikbaar maken
Een klasse is een basisontwerp waar instanties van kunnen genomen worden. Zo is ThirdPersoncharacter een klasse en de ThirdPersoncharacter in onze level een instantie (later komen klassen uitgebreider aan bod).
Als u wilt dat deze instanties toegang hebben tot bepaalde variabelen dan moet u deze toegankelijk maken.
U doet dit door de eigenschap Instance Editable aan te vinken (of door het oogje na de variabele aan te klikken).
- Selecteer de variabele Naam en klik het oogje naast de variabele aan of vink in het Detail-panel de eigenschap Instance Editable aan.
- Terwijl u toch bezig bent kunt ook het best meteen een Tooltip ingeven. Een Tooltip is een extra woordje uitleg over het doel en het nut van de variabele.
Merk op dat deze eigenschap nu ook beschikbaar is vanuit een level (nadat u gecompileerd en bewaard hebt natuurlijk).
Expose on Spawn
Spawnen is de actor laten verschijnen in een level. Eigenlijk de actor creëren binnen een level.
Als u wilt dat een bepaalde variabele reeds meteen beschikbaar is als de actor wordt gespawned dan moet u de eigenschap Expose on Spawn aanvinken.
In bovenstaand voorbeeld had ik dit reeds gedaan voor de variabele Naam.
Als u nu de actor wilt spawnen kan dit via Spawn Actor from Class.
- Klik met de rechtermuisknop ingedrukt in de Level Blueprint en zoek naar spawn actor from class.
- Vervolgens selecteert u de gewenste klasse (hier ThirdPersoncharacter).
Merk op dat de variabele Naam meteen beschikbaar is met de standaardwaarde ingevuld. Zo u wilt kunt u deze altijd nog wijzigen.
- U kunt vervolgens via Return Value de andere variabele opvragen.
Weet u nog waarom we voor MaxGezondheid enkel een GET zien?
Uiteraard moeten we ook nog een locatie meegeven en aangeven bij welke event dit moet gebeuren.
Praktisch voorbeeld
Hieronder ziet u een uitgewerkt voorbeeld waar een Point Light wordt gespawned
De locatie is de locatie van de actor waarin dit geprogrammeerd is en wordt opgevraagd via Get Actor Transform.
Light Color is een variabele waarvoor Exposed on Spawn aangevinkt is en hier de waarde van een andere variabele, maar met dezelfde naam Light Color, krijgt.
Expose to Cinematics
Wilt u de variabele kunnen gebruiken in Cinematics (Sequencer), vink dan Expose to Cinematics aan.
Private
Als de variabele enkel maar mag gekend zijn en aanpasbaar binnen de klasse zelf, en dus niet door afgeleide klassen, dan moet u Private aanvinken.
Specifieke instellingen
Moet de variabele ook aanpasbaar zijn vanuit “cinematics” dan moet u de eigenschap Expose to Cinematics aanvinken.
Moet de variabele over het netwerk (in een multiplayer omgeving) gekopieerd worden, kies dan voor de eigenschap Replicate de waarde Replicated.
Opmerking, heel vaak zullen variabelen Instance Editable en Expose on Spawn zijn.
Ongebruikte variabele verwijderen
U kunt Unreal Engine laten zoeken naar ongebruikte variabelen en deze laten verwijderen.
- Ga naar Edit – Delete Unused Variables.
Extra – Casting
Stel u wilt vanuit Level Blueprint toegang hebben tot de Naam van uw karakter. Merk op dat u niets vindt.
Level Blueprint heeft dus geen weet van de eigenschappen (variabelen) van de klasse ThirdPersonCharacter.
ThirdPersonCharacter is ons spelkarakter, we kunnen dit opvragen via Get Player Character. Vervolgens doet u een Cast to ThirdPersonCharacter.
Als ThirdPersonCharacter hebt u vervolgens toegang tot de variabelen (bv. de Naam).
Onderstaand voorbeeld toont bij de start van het programma de naam van ons karakter. Merk ook de conversie op.
Extra – Referentie
Het zal vaak voorkomen dat u tijdens het programmeren denkt “deze waarde kan ik later hergebruiken, laat ik er een variabele van maken.”
Wel, u kunt dit ten allertijden doen.
Ik herneem even onze casting.
Deze casting geeft u toegang tot alle variabelen, en niet enkel onze eigen aangemaakte variabelen maar ook alle reeds standaard aanwezige variabelen, van ons ThirdPersonCharacter. Om die casting niet telkens opnieuw te moeten uitvoeren, iedere keer we een eigenschap/variabele van ons ThirdPersonCharacter nodig hebben (binnen de Level Blueprint, zouden we van ons gecaste ThirdPersonCharacter beter als een variabele bewaren of promoveren tot een variabele. We noemen dit ook wel eens een referentie.
Een referentie aanmaken kan heel eenvoudig:
- Verwijder eerst de Print String en de conversie (selecteren en Delete-toets).
- Klik met rechtermuisknop ingedrukt op de pin As Third Person Character.
- Kies Promote to Variable.
U ziet een SET van een New Var 0-variabele van het type ThirdPersonCharacter.
De naam kan in het Detail-panel gewijzigd worden. Merk ook het Variable Type op dat van het type Third Person Character is.
In het My Blueprint-panel ziet u de variabele MijnKarakter staan.
U kunt deze variabele vervolgens slepen in het level en hergebruiken zonder dat u telkens die casting moet doen.
Objecten
Een variabele kan een object van een bepaald type zijn.
Laat ons een variabele Light-object toevoegen.
- Maak een nieuwe variabele aan en geef het een gepaste naam (bv. MijnLicht).
- In het Details-panel zoekt u onder Variable Type naar Light.
- Merk op dat u dit vindt onder Object Types.
Onderstaande Blueprint toont hoe u een kleur van het licht kunt instellen.
Merk op de Light Color een Structure is de “gemaakt” wordt via Make LineairColor.
Enumeraties
Een enumeratie is een vooraf gedefinieerde lijst met waarden. Er bestaan tientallen enumeraties in Unreal Engine waar u kunt gebruik van maken. Bv. voor Naviagtion en Movement. Laten we twee variabelen aanmaken die respectievelijk de Navigation en Movement enumeratie gebruiken.
- Maak een nieuwe variabele aan en geef het een gepaste naam (bv. MijnNavigatie).
- In het Details-panel zoekt u onder Variable Type naar Navigation.
- Merk op dat u dit o.a. vindt onder Enum.
- Herhaal dit voor een Movement-Enumeratie.
- Klik op Compile.
Als u de variabele wilt een waarde toekennen via een SET ziet u dat u een keuzelijst krijgt met de vooraf bepaalde waarden.
Onderstaande Blueprint gebruikt beide variabelen om de Movement van het Character in te stellen (SET).
Een eigen Enumeratie aanmaken
Het is, uiteraard, ook mogelijk om een eigen Numeratie aan te maken.
Als voorbeeld neem ik de namen van mijn 3 kindjes.
Een eigen Enumeratie is eveneens een Blueprint.
- Ga in de Content Browser naar een map waar u uw eigen Blueprints verzameld (of ga bv. naar Content – ThirdPersonBP – Blueprints).
- Kies in de Content Browser voor Add New of klik met de rechtermuisknop ingedrukt in de map en kies voor Blueprints – Enumeration.
- Geef vervolgens deze nieuwe Blueprint een passende naam (bv. Kindjes) en dubbelklik om te openen.
- Geef eerst een omschrijving in (niet verplicht maar toch handig).
- Klik op de knop New om nieuwe waarden in te geven.Geef de gewenste waard/naam in achter Display Name en voeg eventueel een Description toe. De pijltjes achteraan kunt u gebruiken om eventueel de volgorde te wijzigen en met het kruisje kan je een variabele opnieuw verwijderen.
- Klik op Save om te bewaren.
- Keer terug naar u ThirdPersonCharacter Blueprint.
- Maak een nieuwe variabele aan (bv. MijnKindjes).
- Zoek naar Kindjes. U vindt de enum Kindjes.
- Voeg de variabele MijnKindjes toe aan de Blueprint. Merk bij de SET de keuzelijst op.
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 BC250 – kan bij het programmeren in functie van een specifieke ontwikkelomgeving, een juiste logica volgen