In de vorige lessen heb je geleerd hoe je een level kan bouwen en de Player daarin rond kan laten lopen en springen, maar als je nu van het level af valt blijf je oneindig vallen. In deze les ga je leren hoe je gevaarlijke objecten toe kan voegen die ervoor zorgen dat het level opnieuw gestart wordt.
Je begint met het maken van een nieuw script dat je toe zal kunnen voegen aan alle dingen die gevaarlijk in je spel zullen zijn. Dat zal nu alleen een grote balk onder je level worden, maar later kan je dit ook voor obstakels en vijanden gebruiken. Maak een nieuw script aan met de naam Gevaar. Als je het vergeten bent: een script kan je aanmaken door met de rechtermuisknop in de Assets te klikken, dan op Create en ten slotte op 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 laat het eerste { haakje en het laatste } haakje staan!
Voordat we verder gaan kijk je even bovenaan in dit script. Hier zie je verschillende regels die beginnen met using. Dit is een Engels woord dat ‘gebruikt’ betekent. De dingen die daar achter staan, zoals UnityEngine en System.Collections zijn dingen die je namespace of library noemt. Een namespace is een verzameling van classes. Door dit bovenaan in het script te zetten vertel je de computer dat je die classes in je script wil kunnen gebruiken. In de UnityEngine namespace zit bijvoorbeeld de Input klasse die je gebruikt hebt om te kijken of toetsen waren ingedrukt.
Om het level te herstarten hebben we een andere klasse nodig die je nu nog niet kan gebruiken omdat hij bij een namespace hoort die we nog niet kunnen gebruiken. Zet daarom onder de andere regels die met using beginnen de regel ‘using UnityEngine.SceneManagement;‘:
De UnityEngine.SceneManagement namespace bevat de SceneManager klasse die we nodig hebben om levels opnieuw te kunnen starten. Als we dit dus niet bovenaan de klasse zetten kunnen we deze dus niet gebruiken.
In de vorige les heb je de OnCollisionEnter2D() methode gebruikt. De instructies die je daar in zet worden uitgevoerd zodra een object met een Collider2D component tegen het object waar het script aan toegevoegd is aanbotst. Voor dit script gebruik je een iets andere methode, namelijk OnTriggerEnter2D(). Om deze makkelijk te maken typ je binnen de { } haakjes van de klasse ‘ote2’ en druk je op enter.
Het verschil tussen OnCollisionEnter2D() en OnTriggerEnter2D() is dat met een Trigger je niet tegen het object aan kan botsen en er niet op kan staan zoals bij de grond, maar dat het voor het script wel gewoon werkt. Dit ga je gebruiken om een gevaarzone te maken onderaan het level die het level opnieuw opstart als de Player er in valt.
Zet nu in deze methode SceneManager.LoadScene();. Met deze instructie gebruik je de LoadScene() methode van de SceneManager klasse om een level te laden. Tussen de haakjes moet je de naam van het level zetten dat je wil laden.
Omdat je met dit script het actieve level opnieuw wil laden moet je daarvan dus de naam van tussen de haakjes zetten. Om dit te doen gebruik je weer een methode van de SceneManager klasse: GetActiveScene(). Als je daar dan een punt achter zet kan je alles gebruiken dat bij het actieve level hoort, inclusief de naam (name)! Zet dus tussen de haakjes achter LoadScene ‘SceneManager.GetActiveScene().name‘. Als je alles goed gedaan hebt ziet de klasse er nu zo uit:
Dit script is voor nu compleet, dus ga je terug naar Unity om het te gebruiken 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 Gevaarzone. 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 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.
Als laatste moet je er nog voor zorgen dat het script alleen werkt als de Player er tegenaan botst. Je wilt bijvoorbeeld niet dat als iets gevaarlijks tegen de grond aan botst of als een vijand van het level afvalt dat het level ook opnieuw gestart wordt. Hiervoor moet je in een if() testen of het object dat tegen het gevaar aanbotst wel de Player is.
Zet dus in het script op de regel boven de instructie waarmee je het level opnieuw laadt een if() neer. Tussen de haakjes van de OnTriggerEnter2D() methode had je misschien al ‘Collider2D collision‘ zien staan. Dit is een variabele die wordt ingesteld op het moment dat de methode wordt uitgevoerd en zal worden ingesteld op de Collider2D van het object dat tegen het gevaarlijke object aanbotst. Zo’n variabele noem je een parameter. Een parameter kan je alleen binnen de methode waar hij bij hoort gebruiken.
Omdat de parameter ingesteld is op de Collider2D van het object dat tegen het gevaar aanbotst, kunnen we hem gebruiken om meer informatie over dit object te krijgen. Zet tussen de haakjes van de if() ‘collision.gameObject.GetComponent<Player>()‘. Met gameObject krijg je het gameobject dat bij de Collider2D hoort. Met de GetComponent<>() methode kan je zien of dat object ook een component van het type dat je tussen de < > haakjes neerzet heeft. Als dit zo is geeft de methode als resultaat true en anders false. Zo kan je hem dus in de if() gebruiken.
Als je alles goed gedaan hebt ziet de klasse er nu zo uit:
Je bent nu klaar met de basislessen van Unity en C#. Het is niet erg als je nog niet alles snapt. Als je meer oefent en vaker werkt met deze dingen wordt je er vanzelf beter in. Om verder te gaan kan je nu zelf kiezen waar je verder aan wil werken en welke dingen je toe wil voegen aan je spel. Klik hier om naar de pagina te gaan waar je uit verschillende lesmodules kan kiezen.