
Vincent, de persoon die game-development, lego en racen wist te combineren in zijn Hackathon project.
Vincent koos voor zijn hackathon-project een gave combinatie: racen, lego en game-development. In andere woorden: een Lego-racing game. Dat was een ambitieuze keuze, want de meeste games worden gemaakt door teams van honderden mensen die jarenlang aan het project werken. Vincent had één dag, en wilde bovendien nog dingen proberen die hij nog niet eerder had gedaan.
Om zijn game te bouwen, gebruikt hij Unity. Maar wat is Unity? Vincent helpt mij alvast met het uitleggen ervan: Unity is een cross-platform game engine ontwikkeld door Unity Technologies, primair gericht op real-time 2D- en 3D-contentcreatie. De engine ondersteunt scripting in C# via de Mono/.NET-runtime, en biedt een component-gebaseerde architectuur waarmee objectgedrag modulair kan worden opgebouwd.
Bij game-development kom je met heel andere dingen in aanraking dan bij web- en applicatiedevelopment. In dit geval wordt toevallig dezelfde programmeertaal gebruikt (een groot percentage van de software die wij ontwikkelen, bouwen wij in C#), maar verder is het een heel andere wereld. De rest van dit blogartikel is geschreven door Vincent. Ik laat hem nu aan het woord.

Achtergrond
Unity is een toonaangevende cross-platform game engine. Het stelt ontwikkelaars in staat om real-time 2D- en 3D-content te creëren, primair door middel van C#-scripting en een componentgebaseerde architectuur. Elk object in de game, van de auto tot de muren, is een verzameling van componenten die samen het gedrag bepalen.
Mijn persoonlijke uitdaging lag specifiek in de Input-component. Ik heb voorheen veel gebruik gemaakt van de Unity Engine, maar daarbij altijd de oude, simpele Input.GetKey() functies gebruikt. Het nieuwe systeem is krachtig, maar vereist een andere aanpak.
Het idee was om een lokale multiplayer-game te maken (iedereen speelt op één PC/scherm). Het belangrijkste uitgangspunt was dat de game niet al te complex moest worden zodat ik tijd had om me te verdiepen op mijn doel.

Het verschil tussen lokale multiplayer (links) en online/remote multiplayer (rechts)
De uitdaging
Unity Input System
Het oude Unity Input Systeem waarmee ik bekend was, was makkelijk op te zetten, maar
werd vrij snel vrij omslachtig zodra je meerdere spelers wilde toevoegen. Voor lokale
multiplayer moest je speler input handmatig instellen. Voorbeeld: "Speler 1 gebruikt de
pijltjestoetsen, Speler 2 gebruikt WASD, Speler 3 een controller".
Het nieuwe Input System lost dit op met de functie "Player Input"
De technische noot, simpel uitgelegd:
- 
Action Maps voor iedereen: Ik creëerde één set van 'actions' (zoals 'gas geven', 'sturen', 'remmen') genaamd een Input Action Asset. 
- 
Automatische toewijzing: Met het Player Input-component kon ik automatisch een speler toewijzen zodra er een nieuwe input-device (bijv. een Xbox-controller) werd aangesloten. 
- 
Gescheiden input: Met wat aanvullende logica zorgt het systeem er voor dat de input van Controller 1 alleen naar de auto van Speler 1 gaat, en de input van Controller 2 alleen naar de auto van Speler 2. 
- 
Algemene configuratie: De actions kan je via de naam van de actie, op een eenvoudige manier toewijzen aan een knop, joystick beweging en/of toets. 

Dit is hoe Vincent actions defineert in Unity. Je kunt zien hoe dezelfde actie aan meerdere inputs kan worden toegewezen, zoals een controller of keyboard.
De race vormgeven
Tijdens een hackathon is tijd je grootste vijand. Om tijd te besparen heb ik met behulp van bestaande voorbeelden en met wat advies van AI verschillende componenten opgezet en/of gebruikt om een werkende racespel van de grond te krijgen.
- 
Physics-gebaseerd racen: De basisbeweging van de voertuigen is opgezet met behulp van een “Rigidbody”. Een Rigidbody is een standaard Unity-component waarmee fysica gesimuleerd kan worden. Zonder een Rigidbody reageert een GameObject niet op zwaartekracht, andere krachten, of realistische botsingen. De Rigidbody zorgt ervoor dat het object beweegt volgens de wetten van de fysica (massa, traagheid, wrijving). 
- 
Circuit opzetten: De racebaan is verdeeld in verschillende brokken. Ieder brok heeft een checkpoint, mogelijke hobbels, en muren om te voorkomen dat een speler (te snel) van de baan valt. Door deze brokken aan elkaar te verbinden krijg je uiteindelijk een racebaan. 
- 
Circuit beheren: Een “Game manager” houdt de stand voor iedere speler bij. De game manager legt vast hoeveel checkpoints een speler gepasseerd heeft, hoeveel rondjes een speler nog moet rijden en wie er uiteindelijk heeft gewonnen. 
De focus lag op functionaliteit boven schoonheid. Deze manier van 'prototyping met hulp' zorgde ervoor dat ik meer tijd overhield om me te verdiepen in het Input System i.c.m. lokale multiplayer en het “aankleden” van de racebaan.

Vincent vertelt over zijn hackathon project, aan het einde van de dag.
Knelpunten
Mijn grootste struikelblok had verrassend genoeg niets te maken met het nieuwe Input System of de physics van het spel maar met de meest basale functie in Unity: het transformeren van GameObjects.
- 
De Fout: Ik probeerde de startpositie in code in te stellen door direct de Transform.position van de auto aan te passen, bijvoorbeeld: auto.transform.position = startPositie;. 
- 
Het Probleem: Omdat ik een Rigidbody gebruikte voor physics-gebaseerde beweging, negeerde de physics-engine vaak mijn directe Transform-aanpassing, of zorgde dit voor een onverwacht gedrag bij het instellen van de startpositie. De Rigidbody wilde de "baas" blijven over de positie. 
Na wat onderzoek ben ik er (weer) achter gekomen dat het transformeren van game objecten niet goed samenwerkt met een Rigidbody. Hierdoor kwam ik er snel achter dat ik de positie van de rigidbody moest aanpassen in plaats van de positie van het daadwerkelijke game object (de racewagen).
Uiteindelijk is het mij gelukt om de wagens toe te wijzen aan de juiste startposities en was de race perfect geïnitialiseerd.

Len (rechts) en Vincent (links) houden een race tijdens de demonstratie.
Ook van de partij: Peter die zijn middelvinger opsteekt naar de camera.
Publicatie en video
Vincent wist de uitdaging van een hackathon-project goed te omschrijven: Het is altijd een race tegen de klok. Wat dat betreft had hij met een racing game dus een vrij passend thema gekozen. En hij wist het uiteindelijk behoorlijk goed de finishlijn te halen.
Wil je de project in actie zien? Race dan snel door naar onze video van de hackathon, waar dit te zien is, en waar ook alle andere hackathon-projecten onder de aandacht komen. Je kunt de aftermovie van de hackathon hier bekijken!
Benieuwd naar de andere projecten van de hackathon? Lees dan onze publicatie over deze hackathon, en hou ons techblog de komende weken in de gaten.
