-
Notifications
You must be signed in to change notification settings - Fork 0
Technisch Ontwerp
BP_PointOfInterest:
Vanuit de map waarin alle informatie staat van een punt halen we de building mesh en die zetten wij als standaard mesh in de construction script.

Als de point of interest aangeklikt word, zal deze een widget openen waarin de mascotte van de game je informatie gaat geven. In deze widget krijg je informatie over het punt waar jij je bevind. Je kan instellen in een enum of je een Minigame, alleen informatie, een quiz of een collectable krijgt. Waarop hij zijn bijbehorende code uitvoert. En als je alle collectables hebt, zal de game eindigen als je weer bij de beginlocatie bent.
Er zijn veel blueprints die gerelateerd zijn aan de quiz, de hints en de collectables. Het systeem hiervoor zal ik hieronder uitleggen.
Eerst tikt de speler een punt aan en krijgt informatie. Nadat de informatie is doorgelezen, krijgt hij de volgende stap te zien. Dit kan een quiz zijn, een minigame, alleen een collectable, of alleen een hint.
Er is altijd een specifieke volgorde van stappen, maar de enige stappen die je echt bij ieder punt krijgt zijn de informatie en de hints. De volgorde gaat zo:
- Informatie
- Quiz of Minigame (indien van toepassing)
- Collectable (indien van toepassing)
- Hint voor het volgende punt
Ik zal eerst de quiz behandelen.
Plan voor de quiz voordat ik ging beginnen...
De code voor de quiz staat grotendeels op de onderdelen BP_QuizManager en BP_AnswerButton.
De quiz is volledig instelbaar. Hij kan worden aangepast in de inspector.

Er staan vragen van de quiz in (punt 1). Ook staan alle antwoorden hierin (punt 2) en kun je instellen of een antwoord klopt of niet (punt 3). Hier kun je ook instellen welke animatie Pieter Paaltje in de quiz moet afspelen (punt 4), en ten slotte heb je alle instellingen voor de collectable die je krijgt bij de quiz. Deze zijn als volgt: het model van de collectable (punt 5), de schaal waarmee hij op het scherm moet staan (punt 6) en of je hem al hebt of niet (punt 7).

Bij een punt kun je instellen of je hierna een collectable, informatie of een minigame krijgt. Zie nummer 0. De teksten voor de hints zijn instelbaar aan de hand van de LocationHintText waardes die je in de Map zet (punt 1). De modellen van de hints die je krijgt zijn in te stellen, je hebt zowel een optie voor een ongeanimeert als een wel geanimeert model (punt 2). Ten slotte kun je hier ook de schaal van het model invullen waarmee hij op het scherm moet komen te staan (punt 3).

In de BeginPlay voert hij de functie Start Rotating Collectable uit. Dit is zodat de collectable, die op de speler staat, altijd draait en het maar één keer aangeroepen hoeft te worden (deze code is een simpele timer met rotatie op het object dat de collectable mesh laat zien). Verder set hij een referentie naar de speler.

Hier set ik nog een aantal referenties voor later gebruik.

Dit is de Start Quiz functie waar de meest belangrijke delen van het opzetten van de Quiz gebeuren. Current Quiz en Current Question worden opgeslagen zodat je weet bij welke quiz(vraag) je bent. Vervolgens wordt de QuizMenu widget aangemaakt op het scherm. De array van Quiz Questions wordt gepakt en daarin wordt gekeken welke quiz er bij de locatie hoort waar je staat, en met behulp van de Integer Current Question wordt er bepaald welke vraag er gegeven moet worden.
Aangezien Pieter Paaltje ook op het scherm staat, worden zijn animaties hier aangeroepen. Meer hieronder...

Er wordt gekeken of zijn animatie moet loopen, aan de hand van kijken of het wel of niet de "entry" of "exit" animatie is, dat zijn namelijk de enige die niet moeten loopen. Ook wordt Pieter zijn mesh zichtbaar gemaakt.

Uiteindelijk worden de antwoorden in de map gebruikt in een loop om aan de widget toe te voegen.

Als je de vraag goed beantwoord, wordt er gekeken of er nog meer vragen zijn of dat dat de laatste was. Ook wordt het quizmenu weggehaald, meer hieronder...

Als er nog meer vragen zijn, wordt het quizmenu opnieuw ingespawnt. Dit omdat het veel makkelijker is om het opnieuw aan te maken met de juiste knopjes en tekst dan de bestaande knopjes en tekst weghalen en anders in te spawnen.

Dit is wat je ziet wanneer je een collectable ontvangt. De code die hiervoor gebruikt wordt leg ik hieronder uit.

Hierin wordt de "main" widget van het scherm af gehaald zodat er geen widgets over elkaar komen, en de collectable acquired widget aangemaakt.

Vervolgens wordt de mesh die vlak voor de camera staat op de speler geset naar het object wat je verzameld hebt en hij wordt naar de juiste scale gezet. Ten slotte wordt er een tekstje op het scherm gezet die verschilt met of je de collectable wel of niet al set.

Hier wordt de widget met de juiste tekst aangemaakt.
In de Shrink Collectable Function wordt de collectable bij het afsluiten kleiner gemaakt als een soort animatie, waarna hij volledig weggaat en de game opgeslagen wordt.

Dit wordt aangeroepen door middel van een timer, daarom wordt er gekeken of de mesh zijn scale groter is dan 0, 0, 0. Zie hieronder voor het vervolg...


Als hij dat wel is, wordt hij kleiner gescaled. Is hij het wel al, dan is de collectable dus niet meer zichtbaar en de "animatie" af. Hij wordt aan de map toegevoegd als verzameld, de mesh van de collectable wordt weer geleegd en op 1, 1, 1 scale gezet om hem klaar te maken voor de volgende keer dat er iets op wordt laten zien, en de boolean "collectable on screen" wordt weer naar false geset. De timer wordt gestopt.
Plan voor de hint feature voordat ik begon...

Dit verwijdert de "standaard" UI van het scherm en opent de hint widget (als er een hint tekst is ingevoerd).

Vervolgens worden de static mesh en de skeletal mesh geset met de waardes die mee worden gegeven. Er is zowel een static- als skeletal mesh omdat er zo ingesteld kan worden dat er een geanimeert model als hint wordt gebruikt. Aan het einde speel ik één specifieke animatie af, maar dat komt omdat er voor nu maar één geanimeerd model is en er geen plannen in zicht zijn om dat aan te passen.

Aan het einde wordt de game opgeslagen en de input naar UI only gezet zodat je niet op de achtergrond dingen aan kan tikken.
(Bart)
Het originele plan was om de GPS te gebruiken om de positie van de speler te bepalen in Amsterdam. Helaas werkt deze feature compleet niet in Unreal 5.

In principe zijn deze nodes nodig om de GPS werkend te krijgen in Unreal. En dit werkt ook, alleen maar voor 1 frame in plaats van dat die blijft updaten aan de hand van de init location services node. Na een paar weken stoeien met verschillende settings in Unreal en packages in Android Studio, heb ik besloten om Unreal 4 te compilen (Epic heeft geen Linux builds voor Unreal 4 die je kant en klaar kan downloaden, https://docs.unrealengine.com/4.27/en-US/SharingAndReleasing/Linux/BeginnerLinuxDeveloper/SettingUpAnUnrealWorkflow/).

Android versies

Android SDK versies

NDK versies
De instructies op de webpagina waren makkelijk genoeg te volgen om te compilen, maar ik kwam bij een probleem toen ik de make command wou draaien, want die package stond niet op mijn apparaat. Zou in principe makkelijk genoeg te installeren zijn met pacman, de package manager, maar dat ging niet soepel.
Eerst kreeg ik een error dat de database read only was. Dat was simpel genoeg op te lossen met de command sudo steamos-readonly disable.

Het probleem wat ik daarna kreeg is dat de package manager zei dat de packages corrupt waren. Hier kon ik eerst niet een concreet antwoord op vinden waarom dat was. Wat uiteindelijk bleek is dat ik de keyring moest vullen. De keyring is iets wat pacman gebruikt om te zien of de packages betrouwbaar zijn. Door de command sudo pacman-key --populate archlinux holo te draaien kon ik make installeren en de engine compilen.
Nadat de engine compiled was teste ik dezelfde reeks aan nodes die ik in Unreal 5 heb gebruikt en kreeg ik het de 1ste keer werkend. Fijn, dacht ik, op dat punt. Helaas kreeg ik het daarna niet meer werkend. Nadat ik een week heb besteed om het project te compilen voor meerdere versies van Android, andere Android settings heb geprobeerd en de engine opnieuw heb gecompiled, heb ik besloten om de GPS feature te droppen omdat het voor te veel problemen en hoofdpijn zorgde.
Menno heeft deze feature later opgepakt samen met mij en we hebben de GPS werkend gekregen. De reden waarom de GPS nu wel werkt weten wij niet, maar het werkt nu wel zoals die hoort.

Om de collectables zichtbaar te maken, kijkt de inventaris in de Collection map in de savegame. De colletion map bestaat uit de location enum, die alle locaties met een collectable erin heeft staan en een boolean die aangeeft of de collectable voor die locatie in bezit is.

Op de speler staan alle collectables als static meshes standaard op hidden in game (behalve noch einmal, dat is een skeletal mesh).


Als de naam in de savegame en de naam onder de collectable holder die is meegegeven overeenkomen, wordt er gekeken of de boolean in de savegame op true staat. Als dat zo is, wordt de collectable op visible gezet.
Als je bij de Point of Interest van het Dapperplein bent, krijg je na de informatie die standaard afspeelt een minigame op je scherm. Dit is een widget waarop een textbox staat met daarboven de vraag van hoeveel reigers jij daar ziet. In de textbox kan je zelf een getal typen van maximaal 2 cijfers. Dit word opgeslagen naar de save file en kan je terug zien op het einde van de game