Bon Appmobile

Bon Appmobile is een VR kook simulator. Het doel van het spel is om pizza’s te bakken en te bezorgen bij de huizen. Je rijdt rond in een foodtruck in een grote wereld waarbij je zelf kan bepalen waar je heen gaat. Bak jij al rijdend de lekkerste pizza’s?

Info:

Gemaakt met: Unreal Engine 5
Codeertaal: BluePrint
Mijn rol: Lead programmer
Tijdspan: 10 weken (daarvan 3 dagen per week)

Team:

Developers:
Didier Vermunt (Project Lead)
Akari Le (Project Lead)
Matthijs van den Bovenkamp (Dev Lead)
Bas Klaichid (Dev Lead)
Miyaki Truong
Nigel van Maanen
Nick van Luyk
Ed Rikkert
Nick van Luyk
Bor Dekker

Artists:
Elroy‎‎‎ Kunst (Art Lead)
Levi Cok‎
Hugo Hugtenburg
‎Waylon Minck
Rida Wullink
Camila Rijerse
Zhahir Alkaf
Darren Star

‎ ‎ ‎ ‎

Mijn bijdrage in Bon Appmobile

De Foodtruck

Hele blueprint

Ik heb de motor gemaakt voor de foodtruck.  Hierdoor kan je de hele map door rijden. Je kan de foodtruck harder en zachter laten rijden. Stil staan kan niet zolang het spel bezig is.

Dit is de hele blueprint van de motor en de foodtruck.

SetCarOnSpline

Met de informatie die het Pathing Framework (dit wordt hieronder besproken) naar de auto stuurt, wordt de “Spline REF” gezet en de “Distance To Add”.  Vervolgens wordt de auto op de spline gezet, de location en de rotation worden door de spline bepaald. Bij de location en rotation wordt de “Distance To Add” en “Lerp return value” bij elkaar op geteld. En deze wordt in de get location en rotation gezet. Je ontvangt dan de nieuwe location en de rotation van de auto. Daarna wordt er gekeken of de auto inverted is. Zo ja, dan roept hij de ReverseGears event aan. Als de auto niet inverted is, dan roept hij de RestGears event aan. Als één van de twee event zijn aangeroepen, dan wordt bij de “Alpha” opnieuw gezet. Bij de ReverseGears wordt de “Alpha” berekend door de “get distance along spine input key” te delen door “get spline lenght”. Daar komt een getal uit die tussen de 0 en de 1 ligt. Bij de RestGears wordt de “Alpha” op 0 gezet. Maar als de auto inverted is, wordt de “Alpha” berekend door waar het punt dat de auto heen gaat, gedeeld door de totale lengte van de spline.

ReverseGears en RestGears

ReverseGears

Eerst wordt er gekeken of “ReverseGears was active”. Als dat niet het geval is, wordt “Gear Chosen” 3x min elkaar gedaan, zodat het getal in de min komt te staan. Dit gebeurt ook voor “Gear Now” en “Max Speed”, daarna wordt “ReverseGeas was active” op true gezet.

RestGears

Eerst wordt er gekeken of “ReverseGeas was active” als dat het geval is, wordt “Gear Chosen” 3x min elkaar gedaan zodat het getal weer in de plus komt te staan. Dit gebeurt ook voor “Gear Now” en “Max Speed”, daarna wordt “ReverseGeas was active” op false gezet.

De update

Er wordt gekeken of de auto aan het gear switing is. Zo ja, dan gaat hij door. Zo nee, dan gaat hij kijken of de auto inverted is. Zo ja, dan wordt de “Alpha” gezet. Dit gebeurt door de “max speed” te delen door de max lenght van de spline. Daarna wordt de “Alpha” plus het getal wat hiervoor berekend is. Dat word de nieuw “Alpha”.

Zo nee, dan wordt de “Alpha” ook gezet maar dit gebeurt iets anders. Dit gebeurt door de “max speed” te delen door de max lenght van de spline. Dat plus de “Alpha” wordt de nieuw “Alpha”. Het maakt niet uit wat er hiervoor gebeurd is. Alles komt weer samen op dit punt. De “Alpha” wordt hier geclampt. Dit zorgt ervoor dat de “Alpha” niet kleiner en niet groter dan 0 en 1 kan worden. Daarna wordt er weer gekeken of de auto inverted is.

Zo ja, dan wordt de auto een nieuw positie gegeven op de spline de location en de rotation worden bijna op dezelfde manier gezet als in de SetCarOnSpline. Het enige verschil is dat hier de “Alpha” in een lerp gaat samen met de max length van de spline. Hieruit komt de nieuwe location en de rotation.

Zo nee, dan wordt eerst de “Lerp return value” gezet. Dit wordt gedaan door de lerp die ik net heb benoemd. Dan wordt de auto een nieuw positie gegeven op de spline de location en de rotation worden bijna op de zelfde manier gezet als ik net heb benoemd, maar hier wordt de uitkomst van de lerp plus de “Distance To Add” gedaan.

GearSwitching

Eerst wordt “Is Gear Switching” op true gezet. Dan wordt “Temporary Max Speed” gezet door de waarde van “Max Speed” over te nemen. Als dat gebeurd is, wordt er gekeken of “Gear Now” kleiner is dan “Gear Chosen”. Zo ja, dan wordt de timeline Acceleration aan gezet. Zo lang de timeline bezig is, wordt Temporary Max Speed Change aangeroepen. Er komt een value uit de timeline en die gaat daar ook in. Daarin vindt het value plus de “Temporary Max Speed” plaats. Dat wordt gedeeld door de lengte. Dat, plus de “Alpha”, wordt de nieuwe “Alpha”.  Als de timeline klaar is, wordt Max Speed Change aangeroepen. Hier gaat ook de value van de timeline in. Hier wordt de value plus de “Max Speed” gedaan en dan de “Max Speed” gezet. Dan wordt de “Gear Now” plus 1 gedaan en dan gezet. Zo nee, dan gebeurt eigenlijk hetzelfde, maar dan alles in de min. Als één van die twee gekozen is, wordt er gekeken of de “Gear Chosen” gelijk is aan de “Gear Now”. Zo ja, dan gaat de ‘Is Gear Switching” op Flase. Zo nee, dan gaat hij weer terug naar set “Temporary Max Speed” en gebuurt alles er opnieuw.

TimedSpeedUp en TimedSpeedDown

TimedSpeedUp is eigenlijk het zelfde als TimedSpeedDown maar de één laat de auto sneller gaan en de ander langzamer. Als één van deze twee wordt aan geroepen, dan wordt er eerst gekeken of de auto inverted is. Zo ja, dan wordt de “Gear Chosen” gezet. Dit gebeurt door “Gear Now” min het getal, dat is meegegeven door het event. Dan wordt Gear Switching aangeroepen dan word er een delay gestart. De tijd is ook bepaald door de data die is meegegeven met het event. Daarna wordt er weer gekeken of de auto inverted is. Zo ja, dan wordt er “Gear Chosen” weer gerest en Gear Switching word weer aan geroepen. Zo nee, “Gear Chosen” Gezet dat gebeurt door “Gear Now” min 1 te doen.

Zo nee, dan gebeurt er hetzelfde maar dan omgedraaid, plus wordt min en min wordt plus.

Pathing Framework

Hele blueprint

Ik heb samen met Didier een systeem gemaakt om de foodtruck van een spline naar een andere te laten gaan.

Hoe werkt de Spline splits

We beginnen door te kiezen op welke spline de speler start en op welke “Input Key” de speler start.

Gedurende het spel updaten we de Input key. Dit wordt gedaan in een event “UpdateInputKey”. Hiervoor pakken we de positie van de auto op de spline waar hij op dat moment op zit. Deze data slaan we op in een variable “Current Input Key”.

Dan gebruiken we deze variable om de key waar de auto het dichtsbij is te vinden. Dit wordt gedaan door de Current Input Key te afronden naar 1 decimaal getal (Dus 0.1/0.2/0.3/0.4/0.5/etc.). Dit hele getal vergelijken we met de volledig afgeronde versie van Current Input Key (Dus 1/2/3/4/5/etc.). Als deze gelijk is, dan is de speler net voor of net achter een Key Point. Dit Key Point vergelijken we dan met alle Split Keys die op de huidige spline staan. Als het Key Point overeenkomt met een Key die in de lijst staat, dan is de speler bij een Input Key aangekomen. De exacte “Current Input Key” en/of de Key die in de lijst zitten, worden opgeslagen in de bijbehorende variabelen.

Daarna controleert het script of de exacte “Current Input Key” in de lijst staat met plekken waar een split is, zo ja? Dan vindt er een for each loop plaats. In de loop word er gecontroleerd of de richting van de auto in de lijst met afslagen staat op het desbetreffende Input Key. Dan pas vindt er een Spline Change update aan.

In deze update wordt er gekeken of de auto naar een “Inverted Route” gaat. Als dat niet zo is, dan wordt de arrival key waar de auto moet komen geüpdatet en wordt een normale Spline Change aangeroepen. Komt de auto wel op een inverted route, dan gebeurt hetzelfde als wat hierboven vermeldt is EN de auto krijgt de informatie dat de route inverted is. Ook start hij de Inverted Spline Change i.p.v. de normale Spline Change.

Change Spline

Eerst wordt ervoor gezorgd dat de auto niet (meer) inverted is. Daarna wordt de “Current Spline Section” ingevuld met de spline waar de speler op terecht komt. Ook wordt de gehele Spline Component opgeslagen. Dan roepen we “Move Object” aan om de speler zijn movement te starten op de nieuwe spline. Vervolgens wordt de “Current Spline Section Keys” gevuld met de keys die in de data map staan van de huidige spline.

Inverted Change Spline

De “Current Spline Section” wordt eerst ingevuld met de spline waar de speler op terecht komt. Ook wordt de gehele Spline Component opgeslagen. Dan roepen we “Move Object” aan om de speler zijn movement te starten op de nieuwe spline. Dan wordt de “Current Spline Section Keys” gevuld met de keys die in de data map staan van de huidige spline. We hoeven in dit event niet te vermelden dat de weg inverted is, aangezien dat daarvoor al gedaan is.

Als de keuze tussen Inverted of normaal is gemaakt, dan komt er een delay voordat je de keuze weer opnieuw kan maken.

Move Object

Move Object geeft wat informatie door aan de auto. Namelijk de Distance op de spline en op welke spline dit is. Hoe de auto beweegt kan je vinden in de Auto Documentatie.

Overige bijdragen

Pizza Component

Ik heb een component gemaakt die bijhoudt welke ingrediënten er op de pizza zitten.

Als er een ingrediënt op de pizza wordt gedaan, dan wordt er gecheckt of het een ingrediënt is. Als dat zo is wordt het ingrediënt aan lijst toegevoegd en dan aan de pizza vast gemaakt. Als dat gebeurd is, wordt hij aan een map toegevoegd waarin wordt gekeken of hij er al instaat. Als dat zo is wordt hij bij de bestanden opgeteld. Zo niet wordt hij als eerst er aan toegevoegd. 

Als je een ingrediënt er afhaalt, wordt hij eerst uit de lijst met ingrediënten gehaald en daarna wordt hij uit de map verwijdend als hij de laatste is en anders wordt er maar 1 afgeteld van het totaal.

Saus pistool

Ik heb samen met Ed het saus pistool gemaakt.

Eerst wordt er gekeken of je hem vast heb gepakt en met welke hand. De hand waar je hem mee vast hebt gepakt, daarvan gaan de controls aan. Als je vervolgens de schietknop indrukt, dan gaat het particle system aan. Als de particle iets raakt, dan roept hij een event aan. Als dat event aangeroepen wordt dan gaat hij kijken met een sphere cast of het een pizza is, Als dat zo is, wordt er een functie aangeroepen die de saus op de pizza laat zien.

Ordersysteem

Ik heb een ordersysteem gemaakt. Maar jammer genoeg is het niet in de game gekomen.

Het werkte door eerst het order screen te resten, dan een willekeurige recept te kiezen en dan een willekeurige aflever punt te kiezen.