Ingewikkeldheid: Unity 3 out of 5 stars C# 3 out of 5 stars

Benodigde Modules: 3D Basis Unity, 3D Model Maken (als je zelf een 3D model wil maken)


In deze module ga je een 3D model voor de Speler dat je zelf hebt gemaakt (of ergens online hebt gevonden) laten bewegen.


Als het goed is heb je in je Assets nu een 3D model dat je naar de Scene kan slepen en er zo een object van maakt. Je hebt nu een object dat ook een kind object heeft, waarop het Mesh Renderer component zit. Het is soms handiger om de prefab te unpacken en het kind object met de Mesh Renderer er los van te maken en daarmee verder te gaan.

Om het object te later bewegen gebruik je net als in 2D een Rigidbody. Voeg dus dit component toe. Om ervoor te zorgen dat de speler straks niet alle kanten op draait zet je bij dit component bij Constraints een vinkje achter X, Y en Z. Zet ook de Collision Detection op Continuous in plaats van Discrete. Dit zorgt ervoor dat de computer meer rekenkracht gebruikt om ervoor te zorgen dat de botsingen preciezer zijn.

Om ervoor te zorgen dat het model niet door de grond valt moet je ook aan dit object een Collider toevoegen. Voor een object als dit werkt een Capsule collider goed. Omdat de onderkant rond is kan je schuine vlakken oplopen waar je anders misschien op zou blijven steken.


Maak nu een script met de naam Speler. In dit script ga je alles neerzetten dat nodig is om de speler te laten bewegen en later ook andere dingen.

Om te beginnen heb je een aantal variabelen nodig, dus zet deze bovenaan in de class:

  • Drie float variabelen om de loop snelheid, draaisnelheid en de spring hoogte in te stellen. Noem deze LoopSnelheid, DraaiSnelheid en SpringHoogte.
  • Een Rigidbody variabele zodat je dat component in het script kan gebruiken. Noem deze Body.

In de Start Methode van de Speler class gebruik je nu de GetComponent methode om ervoor te zorgen dat de Rigidbody automatisch wordt ingesteld aan het begin van de scene. De regel code wordt dus: Body = GetComponent<Rigidbody>();.

De class moet er nu zo uitzien. De groene tekst na de //’s is commentaar en dit hoef je niet per se over te schrijven.


Ga nu naar de Update methode. Je gaat nu eerst kijken welke toetsen ingedrukt zijn en hoeveel de speler daarom moet bewegen. Je gebruikt hiervoor een nieuw type variabele dat lijkt op de Vector2 die je in 2D hebt gebruikt. Omdat het nu 3D is kan je vast al raden dat de nieuwe variabele Vector3 is. Deze bestaat dus uit 3 float variabelen: x (horizontaal), y (verticaal) en z (vooruit). Voor het lopen gebruik je de x en de z, voor het springen de y.

Je maakt nu twee Vector3 variabelen in de Update methode; een voor zijwaarts en een voor vooruit. De code die je hiervoor nodig hebt is: Vector3 vooruit = transform.forward * Input.GetAxis(“Vertical”); en Vector3 zijwaarts = transform.right* Input.GetAxis(“Horizontal”);.

Transform.forward en transform.right zijn de richtingen die je instelt. Deze vermenigvuldig je met het getal dat uit de Input.GetAxis() methode komt. De Input class heb je eerder gebruikt en bevat alle methodes die te maken hebben met besturing via muis en toetsenbord etc. De GetAxis() methode zorgt ervoor dat je meerdere vormen van besturing tegelijkertijd kan gebruiken. Voor de “vertical” GetAxis werken standaard bijvoorbeeld zowel de W en S-toetsen en pijltoets naar boven en beneden, maar ook bijvoorbeeld de stick van een controller naar boven en beneden bewegen.

Nadat je deze twee Vector3’s hebt gemaakt maak je nog een Vector3 die je beweging noemt. Deze stel je in door de vooruit vector en de de zijwaarts vector bij elkaar op te tellen: Vector3 beweging = vooruit + zijwaarts;.

Nu kan je deze beweging vector gebruiken om de speler echt te laten bewegen. Hiervoor gebruik je de MovePosition methode van de Rigidbody. In de ( ) haakjes achter deze methode zet je de nieuwe positie waar de speler naartoe moet gaan. Dit doe je door bij de huidige positie de genormaliseerde beweging vector, vermenigvuldigd met de LoopSnelheid en de tijd (Time.deltaTime), op te tellen. De hele regel code wordt dus: Body.MovePosition(Body.position + beweging.normalized * LoopSnelheid * Time.deltaTime);. Normaliseren met .normalized doe je zodat het altijd consistente resultaten geeft. Vermenigvuldigen met de tijd doe je zodat de snelheid per seconde zal zijn en dus makkelijk in te stellen.

De totale Update methode tot nu toe:Je kan nu dit script toevoegen aan het Speler object om te testen of het werkt. Vergeet niet de LoopSnelheid in te stellen!


 

Als je het getest hebt zal je zien dat de Speler wel beweegt als je het toetsenbord gebruikt, maar alleen maar vooruit blijft kijken. Daarom ga je nu zorgen dat de Speler ook rond kan draaien als je de muis naar links of rechts beweegt. Maak nu eerst het Camera object een kind object van het Speler object door het op dat object in de Hierarchy te slepen. Hierdoor zal de Camera meewegen met de speler. Verplaats dan het Camera object totdat het achter de Speler staat en naar voren kijkt: Ga nu terug naar het Speler script. Onderaan in de Update methode zet je nu de volgende regel code: transform.Rotate(0, Input.GetAxis(“Mouse X”) * DraaiSnelheid, 0);. Hiermee laat je de speler rondom de Y-as draaien en dus naar links en rechts kijken. Je gebruikt weer Input.GetAxis() en dit keer dus de X (horizontale) beweging van de muis. Deze vermenigvuldig je met de DraaiSnelheid variabele zodat je in kan stellen hoe snel er gedraaid wordt.

Ga nu terug naar Unity en stel de DraaiSnelheid in. Niet te hoog! Als je alles nu goed in hebt gesteld kan je nu naar links en rechts draaien door de muis naar links en rechts te bewegen.


Het laatste wat je in deze module gaat doen is zorgen dat de Speler kan springen. In dit voorbeeld is dat met de spatiebalk, maar je kan daar ook een andere toets voor instellen. Eerst bepaal je de voorwaarde wanneer de speler moet springen dus met if(Input.GetKeyDown(KeyCode.Space)). Dit ken je nog wel van het werken in 2D.

Om de speler echt te laten bewegen ga ook weer de Y velocity (verticale snelheid) van de Rigidbody aanpassen. Dit werkt ongeveer als in 2D, maar nu moet je dus ook zorgen dat de z snelheid niet aangepast wordt. De volgende regel code wordt dus: Body.velocity = new Vector3(Body.velocity.x, SpringHoogte, Body.velocity.z);. Ga nu weer terug naar Unity, stel de SpringHoogte in. Je ziet nu dat je kan springen, maar ook dat je oneindig kan springen, wat natuurlijk niet de bedoeling is.

Maak dus bovenaan in de Speler class een bool variabele aan met de naam OpDeGrond. Hiermee ga je bijhouden of de Speler op de grond is en dus mag springen. Achteraan tussen de haakjes van de if die bepaald of de spatiebalk is ingedrukt zet je && OpDeGrond, zodat dit ook alleen maar werkt als die bool op true is ingesteld.

Zet nu een { voor de regel waarmee gesprongen wordt en een } haakje erachter, zodat de if voor meerdere regels geldt. Zet op een nieuwe regels tussen die haakjes OpDeGrond = false;. Elke keer dat de speler nu springt wordt OpDeGrond dus op false gezet en kan de Speler dus niet weer springen.

Om ervoor te zorgen dat de Speler wel weer kan springen als de grond weer aangeraakt wordt maak je onderin de class de OnCollisionEnter() methode. Dit kan je doen door ‘oce’ te typen en dan wordt het als het goed is vanzelf afgemaakt. In deze methode hoef je alleen OpDeGrond weer op true te zetten met OpDeGrond = true;.

Nu kan de Speler dus pas weer springen als het ergens tegenaan botst!


Voor de volledigheid is hier nog de volledige Speler class zoals je die in deze module zou moeten hebben gemaakt:


Nu kan je de Speler dus laten bewegen! De Camera omhoog en omlaag bewegen is wat ingewikkelder dus dat komt later. Het checken of de Speler op de grond is kan ook nog wat preciezer, dus dat ga je later ook nog verbeteren.


 

 

Categorieën: Uncategorized

guest
0 Reacties
Inline feedbacks
Bekijk alle reacties