Nu je een bewegende Player hebt moet de Player nog iets hebben om naartoe te lopen! Hiervoor ga je in deze derde les leren hoe je meerdere levels maakt en hoe je doelen aan je level toevoegt om naar de volgende levels te gaan.


Levels Herstarten

Je hebt vast gemerkt dat de Player oneindig blijft vallen als je van de blokjes afspringt. Om ervoor te zorgen dat je niet steeds de hele game opnieuw op hoeft te starten gaan we iets toevoeg dat het level herstart wanneer je naar beneden valt. Hiervoor moet je een methode gebruiken die nog niet beschikbaar is in de code zoals je het nu geschreven hebt. Maak eerst een nieuw C# script aan met de naam Herstart (rechtermuisknop in de Assets, dan Create, dan C# Script).

Als je dit script opent in Visual Studio door erop dubbel te klikken krijg je weer een lege klasse te zien. Bij dit script kan je de Start() en Update() methodes weghalen, dus verwijder de regels met die namen en ook de bijbehorende { } haakjes. Zorg ervoor dat je de { } haakjes van de klasse niet ook verwijdert, dus het eerste haakje en het laatste haakje.

Bovenin dit script een aantal regels zien die beginnen met using. Deze regels geven aan welke libraries in het script gebruikt kunnen worden. Een library is een database met verschillende klasses en methodes. De UnityEngine library bevat bijvoorbeeld alles wat voor Unity wordt gebruikt, zoals de RigidBody en Input klasses en de print() methode. Maak onder de using regels een nieuwe regel en zet daar using UnityEngine.SceneManagement;.

De SceneManagement library is een uitbreiding op de UnityEngine library. De belangrijkste klasse die je hiervan gaat gebruiken is de SceneManager klasse. Deze ga je gebruiken in een nieuwe methode. Maak binnen de klasse een nieuwe methode aan met void OnTriggerEnter2D(). Als het goed is maakt Visual Studio automatisch de methode af, anders moet je de bijbehorende { } haakjes niet vergeten. De OnTriggerEnter2D methode werkt ongeveer hetzelde als de OnCollisionEnter2D() methode; deze code die hierin staat wordt uitgevoerd zodra een object tegen het object waar dit script bij hoort aanbotst. Het verschil tussen een Trigger en een normale Collider is dat het object dat er tegenaan botst erdoorheen kan bewegen in plaats van dat het stopt.

Zet in deze nieuwe methode de regel SceneManager.LoadScene(SceneManager.GetActiveScene().name);. In deze regel code worden 2 methodes uit de SceneManager klasse gebruikt: LoadScene() en GetActiveScene()LoadScene() laadt de scene met de naam die je in de ( ) haakjes erachter zet. Met GetActiveScene() kan de computer de huidige scene vinden en door .name erachter te zetten zo de naam van de huidige scene verkrijgen. Deze regel code zorgt er dus voor dat de huidige scene opnieuw wordt geladen.

Dit script is voor nu compleet, dus ga je terug naar Unity om het te implementeren in je game. Klik linksboven in de Hierarchy op Create en dan op Create Empty. Je zal zien dat er een nieuw object verschijnt met de naam GameObject.  Dit is een leeg object met alleen een positie in de Scene. Je kan de naam van dit object veranderen in iets anders, bijvoorbeeld Herstart object. Voeg hier het script dat je net gemaakt hebt aan toe door het naar de Inspector te slepen met het lege object geselecteerd of door in de Inspector van het lege object op Add Component te klikken en het script te zoeken door de naam te typen.

Voeg nu ook aan dit object een Box Collider 2D toe met Add Component. Vink in de details van dit component het vakje achter IsTrigger aan, want je gebruikt in het script deze collider als trigger. In de Scene View zie je nu een groen vierkantje. Verplaats dit naar onder de blokjes van je level. Om het groter te maken verander je in de details van het Box Collider 2D component de  x-waarde van de Size naar een groot getal, bijvoorbeeld 100. Nu verandert het vierkantje in een lange platte rechthoek onder je level.

Je kan nu testen of het werkt! Als je alles goed gedaan hebt zal het level opnieuw beginnen als de Player de collider van het Herstart object aanraakt.


Nieuwe Levels

Zorg ervoor dat je het level dat je tot nu toe gemaakt hebt goed opgeslagen hebt (Ctrl + s). Zorg er ook voor dat je een prefab maakt van het Herstart object en dat je de prefab van de Player update door rechtsboven in de Inspector van het Player object op Apply te klikken (of aanmaakt als je dat nog niet gedaan had). Nu ben je klaar om een tweede level te maken! Klik linksboven in Unity op File en dan op New Scene. Je zal nu weer een lege Scene View hebben, met alleen de Camera er in als object.

Het eerste dat je moet doen als je een nieuw level maakt is het opslaan. Als je dat hebt gedaan en het een naam hebt gegeven moet je het level toevoegen aan de Build Index. De Build Index is een lijst van alle scenes die je aan je game wil toevoegen. Je kan deze lijst vinden Als je weer linksboven op File klikt en dan op Build Settings…. Je ziet dan een vak dat Scenes in Build heet. Hier moet je de scenes die je deel wil laten zijn van je spel naartoe slepen vanuit de Assets. Als je dit hebt gedaan kan je de Build Settings weer sluiten.

Met behulp van de prefabs die je hebt gemaakt kan je makkelijk een nieuw level bouwen. Als je weer terug wil naar je eerste level dubbelklik je op dat level in de Assets folder. Als je de Player, wat blokjes en het Herstart object in je tweede level hebt gezet, ga dan terug naar je eerste level.


De Deur

Zoek nu een plaatje van een open deur en plaats dat in je Assets folder in Unity. Als je bonusopdracht 1 van Les 1 nog niet gedaan hebt is het handig die nu te doen, zodat je weet hoe je sprites goed in kan stellen. Als je die gedaan hebt weet je dat je elke keer dat je een plaatje in Unity zet je de Pixels Per Unit aan moet passen. Deze sprite ga je gebruiken om een deur te maken die de Player van het ene level naar het andere kan brengen. Maak een deur object aan door de sprite in de Scene View te slepen. Aan dit object voeg je weer een Box Collider 2D toe. Maak nu een nieuw script aan met de naam Deur en voeg dat ook toe aan het object. Open dan het script.

In de Deur klasse kan je de Start() en Update() methodes weer verwijderen. In deze klasse ga je weer de OnCollisionEnter2D() methode gebruiken. Als je niet meer weet hoe je die maakt, kijkt dan in je Player klasse. Je kan hem ook daaruit kopiëren, maar verwijder dan wel wat er tussen de { } haakjes staat. We hebben voor dit script ook de SceneManager nodig, dus zet weer bovenaan in het script using UnityEngine.SceneManagement;.

Vervolgens hebben we een variabele nodig zodat de computer weet welk level geladen moet worden als de Player de deur aanraakt. Hiervoor moet de computer dus een stukje tekst (de naam van het level) onthouden. Als je de bonusopdrachten van de vorige les hebt gedaan dan weet je al welk type variabele dit moet zijn: een string. Maak dus bovenin de klasse, na het eerste { haakje een string variabele voor de naam van het level aan met public string LevelNaam;. In Unity kan je nu dus de naam van het volgende level instellen.

In de OnCollisionEnter2D() methode kan je nu de SceneManager.LoadScene() methode gebruiken om het volgende level te halen. Zet de string variabele LevelNaam tussen de haakjes van de methode en vergeet niet de regel af te sluiten met een puntkomma ;.

Als je nu naar Unity gaat en in de Inspector bij het script van de deur de naam van de scene van het tweede level zet kan je het testen. Let er wel op dat de naam hier precies zo gespeld moet worden als je hem genoemd hebt toen je het level opsloeg. Je kan de namen van je scenes altijd aanpassen in je Assets. Als alles goed gaat kan je nu van je eerste level naar het tweede gaan! Maak nu ook van je Deur object een prefab en plaats in je tweede level een deur die weer naar het eerste level gaat.


De Sleutel

Om een extra uitdaging aan je level toe te voegen ga je er nu voor zorgen dat de Player eerst een sleutel op moet pakken voordat de Deur open gaat en je naar het volgende level kan gaan. Hiervoor heb je een plaatje van een gesloten deur en een sleutel nodig, dus vind die en plaats ze in je Assets. Vergeet de Pixels Per Unit niet aan te passen. Verander de sprite van het deur object door de gesloten deur sprite naar het vakje achter Sprite in het Sprite Renderer component van de deur te slepen. Maak nu een object van de de Sleutel sprite en voeg daar een box collider aan toe. Vink ook het vakje achter Is Trigger weer aan. Maak dan een nieuw script aan met de naam Sleutel en voeg dit ook toe aan het sleutel object.

Voordat je met het script van de Sleutel bezig kan gaan moet je eerst het Deur script aanpassen. De computer moet kunnen bijhouden of de deur open of gesloten is. Maak hiervoor een bool variabele aan met de naam Open (public bool Open;). Deze variabele moet dus true zijn als de deur open is en false als hij nog niet open is. In de OnCollisionEnter2D() methode maak je nu op de regel boven SceneManager.LoadScene(LevelNaam); een if(). Zet in de haakjes van deze if() de naam van de bool variabele die je net gemaakt hebt: Open. Nu kan het volgende level alleen geladen worden als de deur open is.

Maak nu in de Deur klasse een nieuwe methode aan met de naam OpenDeur(). Zet public void voor de naam en vergeet de { } haakjes erachter niet. In deze methode ga je alles zetten wat er moet gebeuren als je Player de sleutel oppakt en de deur open gaat. Als eerste moet Open op true gezet worden met Open = true;. Verder moet de sprite die voor de deur gebruikt worden veranderen van een gesloten deur naar de open deur sprite. Hiervoor maak je bovenin de klasse een nieuwe variabele aan van het type Sprite ( public Sprite OpenDeurSprite; ). In Unity kan je de sprite instellen door het plaatje van de open deur vanuit Assets te slepen naar het vakje achter Sprite in het Deur script component van het Deur object.

In de OpenDeur() methode kan je nu met GetComponent<SpriteRenderer>().sprite = OpenDeurSprite; de sprite instellen op de open deur sprite. De GetComponent<>() methode is een speciale methode die je kan gebruiken om vanuit het script componenten die aan een object vastzitten aan te passen. In de <> haakjes achter de naam van de methode zet je het type component dat je wil aanpassen. Als je een punt achter de methode zet kan je alle dingen zien die bij het component horen en die je kan gebruiken of aan kan passen, in dit geval dus de sprite.

Nu je de deur kan openen is het tijd om de Sleutel klasse te gaan maken. Hier kan je ook weer de Start() en Update() methodes verwijderen. Om bij te houden bij welke deur de sleutel hoort maak je eerst bovenin de klasse een variabele aan van het type Deur public Deur Deur; ). Hierdoor kan je in Unity de deur instellen waar de sleutel bij hoort door het deur object naar het vakje achter Deur in het script component van de sleutel te slepen. Nu kan je ook in het script de OpenDeur() methode aanroepen vanuit de Sleutel klasse. Dit doe je weer in de OnTriggerEnter2D() methode, dus maak die aan. De deur openen doe je dan in die methode met Deur.OpenDeur();. Ten slotte moet je er ook voor zorgen dat de sleutel verdwijnt als de Player hem oppakt. Dit doe je met de Destroy() methode. Tussen de haakjes van die methode zet je gameObject. Dit verwijst naar het object waar het script een component van is.

Als je alles nu goed hebt ingesteld kan je het testen. Test ook of de deur niet werkt als je de sleutel nog niet hebt opgepakt. Als alles werkt sleep dan in de Hierarchy het Sleutel object op het deur object. Hierdoor wordt het sleutelobject een kind (child) van het deur object en weet de computer dat ze bij elkaar horen. Hierdoor zal als je de deur beweegt ook de sleutel bewegen, dus altijd eerst de deur neerzetten waar je hem wil hebben en daarna de sleutel. Als je nu op Apply klikt in de Inspector van het deur object zal de sleutel ook deel worden van de prefab van de deur. In je tweede level zal nu ook een sleutel staan die je nog moet verplaatsen.


De Volgende Les

Nu je verschillende levels hebt gemaakt en doelen om van het ene naar het andere level te komen moet je de levels wat moeilijker maken dan alleen lopen en springen! De volgende les gaat dus over Obstakels en Vijanden. Klik hier om naar de bonusopdrachten voor deze les te gaan om extra te oefenen en andere dingen te doen die je game nog beter maken. Als je klaar bent voor de volgende les klik dan hier om naar les 4 te gaan.

Categorieën: Programmeerlessen

Subscribe
Abonneren op
guest
0 Reacties
Inline feedbacks
Bekijk alle reacties