Collision System

Binnen onze game maken we gebruik van ons eigen ForceSystem in plaats van RigidBodies. Het ForceSystem is een door ons ontwikkeld systeem dat meer flexibiliteit en controle biedt over de krachten binnen de game. Dit systeem is speciaal ontworpen om de specifieke functionaliteiten te ondersteunen die nodig zijn voor onze game, welke momenteel nog ontbreken in Unity’s eigen RigidBodies.

Om te voorkomen dat verschillende objecten door het hele level heen vliegen of door de grond vallen, moet je gebruikmaken van colliders en collision functionaliteit. Deze functies zorgen ervoor dat objecten in het level met elkaar kunnen interacteren. Om ervoor te zorgen dat deze functionaliteit makkelijk aan te roepen is, hebben we een uitbreidbaar systeem gemaakt dat op een eenvoudige manier aan te roepen is.

Collision System

Het CollisionSystem maakt gebruik van het Strategy Pattern en het Open/Closed Principle. Dit zorgt ervoor dat de code netjes en flexibel blijft, maar ook voorbereid is op uitbreiding. Het ForceSystem maakt op zijn beurt gebruik van dit CollisionSystem om onderlinge collision tussen objecten uit te voeren.

De objecten die worden aangestuurd door het ForceSystem, en dus ook gebruikmaken van colliders, heten ForceBodies. ForceBodies moeten gebruik kunnen maken van verschillende soorten colliders, aangezien ForceBodies verschillende vormen kunnen aannemen. Het CollisionSystem ondersteunt momenteel de meest primitieve colliders, namelijk de Sphere, Box en Capsule Collider. Dankzij het Open/Closed Principle is het mogelijk om andere soorten Colliders toe te voegen, zonder dat bestaande code aangepast hoeft te worden.

Supported Colliders Voorbeelden

Collision System Data

Om een makkelijk overzicht te hebben van elke soort functionaliteit per collider type, hebben we een struct aangemaakt die verschillende referenties heeft naar andere scripts. Dit zorgt ervoor dat verschillende functionaliteit makkelijk aan te roepen is van buitenaf. Elke ForceBody heeft dan ook een CollisionType, die door het ForceSystem gevonden en gebruikt kan worden om de collision te berekenen.

Lookup Table

Binnen het ForceSystem is een Dictionary aangemaakt als Lookup Table, waarin per CollisionType alle bijbehorende scripts geïnitialiseerd worden. Wanneer een ForceBody de CollisionType ‘Sphere’ heeft, kan het ForceSystem direct het juiste script aanroepen wanneer nodig.

Collision System Functionaliteit

Het Collision System maakt gebruik van een abstracte class die alle return types van de normale Unity Physics casts ondersteunt. Het verschil hierbij is dat je hier een ForceBody variabele mee moet geven in plaats van alle andere variabelen die je normaal zou moeten meegeven bij een Physics cast. Dit komt doordat de ForceBody zelf al een groot deel van alle variabelen bij zich heeft die gebruikt kunnen worden.

Iedere Collision Type erft van deze class en heeft daarbij zijn eigen functionaliteit. Wanneer een ForceBody de Collision Type ‘Sphere’ heeft, zal deze ook gebruik maken van de SphereCollisionSystem. Hieronder kun je het verschil zien tussen de verschillende Collision Systems voor de functie ‘CollisionCheck’.

SphereCollisionSystem CollisionCheck functie
BoxCollisionSystem CollisionCheck functie
CapsuleCollisionSystem CollisionCheck functie

Door middel van de Lookup Table en de Collision Type die een ForceBody bij zich heeft, kan het ForceSystem op een hele simpele manier de correcte collision check doen per ForceBody. Geen lijst aan if-statements, geen lange switch-statement, maar gewoon één regel code die al het werk doet.

Dit is dan ook het gemak en de handigheid van het Strategy Pattern in combinatie met het Open/Closed Principle. Je kunt dus meerdere Collision Types toevoegen aan het project, waarbij dus ook nieuwe CollisionSystems functionaliteit zal worden toegevoegd, zonder dat de bestaande code in het ForceSystem aangepast hoeft te worden. Het enige wat je zou moeten aanvullen is in dit geval de Lookup Table.

Collision Changer

Aangezien een ForceBody verschillende Collision Types kan hebben, is er ook functionaliteit toegevoegd om ervoor te zorgen dat deze colliders ook aangepast kunnen worden tijdens runtime. Hiervoor is een abstracte class aangemaakt waarmee een collider veranderd, geüpdatet, of verwijderd kan worden. Elke Collision Type heeft zijn eigen functionaliteit die bij dat type hoort.

Collider GUI

Als je met de standaard Unity Colliders werkt, is er een duidelijke visual gemaakt om te laten zien waar en hoe groot de collider is. Aangezien dit systeem niet direct gebruik maakt van deze standaard functionaliteit, is dit ook toegevoegd, zodat het voor een designer makkelijk te gebruiken is. Wanneer je de waardes aanpast in de Editor, zul je ook direct veranderingen in de collider zien.

Het voordeel van dit systeem ten opzichte van de standaard Unity Colliders is dat dit systeem heel simpel kan switchen tussen verschillende colliders types. Je hoeft niet elke keer een Collider Component te verwijderen en daarna weer een nieuwe toe te voegen, maar je kunt de Collision Type van een ForceBody aanpassen en direct veranderingen zien in het type collider.

Collider Editor & GUI

Collider Editor

Verschillende collider types hebben verschillende variabelen die met zich mee komen. Zo maakt een Sphere alleen gebruik van een radius en offset, terwijl een Capsule daarbovenop nog een height variabele heeft. Om te voorkomen dat in de Editor allerlei verschillende en potentieel nutteloze variabelen staan, is er een Editor script gemaakt dat ervoor zorgt dat alleen de relevante variabelen worden weergegeven. Dit voorkomt verwarring en versnelt het proces.

CollisionType Sphere
CollisionType Box
CollisionType Capsule

Dit systeem biedt niet alleen meer controle en flexibiliteit voor de ontwikkelaars, maar maakt ook het proces van het toevoegen en aanpassen van colliders efficiënter en intuïtiever, waardoor het ontwikkelen van complexe game physics een plezier wordt.