Ingewikkeldheid: Unity 1 out of 5 stars C# 2 out of 5 stars

Benodigde Modules: Deur


In deze module ga je een sleutel toevoegen die de Player op moet pakken, zodat de deur open gaat.


Om te beginnen heb je weer plaatjes nodig van een sleutel en ook van de gesloten deur. Hier zijn weer een paar voorbeelden, maar je kunt ook je eigen plaatjes zoeken/maken.

                

Zorg dat je deze in de Assets neerzet en stel daar indien nodig in de inspector van de plaatjes ook de Pixels Per Unit weer goed in.


Eerst ga je ervoor zorgen dat de deur open of dicht kan zijn. De deur moet gesloten beginnen, dus moet je in het Sprite Renderer component van het Deur object bij Sprite nu het plaatje van de gesloten deur instellen. Dit doe je door het plaatje vanuit de Assets naar het vakje achter Sprite te slepen of door op het rondje achter sprite te klikken en dan het goede plaatje te kiezen in de lijst die dan verschijnt. Als je het goed gedaan hebt verandert het plaatje van de open deur in de gesloten deur.


Alleen het plaatje veranderen is natuurlijk niet genoeg. Ook in het script moet je in kunnen stellen dat de deur open of gesloten is en er moet ook een manier komen waarop de deur open kan gaan.

Je begint met het maken van een variabele waarmee je in kan stellen of het waar of niet waar is dat de deur open is. Hiervoor gebruik je dus een variabele van het type bool. Zet op de regel onder de andere variabele (string LevelNaam) de regel ‘public bool Open;‘. Deze moet dus true (waar) zijn als de deur open is en false (niet waar) als hij gesloten is. Nieuwe bool variabelen beginnen altijd op false dus dat hoef je nu niet in te stellen.

Om er nu voor te zorgen dat de Player alleen door de deur naar het volgende level kan gaan als die bool variabele op true staat, moet je hem toevoegen aan de if() die in de OnCollisionEnter2D() methode staat. Binnen de if() maar achter de GetComponent<>() methode die daar al staat zet je ‘&& Open‘. De && betekent dat wat daarvoor staat en wat er achter staat beiden waar moet zijn. Als een van de twee dingen niet waar is wordt de volgende regel (waarmee het volgende level geladen wordt) dus niet uitgevoerd.


Nu moet je nog een manier maken waarmee de deur open kan gaan. Op het moment dat de deur open gaat moeten er twee dingen gebeuren: de bool variabele Open moet op true gezet worden en het plaatje van de deur moet veranderen in het plaatje van de open deur. Om dit te doen ga je net zoals je in de basislessen met het springen gedaan hebt een nieuwe methode maken.

Zet om de nieuwe methode te maken onderaan in de class, dus tussen het laatste } haakje en onder het } haakje dat bij de OnCollisionEnter2D() methode hoort de regel ‘public void OpenDeur()‘. Druk daarna op enter om daaronder ruimte te maken en zet dan de { } haakjes die dan bij deze OpenDeur() methode horen en waarin je de instructies kan zetten die uitgevoerd moeten worden wanneer deze methode gebruikt wordt.

De instructie om de bool Open op true te zetten is simpel: ‘Open = true;‘. De volgende regel om het plaatje te veranderen is iets ingewikkelder. Hiervoor ga je weer de GetComponent<>() methode gebruiken, zodat je nu via het script het plaatje in kan stellen bij het Sprite Renderer component, zoals je eerder deze module in Unity gedaan hebt.

Om dit te doen moet de computer weten welk plaatje gebruikt moet worden voor de open deur, dus moet je een variabele maken van het type Sprite. Dit doe je onder de andere twee variabelen met de regel ‘public Sprite OpenDeurSprite;‘. In de OpenDeur() methode zet je nu de regel ‘GetComponent<SpriteRenderer>().sprite = OpenDeurSprite;‘. Hiermee stel je dus het plaatje van de Sprite Renderer die bij de deur hoort in op het open deur plaatje.

Als het goed is ziet je Deur script er nu zo uit:

Als dat klopt sla je het script op en ga je naar Unity. Hier moet je nu bij het Deur script component van het Deur object nog het plaatje van de open deur instellen. Dit doe je weer op dezelfde manier, maar nu sleep je het dus naar het vakje achter Open Deur Sprite in het Deur script component.


De Deur is nu klaar om door de sleutel geopend te kunnen worden. Maak nu eerst een sleutel object door het plaatje van de sleutel in het level te slepen. De sleutel moet ook aangeraakt kunnen worden, dus moet je er ook een Collider2D aan toevoegen. Kies een vorm die bij de sleutel past, bijvoorbeeld BoxCollider2D.

Als de collider wat te groot is kan je met de Edit Collider knop in dat component het groene lijntje aanpassen. Omdat je niet wilt dat de Player op de sleutel kan staan wil kunnen staan, maar wel dat er iets gebeurt wanner de Player de sleutel aanraakt maak je er weer een trigger van door het vakje bij Is Trigger aan te klikken.

Maak nu ook voor de sleutel een nieuw script door in de Assets met de rechtermuisknop te klikken en naar Create -> C# Script te gaan. Noem dit script dus Sleutel en voeg het toe aan het sleutel object. Open het script nu.


Het sleutel script heeft niets dat de hele tijd door moet gebeuren, dus de Update() methode en de { } haakjes die daarbij horen kan je verwijderen. De sleutel moet weten welke deur hij open moet maken, dus moet je in kunnen stellen bij welke Deur hij hoort. Dit doe je weer met een variabele bovenin de class: ‘public Deur Deur;‘.

In de Start() methode ga je nu ervoor zorgen dat de sleutel automatisch de deur vindt waar hij bij hoort. Dit doe je met een methode die FindObjectOfType<>() heet (Vind Object Van Type). Deze methode heeft net als de GetComponent<>() methode twee soorten haakjes, waarbij je tussen de <> haakjes het type moet instellen dat je zoekt, in dit geval dus Deur. De Deur variabele moet ingesteld worden op het resultaat dat die methode vindt. De hele regel wordt dus ‘Deur = FindObjectOfType<Deur>();‘.


Maak nu onderin de klasse weer de OnTriggerEnter2D() methode aan door ‘ote2’ te typen. Hierin moeten twee dingen gebeuren: De OpenDeur() methode van de deur die je net hebt ingesteld moet gebruikt worden en de sleutel moet verdwijnen. De instructie om de deur te openen is simpel: ‘Deur.OpenDeur();‘. Hiermee wordt dus die methode gebruikt en worden de instructie die daarin staan uitgevoerd.

Om de sleutel te laten verdwijnen moet je het object waar dit script aan vast zit vernietigen. Dit object kan je in het script altijd gebruiken met het woord gameObject. Let er op dat je dit met een kleine letter begint. GameObject met een hoofdletter is de classe die gebruikt wordt voor alle game objecten. Om een object te vernietigen gebruik je de Destroy() methode. Tussen de haakjes zet je wat je wilt vernietigen. De hele instructie wordt dus ‘Destroy(gameObject);‘.

Je moet er ook weer voor zorgen dat de sleutel alleen door de Player opgepakt kan worden. Hiervoor gebruik je weer een if() met daarin een GetComponent<>() methode die checkt of de collision, dus het object dat tegen de sleutel aanbotst, wel een Player component heeft. Als dat niet zo is moet de methode stoppen, met return;. Zet dus bovenin de OnTriggerEnter2D() methode ‘if(!collision.gameObject.GetComponent<Player>())‘ en op de volgende regel ‘return;‘. Als de collision dus niet (!) een Player component heeft stopt de methode.

De hele Sleutel methode moet er nu zo uitzien:

Als dat klopt zal alles nu moeten werken. Zet je sleutel ergens naast je deur neer en kijk of alles doet wat het moet doen. Daarna kan je de sleutel verstoppen/neerzetten op een plek waar de Player wat moeite voor moet doen.

Categorieën: Modules

guest
2 Reacties
Inline feedbacks
Bekijk alle reacties
ries
ries
1 jaar geleden

hallo ik ben bezig met de deur en nu loop ik ergens op vast want de open deur kan ik nergens vinden hoe los ik dit op