Project type: Game
Date: 19-03-2024
Status: Finished
Software used: Unity, Visual Studio
Language used: C#
Role: Lead Developer
Team size: 3 developers en 4 artists
Over het project
In dit project heb ik in een team samengewerkt voor onze opdrachtgever Paladin Studios. De klant wilde een leuk coöperatief spel dat door alle leeftijden gespeeld kon worden. Het spel moest daarom een unieke game mechanic hebben die makkelijk te leren en begrijpen is.
De uitkomst is een co-op party game, waarbij spelers een trein besturen en pakketjes bij de juiste stations moeten afleveren in een zo kort mogelijke tijd. Onderweg kunnen de spelers slechte stukken rails tegenkomen waardoor pakketjes en de trein beschadigd raken. Deze moeten dan zo snel mogelijk gerepareerd worden.
In dit project heb ik gewerkt aan onderstaande onderdelen.
State Machine
Voor dit project heb ik een herbruikbare State Machine gebouwd. Deze zorgt ervoor dat altijd de juiste UI zichtbaar is. Een handige feature van dit systeem is dat je een parent state kunt instellen. Hierdoor kun je de basis-UI makkelijk hergebruiken, waarna de child states alleen specifieke nieuwe UI-elementen toevoegen. Dit heb ik bijvoorbeeld toegepast in de lobby: de interface is daar grotendeels hetzelfde voor de host en de client. Door dit systeem kon ik echter makkelijk instellen dat de client de tekst ‘Searching host…’ ziet, terwijl alleen de host de ‘Start Session’-knop in beeld krijgt.
Player Manager
De Player Manager is verantwoordelijk voor het spawnen van de spelers en wijst ze automatisch een random character model toe. Een speler wordt pas gespawnd wanneer iemand in de lobby op een knop drukt met een toetsenbord of controller.
Het is hierbij mogelijk om meerdere input devices op één client te gebruiken. In totaal kunnen er maximaal 6 spelers (input devices) meedoen aan een sessie, en het maakt niet uit over hoeveel verschillende apparaten (clients) deze verdeeld zijn.
Dit proces verloopt via het netwerk. De client stuurt een verzoek naar de host om een speler in te spawnen. Zodra de client de gespawnde speler vanuit de host heeft ontvangen, koppel ik direct het juiste input device aan dit nieuwe character.
Multiplayer Lead
Als onderdeel van mijn rol als Lead Developer heb ik aan alle features in de game meegewerkt. Omdat ik de networking plugin voor ons spel (FishNet) had onderzocht, hielp ik mijn teamgenoten met het networken van hun features. Zo zorgden we ervoor dat alles ook goed werkte wanneer het spel met meerdere apparaten in dezelfde sessie werd gespeeld. Dit ging onder andere om systemen zoals de grabbables en de train controller.
Popup System
Het popup-systeem heb ik gemaakt om heel makkelijk nieuwe popups te kunnen toevoegen, compleet met standaard fade-in, fade-out en hover-animaties. Omdat we voor deze game heel veel verschillende popups nodig hadden, was dit een belangrijk systeem.
Daarnaast maakt het systeem het mogelijk om popups te laten verschijnen wanneer de speler ergens dichtbij is. Denk bijvoorbeeld aan een interactieknop die boven de speler zichtbaar wordt, zodra deze in de buurt staat van een object waarmee hij kan interacteren.
Tot slot is het ook makkelijk om van de basis-popup over te erven, zodat wij specifieke condities konden instellen. Een goed voorbeeld hiervan is de coal popup: door hiervan over te erven, kon ik makkelijk instellen dat deze popup alleen in beeld verschijnt wanneer de kolen in de oven onder een bepaald niveau zitten.
Damage and Repair System
Het Damage and Repair System regelt alle objecten die tijdens de treinrit schade oplopen. Deze schade wordt erger zodra de trein over een slecht stuk spoor rijdt. Spelers moeten met een hamer continu de pakketkasten repareren om schade aan de pakketjes te voorkomen. Wordt een pakketje los in de trein gelegd, dan krijgt het direct schade, wat uiteindelijk punten kost. Daarnaast kan ook de oven kapotgaan, waardoor de trein compleet stilvalt.
Ik heb dit technisch makkelijk gemaakt om te gebruiken in systemen. Om bijvoorbeeld een object repareerbaar te maken, hoeft de class simpelweg de IRepairable interface te implementeren. De hamer zoekt vervolgens binnen zijn bereik automatisch naar deze interface om de reparatie uit te voeren. Daarnaast heb ik ook een basis-damagable en basis-traindamagable gemaakt om makkelijk nieuwe objecten te kunnen maken die schade kunnen krijgen.


























