Unity smooth movement update

Ik heb sinds de laatste blogpost een nieuwe versie gemaakt van de smooth movement waarin ik zwaartekracht en springen heb geïmplementeerd.

De code hiervoor is hieronder te zien:

Ik heb dus ervoor gezorgd dat de horizontale (x, z) beweging niet de verticale (y) verandert.

Springen en zwaartekracht is verder heel simpel; check of de speler op de grond staat en als dat zo is kan deze springen, anders wordt er zwaartekracht uitgeoefend op de verticale snelheid.

Unity Smooth first person movement

Omdat ik het dus niet eens was met de manier waarop de movement geprogrammeerd was in de te balanceren game, heb ik hier een alternatief voor ontworpen:

Het eerste wat gedaan moet worden is ervoor zorgen dat de input -1, 0 of 1 is. Dit moet niet geleidelijk aan gaan. Ik heb ervoor gekozen om dit te doen in de input settings, maar je kan het ook doen door de directe keyboard input te gebruiken.

Daarna is de volgende code het belangrijkste:

Regels 25 en 26 zijn in principe de kern voor deze “smooth” beweging.

Vector3 targetSpeed = (transform.forward * vert + transform.right * hor).normalized * maxSpeed;

speed = Vector3.Lerp(speed, targetSpeed, acceleration);

Het idee is dat je een vector (targetSpeed) hebt die direct is vanuit de input. De snelheid wordt daar nog mee vermenigvuldigd.

Ten slotte gebruik je de Vector3.Lerp functie om de speed vector geleidelijk aan naar de targetSpeed vector te laten gaan. Dit zorgt ervoor dat hij accelereert en decelereert.

Hieronder is een demo te zien vanuit first-person en nog een vanuit top-down:

Bij demo 2 is de rode vector “targetSpeed” en de rode vector “speed”.

Unity Balancing oefening

Voor deze oefening heb ik een bestaand project gebalanceerd zodat het beter speelbaar is. Het project bestaat uit een procedureel gegenereerde stad waarin de speler een bepaalde hoeveelheid tijd heeft om van bolletje naar bolletje te gaan. Als de speler een bolletje aanraakt gaat de score omhoog en wordt er een nieuw bolletje gespawnt.

Het idee van deze oefening is dat we de code niet aanpassen, maar enkel de publieke variabelen van de scripts.

Hieronder is de game te zien in de door mij bewerkte staat:

Doordat de traptrede net niet laag genoeg is bleef de speler hier hangen. Daarom heb ik onder de Character Controller de Step Offset veranderd naar 0.3

Een probleem dat ik heb opgemerkt dat niet aan te passen is door middel van variabelen is wanneer de speler op snelheid is en van richting veranderd. Wat er dan gebeurt is dat de snelheid niet minder wordt maar gelijk blijft, alleen dan in de andere richting. Dit fenomeen is te zien in onderstaande video:

Onderstaande afbeelding laat de bijbehorende code zien, die te vinden is in het script PlayerController.cs. Interessant om te noemen is onder else, noMoveFriction moet tussen 0 en 1 zijn. Hoe dichter bij 1, hoe langzamer de daling in snelheid is en hoe hoger de wrijving dus is. Dit was niet gelijk duidelijk, maar door in het script te kijken wel.

Wat opvalt, is de volgende regel:

Vector3 velXZ = (vert * transform.forward + hor * transform.right).normalized * speed;

Hierin is te zien dat de snelheid niet verandert wanneer de richting verandert. Zelf wil ik hier nog mee experimenteren, maar voor nu weet ik niet een directe oplossing.

Van deze les heb ik geleerd hoe componenten publieke variabelen kunnen groeperen. Ook is het nu iets helderder hoe met vectoren gerekend moet worden voor een game. Balanceren vanuit een bestaande code is echter iets waar ik al veel ervaring mee heb door GameMaker, dus dat is niet nieuw voor mij.

First Unity test

In de eerste les Unity heb ik kennis gemaakt met het maken van een terrein en het importeren van assets (zie hierboven). Eerder heb ik al Unity gebruikt om maps te maken, maar dit is de eerste keer waarin ik echt de game-logica gebruik van Unity:

Ik heb de tutorial van Brackeys gevolgd, waarin duidelijk alle onderdelen waarop Unity is ingedeeld wordt uitgelegd. Ik heb hier erg veel aan, omdat ik op deze manier mijn uitgebreide ervaring met GameMaker makkelijk kan overbrengen. Het resultaat van de tutorial is hieronder te zien:

Het spel bestaat uit een main menu, twee levels waarin de speler met WASD toetsen de kubus kan besturen om bij het einde te komen, en daarbij het water en de bomen moet ontwijken. Ook is er een scherm met het einde waarop staat dat je gewonnen hebt.

De dingen die ik van deze les geleerd heb zijn:

  • Hoe je een user interface kan toevoegen aan je game
  • Hoe scenes werken
  • Hoe components werken die je toevoegt aan objecten
  • Hoe prefabs werken
  • Hoe de C# werkt in combinatie met Unity
  • Hoe animaties werken