Ingewikkeldheid: Unity C#
Benodigde Modules: Rotsblok (tot en met het aanpassen van de Player & Gevaar classes)
In deze module ga je de eerste vijand aan je spel toevoegen. Dit zal nu een vijand zijn die op en neer springt, maar die je in latere modules ook andere dingen kan laten doen.
Om te beginnen heb je weer een plaatje nodig van een vijand waarbij het past dat hij op en neer springt. Je kan zelf weer een plaatje maken of zoeken of een van deze voorbeelden gebruiken:
Zet deze weer in je Assets en vanuit daar op de plek in je level waar je hem wil hebben.
Omdat het object nu alleen nog maar een plaatje is moet je weer andere componenten toevoegen. Je moet tegen de vijand aan kunnen botsen en de vijand moet op de grond blijven staan, dus is er weer een Collider2D nodig. Ga weer naar Add Component in de Inspector en kies een collider met een vorm die bij het plaatje past.
De vijand moet ook kunnen bewegen, dus moet je ook nog een Rigidbody2D component toevoegen. Ten slotte moet de vijand gevaarlijk zijn en het level opnieuw beginnen wanner de Player hem aanraakt, dus moet je ook het Gevaar script toevoegen aan het object.
Als je dit gedaan hebt is het tijd om een nieuw script te maken. Klik dus weer met de rechtermuisknop in de Assets en ga naar Create -> C# Script. Noem dit script ‘Vijand’. Open dit script in Visual Studio door er op te dubbelklikken.
Als je met een nieuw script begint is het vaak handig om te bedenken welke dingen je bij dit script allemaal nodig zal hebben en in wil kunnen stellen, dus welke variabelen je nodig gaat hebben. Variabelen zet je altijd bovenin de class neer, dus op de regel na het eerste { haakje.
Net als bij de Player klasse moet je de Rigidbody2D in het script kunnen gebruiken om de vijand via het script te laten bewegen. Zet dus als eerste variabele ‘public Rigidbody2D Body;‘ neer.
Voor het springen van de vijand zijn ook twee dingen nodig die je in moet kunnen stellen: hoe hoog de vijand moet kunnen springen en om de hoeveel seconden de vijand moet springen. Dit zijn allebei dingen waar je een getal in moet kunnen stellen, dus gebruik je het type float. De instructie waarmee je deze variabelen aanmaakt wordt dus: ‘public float SpringHoogte, SpringTijd;‘.
Vijanden zijn er om verslagen te worden, dus moet je ook bijhouden of de vijand nog leeft of niet. Maak dus ook een variabele aan van het type bool, die je Dood noemt. Deze is dus false als de vijand nog leeft en true als hij verslagen is. De instructie is ‘public bool Dood;‘.
Om de vijand te laten springen ga je nu een speciaal soort methode gebruiken die een coroutine heet. Het verschil tussen een normale methode en een coroutine is dat je in een coroutine kan aangeven dat er even gewacht moet worden voordat de methode verder gaat met de instructies uitvoeren.
Het maken van een coroutine werkt hetzelfde als een normale methode, maar in plaats van void zet je IEnumerator voor de naam van de methode. Deze coroutine noem je ‘Springen’. De regel waarmee de methode aangemaakt wordt is dus ‘public IEnumerator Springen()‘. Zet dit onderaan in de class, dus voor het laatste } haakje. Op de volgende regels zet je weer { } haakjes, waarin je de instructies die bij deze methode horen gezet kunnen worden:
De vijand moet blijven springen zolang hij leeft. Zet daarom in deze methode ‘while(!Dood)‘. Het woordje while betekent ‘zolang’ of ’terwijl’. Het uitroepteken betekent ‘niet’. Een while() werkt ongeveer zoals een if(). Bij een if() wordt wat op de volgende regel(s) staat 1 keer uitgevoerd als wat tussen de haakjes staat waar is. Bij een while() wordt het steeds weer opnieuw herhaald, zolang wat tussen de haakjes staat waar is. Met deze regel zorg je er dus voor dat de instructies worden herhaald zolang de vijand niet dood is.
Zet op de volgende regels weer { } haakjes. Alle instructies die je tussen deze haakjes zet horen bij de while() en worden dus steeds opnieuw uitgevoerd zolang wat tussen de ( ) haakjes staat waar is.
Als eerste zet je hiertussen de instructie die ervoor zorgt dat de vijand naar boven beweegt en dus springt. Dit is hetzelfde als bij de Player, dus die regel kan je zelfs kopiëren: ‘Body.velocity = new Vector2(Body.velocity.x, SpringHoogte);‘. Hiermee stel je dus de verticale snelheid van de vijand in op het getal van de Spring Hoogte variabele die je bovenin de klasse hebt aangemaakt en die je in Unity in kan stellen.
Op de volgende regel moet je ervoor zorgen dat de methode even wacht totdat de vijand weer opnieuw kan springen. Wachten in een coroutine begint altijd met het woordje yield. Daarna kan je op verschillende manieren zeggen hoe lang er gewacht moet worden. In dit geval wordt de instructie ‘yield return new WaitForSeconds(SpringTijd);‘. Hiermee zal de coroutine wachten voor het aantal secondes dat je bij SpringTijd ingesteld hebt. Daarna gaat hij dus weer verder met de while(). De hele methode wordt dus:
Met een while() moet je wel goed opletten dat je niet de computer vast laat lopen. Daarom moet je er altijd voor zorgen dat je hem of met een yield instructie in een coroutine gebruikt, of met de instructies die er in staan ervoor zorgt dat wat tussen de ( ) haakjes van de while niet meer waar wordt.
Nu kan je terug gaan naar Unity en in de Inspector van de vijand de Body, Springhoogte en SpringTijd variabelen instellen. Een SpringHoogte van 5 en SpringTijd van 1 werkt meestal wel goed, maar je kan natuurlijk ook zelf verschillende waardes uitproberen. Als je niet meer weet hoe je de Body instelt, kijk dan hoe je dat in de basislessen bij de Player hebt gedaan. Net als bij de Player kan je in het Rigidbody2D component ook weer de Gravity Scale aanpassen om de zwaartekracht te vergroten zodat de vijand weer sneller naar beneden komt. Als alles is ingesteld kan je het uittesten!