Afgelopen week heb ik een klein spel uitgegeven via itch.io genaamd From Oblivion. Het idee om dit spel te maken kwam mijn fascinatie van het horror genre, niet vanwege enge monsters en occulte zaken, maar juist de ontzettend spannende manier van verhaalvertelling. Denk alleen al aan Steven Spielberg's Jaws, het engste is hetgeen wat wij niet zien.Mijn oma is al een tijdje dement en wat ik altijd het meest vreemd aan dementie vind, is het verlies van realiteit. Mensen met dementie kunnen maar zo denken dat ze in een bootje op de oceaan varen, terwijl ze in werkelijkheid in een zorgtehuis in het midden van een dorp zitten. Alles om hen heen is een verdraaide realiteit en het leek mij heel gaaf dit in een kort spel te stoppen. Via spatial sounds worden er allerlei kleine (ietwat zenuwslopende) geluidjes afgespeeld op bepaalde plekken in het spel. Ook bevind het spel zich in een heel abstracte wereld, waar een huis midden in een vijver staat, die vervolgens midden in een donker en eng bos is.Het voornaamste doel was simpelweg om Unreal Engine te leren. Hoe werkt de lighting, hoe werken die blueprints en hoe kan ik iets vanuit mijn gedachten in het spel krijgen. In in dit blogbericht ga ik kort vertellen over de meest interessante drempels waar ik tegenaan liep en hoe ik deze heb opgelost.
Collision
Unreal Engine (of beter gezegd Epic Games) heeft een marktplaats met allerlei verschillende 3D modellen, blueprints en meer voor projecten, gemaakt in UE. Maar, voor 3D modellen kun je ook op internet zoeken naar andere bronnen, zoals ik heb gedaan. Hier zijn modellen vaak gratis te downloaden (daar staat echter vrijwel altijd tegenover dat de modellen geen commerciële licenties hebben), zoals ik dat heb gedaan van
Sketchfab. Ik downloadde deze modellen als glTF bestand en importeerde deze met een glTF plugin in UE. Het probleem was alleen, dat deze modellen dan geen collision hadden.In dit geval kun je, als je het model aanklikt (waarna de model editor opent) een collision toevoegen. Nu kun je bij de eigenschappen een collision toepassen door bij "Collision Complexity" de optie "Use Complex Collision As Simple" te selecteren. Dan wordt er een collision model gemaakt op basis van de vertices van het model. Een makkelijke optie is om een simple collision toe te passen via "collision" bovenin en dan een Simplified Collision toe te voegen (box werkt vaak meer dan prima). Dit werkt soms ook veel beter aangezien de meeste objecten (zoals meubels) toch geen complexe collision nodig hebben en een kubus over het algemeen meer dan prima is. In het voorbeeld hieronder zie je bij een model van een bed in het wit / lila de complexe collision en in het groen de simple box collision. Je kunt je voorstellen dat wanneer dit bed in een slaapkamer staat, de box collision voldoet.

Outlines
In de game wilde ik graag objecten hebben waar de speler interactie mee kan hebben. Een speler kan het object oppakken of een actie mee uitvoeren (bijvoorbeeld een deur openen) en dit moet duidelijk worden. Ik wilde geen HUD implementatie maken, waarbij de speler een interactie icoon in beeld krijgt als deze in de buurt komt van een interactie object, dus ik koos ervoor om een outline te maken bij objecten waar de speler interactie mee kan hebben. De outline moet tonen wanneer de speler in de buurt komt.Om te beginnen begon ik met het maken van een Post Process material, voor een emissive material. Alleen, een emissive material laat een object gloeien in een bepaalde kleur en ik wil enkel dit gloei effect aan de rand van een object. En niet alleen de rand, maar de rand van het 3D object, vanuit het perspectief van de speler. Dus, ik ben gaan Googlen naar ideeën en kwam uit op het volgende, een kleine vergelijking die twee stencils met elkaar vergelijkt om zo de rand van het object te krijgen. Een stencil kun je in dit voorbeeld voorstellen als een silhouette van het object. De blueprint, met het rand-uitreken-gedeelte in de comment, ziet er zo uit:

Om de outline enkel zichtbaar te maken wanneer de speler in de buurt komt, heb ik gebruik gemaakt van de stencil values. In de afbeelding bovenin maakt de vergelijking gebruik van een custom value, namelijk 2. Enkel objecten die een Depth Stencil Value van 2 hebben krijgen de outline. Als een object interactief moet worden, plaats ik een collision box (met overlapping collision, niet blocking) en verander ik de waarde van de Depth Stencil Value naar 2 waardoor het object de outline krijgt. Bijvoorbeeld hier, voor het bed aan het einde van de game:

Interactie
Om de objecten interactief te maken en daadwerkelijk dingen te laten gebeuren wanneer de speler interactie heeft met deze objecten, heb ik gekeken op Google. Ik kan zo talloze manieren bedenken hoe ik dit zou kunnen doen, maar niet elke manier zal goed en / of efficiënt zijn. Uiteindelijk vond ik de volgende manier. Eerst heb ik een Interface gemaakt met hierin een enkele functie genaamd "interact", welke ik geen enkele inhoud heb gegeven. Hierna maak ik voor elk object die ik interactief wil maken een Actor child blueprint, waarin ik de meshes plaats die interactief moeten worden. LET OP! De meshes moeten collision bevatten, anders werkt de line trace later niet.Vervolgens implementeer ik bij de Class Settings de interact interface en compileer ik de blueprint. Nu kan ik de Interact event gebruiken om dingen uit te voeren na interactie zoals hier getoond bij het bed aan het einde van de game:

Als laatste heb ik in de Player Controller een actie gemaakt op basis van wanneer de speler op de interact knop drukt (linkermuisknop). Er wordt een line trace uitgevoerd die eigenlijk een lijn trekt vanaf de speler naar voren met een gelimiteerde afstand. Wanneer de lijn "breekt" op een resultaat, wordt het resultaat terug gegeven. Het resultaat, een object in de game met collision, kan dan deze interact functie gebruiken, zoals hierboven in het voorbeeld van het bed. Deze actie ziet er zo uit:

Dat was het voor deel 1! In deel 2 ga ik het hebben over de kleine boot trip in de Game en over de uiteindelijke keuzes in het afronden en designen van het level.Download de Game hier als je nieuwsgierig bent!