To increase immersion I added footstep audio to the walking animations timed to when the foot touches the ground. I added audio feedback to the clue and deduction systems so the player would better understand what is happening. When a clue is obtained, a writing noise plays. If a clue connection is right or wrong, a specific noise will play to tell the player what the result was. The success and fail noises were the same noise that I differentiated using Audacity.
I added a sound for the page turning triggered when either arrow in the journal is pressed to make the journal more interesting.
I implemented the gunshot noise into the cinematic that another team member made.
Game Optimisation
The final game was struggling with performance because of the moving water having dynamic shadows enabled on it. I removed them and the performance stabilised to a consistent frame rate. We also aimed to make use of Nanite to better our performance but virtual shadow maps were not enabled in our project which is required for Nanite so I enabled that to also get a small performance boost from Nanite.
I decided to add a grab animation before certain objects were picked up to make it more engaging for the player and to add to the indication of something being picked up.
The animation was sourced from Mixamo (Taking An Item And Examining It) and imported into Maya along with the Detective model to make it easier to visualise intended changes. Once it suited what I needed, I removed all of the Detective model but one of the arms and imported it into Unreal. The arm was attached to the camera so the grab would always be aiming towards the object the player was looking at.
Grab Arm
I added an additional branch block to the interaction functionality checking if a new Object Interface was implemented in the interact actor. This Object Interface is exclusively used to determine if the grab animation should play for an actor. If the interact actor does have this interface, then the grab arm is made visible and the animation is played. After 1.2 seconds, the arm is hidden and the Interact Interface function is called.
Grab Functionality
The grab worked fine but it slowed down the game when collecting clues so in Unreal Engine I changed the rate scale in the asset details to 2.0 which doubled the speed of the animation.
I added some new blocks to the grab functionality that hid and unhid the right arm of the main model so the character didn’t have two right arms when grabbing. I also adjusted the delay to last 0.3 seconds which matched the sped up animation.
Grab Functionality Changes
Line Trace Detection
The way the interactable object detection worked behind the scenes was a little clunky so I decided to change how it from using a box collision overlap to a line trace hit. A crosshair was also added to indicate when a hit was happening. The video includes debug lines to represent the line trace to better demonstrate the change.
The line trace starts at the center of the camera and ends at a distance set by multiplying the forward vector of the rotation and adding it to the location. This can be adjusted by changing the value the forward vector is multiplied by. Using a break hit result block allows me to set the Interact Actor variable to whatever actor is being detected if it has the Interact Interface.
Line Trace Functionality
Originally, there was an issue with the doors in which the player could overlap with the wrong box collision under specific circumstances causing the door animation to be wrong or change abruptly to moving the wrong way. The line trace change fixed this as the detection is a lot more precise stopping any potential issues like it.
To detect which side of the door the player was facing an additional part was added to the line trace functionality checking whether the component the line trace hit was the front so the correct event for either side could be set.
Door Detection Addition
Inspection Mechanic
To add some complexity to gathering objects, I added an inspection feature that allows the player to look at certain objects. I used the feature with the revolver to hide obtaining a clue behind interacting with a specific part of the gun. The gun plays an animation which I created in Maya by rigging and keyframing the revolver made by one of the 3D modellers on the team.
This mechanic was implemented using a tutorial series by Matt Aspland shown below.
Interacting with the revolver actually hides it and sets an invisible skeletal mesh in front of the player’s camera to the same mesh and makes that visible. A new boolean named Inspecting? is then set to true as well as the player look and move input being disabled. The specific part of the gun is detected via a hidden sphere collision. Interacting with that for the first time plays the animation and sets the clue as being found while the second time hides the inspect mesh, reenables all of the player input and destroys the revolver actor as it is no longer needed.
Revolver Clue Blueprint
The inspection allows the player to rotate the revolver by combining the axis value of the X and Y inputs of the mouse (with a multiplication adjustment of -1 to make it feel smoother) with the relative rotation of a component that the inspection actor is attached to and then setting the relative rotation of the component to the combined value with the mouse inputs as the starting events.
Inspection Player Input
To focus on the inspect actor, I decided to add a translucent background that also blocked the line trace from being able to interact with anything behind the inspect. This was simply achieved by adding a cube behind the inspect actor in the player blueprint which only appears when the inspect is happening.
Wardrobe Interaction
Using similar functionality to the doors, I implemented the ability to open up the various wardrobes throughout the boat level. This would allow items to be hidden within the wardrobes.
The hidden room wardrobe was changed to make use of this mechanic by having a secret door at the back of the wardrobe that could be opened once the player is given information. The secret door is still opened using a level sequence as there were some issues using the timeline method in which the rotations would not work how they were supposed to.
Lockpicking Mechanic
To diversify the gameplay a little more, I added a lockpicking minigame to some objects. The player must first find a lockpick (which uses the same blueprint and functionality as the keys) in order to open locked containers and find certain clues. The lockpicking minigame is displayed in the UI using a scene capture of the assets spawned out of the map.
I created this mechanic following this tutorial series by Ryan Laley using found assets from SketchFab.
The lockpicking blueprint is spawned when the player interacts with a object that can be lockpicked. When it’s spawned, the crosshair is hidden and input is enabled for it while being disabled for the player character. A blueprint block is also used to hide the environment behind wherever the lockpick blueprint was spawned and then the “Generate Lock” function is called. The inputs used for the lockpick are the forward (W = 1 S = -1 and right (A = -1 D = 1) movement keys (WASD) which allows eight different combinations for unlocking. The inputs are made into a rotator that sets the relative rotation of the lockpick on tick. If both inputs nearly match the generated lock positions then the lockpicking input is disable and a timeline is used that rotates the lock to show that it’s unlocked. After the timeline, the player character input is restored and the lockpicking UI is hidden allowing the lockpicking blueprint to be destroyed as it is no longer needed.
Lockpicking Blueprint
To generate the unlock positions, a random integer between -1 and 1 is generated for the X and Z variables that put together will make one of the eight possible combinations.
Generate Lock Function
Game Introduction
I implemented the intro of the game in the bar area above. The only mechanics used are the dialogue and journal mechanics. Each character in the bar has a dialogue tree that reacts to the different states of the intro investigation.
Modular Clues
I adapted the original functionality of the clues to work modularly under one blueprint. This was because the way I originally did it required a lot of repeated functionality because of slight differences. To do this I added a new public text variable named “Other Clue Needed” which could be changed for each instance of the clue blueprint. I also optimised the blueprint a little as there were some unnecessary inclusions before as only the first clue would need to be checked on the second press.
Modular Clue Blueprint
Shown is an example of the variables that need to be set when a clue is added to make the deduction functionality work.
Modular Clues Test Implementation
Journal System
I first adapted the existing journal that was a remnant of the evidence board and changed the visuals to better match what it was supposed to be. The clues were all readded using the modular clue system.
I added an “Inventory” part to the journal that displays everything that is added to the string array that acts as the player’s inventory. I also started implementing the character profile part of the journal which will include backstory for each character as well as the clues that relate to them. Every time the journal is opened, an event called “InventoryReset” is called.
This event clears the inventory section and puts every string in the inventory array as a child of the inventory box using another widget as a base for them. It is called every time the player opens the inventory but it will only have a visible impact if the player receives a new item.
Inventory Reset Event
This journal was made partially using this tutorial series by Darkfall.
I added a profile for the player character which contains the inventory and implemented the rest of the characters. The player can only see the player character’s and the victim’s profiles at the start but as they progress to the main part of the game the rest of the profiles can be accessed.
To toggle between pages I used a block that has executions based on the value of an integer. This integer would be used as the page index and it would either increase or decrease based on which arrow was pressed if possible. The integer was clamped between 0 and 5 as there was only six pages needed for the journal. Each execution for 0 to 5 shows the correct page and hides the other page or pages that it could have previously been on. The arrows are hidden if they can’t be used to go to another page also.
Page Turn Functionality
When the arrows are hovered over they display text to show that they are clickable as well as giving extra feedback to the player.
Arrow Text Functionality
I created an event called “GotClue” to show when a clue has been added to the journal. It shows a UI element of a book and pen for a second before it gets hidden.
Got Clue Event
To make the readability and visuals better for the journal, I changed the font asset to another one already imported into the project by another team member and also implemented a book cover asset behind the journal sourced by the same team member. I also added the place where each character stays so the player would be able to find relevant NPCs easier and added a clues section in the player section for miscellaneous clues.
Final Gameplay
To add the effect of the boat moving, I used a level sequence that moved the environment around the boat that loops by resetting when it gets to a certain point.
I added another NPC to the intro that gives an additional clue.
To progress the game the player has to get most of the clues in the intro and then speak to the captain.
I added clues that serve to give information to unlock either new dialogue or hidden areas.
To improve on the aesthetic of the murder, I used a Megascans blood asset from Quixel Bridge.
Murder Victim
I added NPCs with different purposes in this section. Some NPCs can be asked questions with more options based on the information you have while others are there to assist the player by hinting what to do or to give the player an item to progress.
I adjusted the suitcase so that it needed to be lock picked and so it had a clue that made a bit more sense narratively. I also added the trunk into the hidden room so that the gun was hidden in it.
References
Aspland, M. (2021) Inspect And Rotate Item | Inspect Item Part 2 – Unreal Engine 4 Tutorial [Video]. Available online: https://youtu.be/q62hIj9sHi0 [Accessed 06/05/2023].
Darkfall (2020) Unreal Engine 4: Part 7 – Journal / Notebook [Video]. Available online: https://youtu.be/pNVopBqZ_W4 [Accessed 15/05/2023].
Laley, R. (2022) Unreal Engine 5 Tutorial – Lockpicking Part 1: Lockpick Actor [Video]. Available online: https://youtu.be/sJH4qXqA77k [Accessed 09/05/2023].
mixamo (N/A) Character Animations [Asset Resource]. Available online: https://www.mixamo.com/#/ [Accessed 06/05/2023].
Animations Used:
Crying (Crying and Rubbing Eyes) Idle (Female Idle) Sitting Idle (Sitting Still In A Chair) Standing Idle Taking An Item And Examining It
One of our team members added a character model for the player. This meant that the character needed new animations so I used animations from Mixamo to replace the crouch, walking and idle animations. The crouch mechanic was also changed so that the camera was attached to the skeleton. Although this added some jitter to the camera it got rid of an issue with the old crouch mechanic which was that the camera was able to move to the standing position while the character was still crouched as it had no collision check.
The way the character interacts with the different mechanics was adjusted as well. This was because the way it was set up had a boolean for each thing that could be interacted with which would make the player blueprint bloated with unnecessary blueprinting. To fix this I used the “Interact Interface” method from the NPC interaction and applied it to everything that could be interacted with removing the need for the different booleans telling the player blueprint what was being interacted with.
Player Interaction Change
NPCs
I added four NPCs that each have their own dialogue tree that reacts to each stage of the investigation into who killed the host. Once the player solves the case and informs them they will have an animation reaction that differs depending on whether they were involved in the murder. Innocent passengers celebrate and the culprits get angry. This is a temporary inclusion just to show that the case is solved.
Wardrobe
To hide one of the clues in the level I used a wardrobe that covers a hole into a secret room. The player can’t do anything with the wardrobe unless they talk to one of the NPCs. That NPC will say they heard noises and this will allow the player to move the wardrobe. The wardrobe is moved using a level sequence.
Playthrough
Playable Prototype 2
Feedback
Feedback on the playable prototype resulted in some changes to the existing mechanics and the addition of a new mechanic. The evidence board was a bit tedious as it required the player to walk back to the start room each time they wanted to use it. This was changed to being accessed by pressing Tab on a keyboard instead. The dialogue system had a bug which required the player to press the Left Mouse Button more than once to progress the dialogue so an alternative next button was added to the dialogue UI that would also progress the dialogue. A door mechanic was also requested to be added to the game.
Door Mechanic
The door system was set up to be very modular so that every door uses the same blueprint. This includes locked doors and normal doors. Locked doors require a key to be obtained first which is added to a string array called “Inventory”. After some feedback, the doors were also made to open from either side.
When the door is interacted with it checks whether it is locked or not. If it is not locked then the “Open Door” event will be called. If it is locked then the player’s inventory will be checked for the right key. If the player has the key the door will be unlocked and the “Open Door” event will be called. If not the player is told they lack the key.
Door Interaction
To determine which side of the door should open, there are two collision boxes (one for each side) that can be overlapped by the player. When one of them is overlapped, the other one has their ability to generate an overlap disabled and the end location of the door animation is set.
Door Side Check
The door opens using timelines and rotator lerps which sets the relative rotation gradually as the timeline progresses. There is a timeline for the door opening and closing.
Door Functionality
When the player stops overlapping with either of the collision boxes an event called “Reset” is called. This reset event allows both collision boxes to generate overlap events again if the player is now on a different side of the door.
Door Reset
Suitcase
I added a suitcase that contains one of the major clues in the storage area of the boat. It requires a key to be able to open it. When the player opens it, a level sequence plays that shows the suitcase opening and being rummaged through to find a syringe filled with poison. A clue is then added to the evidence board.
Playthrough
References
mixamo (N/A) Character Animations [Asset Resource]. Available online: https://www.mixamo.com/#/ [Accessed 10/2/2023].
Animations Used:
Breathing Idle Crouched Walking Crouch Idle With Axe Male Cheering With Two Fists Pump Male Crouch To Stand Sitting and Impatiently Waiting Standing Angrily Standing Death Left 01 Walking Backwards Walking (With a Swagger Closed Fist)
This development log will document the creation of the gameplay mechanics and the implementation of them into the gameplay scenarios as the game further develops as this is my main priority as well as any extra work I do for the project. I began by prototyping some of the mechanics in a test environment to check the mechanics worked before adding them to any work other team members had done.
Crouching Mechanic
Pressing Left Ctrl on a keyboard allows the player to crouch which is intended to allow the player to find hidden clues. I didn’t want the player camera to move with the player animations so I didn’t connect it to a bone in the player skeleton. This meant I had to implement the crouch in a different way.
Crouching Mechanic Demonstration
Usually, the Crouch functions would be enough but the camera isn’t connected so I have to manually move it. I used timelines and vector lerps to set the relative location of the camera so that it wouldn’t teleport to the end position and would move there gradually over the length of the respective timelines matching the animations. I used vector variables, made using values that matched the position of the camera if it were connected in standing and crouching positions, that were plugged into the vector lerps. To make sure nothing clipped with the camera, I hid the spine_01 bone of the character.
Crouch Functionality
Picking Up Clues
The player can pick up a clue by pressing the Left Mouse Button when in it’s vicinity. Clues will be found throughout the game that change aspects of the game. Currently, they just change some dialogue but later they will be used to solve the murder and unlock hidden areas.
Clue Mechanic Demonstration
A collision box is used to detect when the player is overlapping. This sets a boolean that allows the player to press the interact key to pick up the clue. A message is displayed in the UI when this can happen via a function from the HUD blueprint. When the player interacts with the clue, a boolean variable is set in the gamemode blueprint (this blueprint can be accessed in any blueprint) to indicate that it has been collected and the clue actor is destroyed.
Clue Blueprint
The visibility of the interact message depends on the value of the Show Message input which is set when the Display Message function is called which allows the function to show and hide the interact message.
Display Message Function
Dialogue System
The player can talk to NPCs by pressing the Left Mouse Button near them. Multiple questions can be asked with one having different responses depending on whether a clue has been obtained. Dialogue ends after any option is picked but eventually the dialogue will loop so dialogue doesn’t have to be reinitiated to choose all options.
Dialogue System Demonstration
I used this tutorial series by Ryan Laley as a basis for the dialogue system. Although, I made various changes so it functioned how I intended.
The player has a box collision that checks for overlaps with an actor that has a specific blueprint interface. This interface is called “Interact Interface” which includes one empty function called “Interact”. This actor is set as the value of a variable called “Interact Actor” to be referenced later and a “Can Interact” boolean is made true. Once the actor no longer overlaps, all these changes are reverted.
NPC Detection
Interacting with an NPC changes the camera shown to one focused on the NPC. The player is hidden as well as player and camera movement being disabled. The “Interact” function from the “Interact Interface” is called.
NPC Interaction
NPCs are controlled by an AI controller blueprint called “NPC_AI” containing two events responsible for part of the dialogue functionality. “StartDialogue” runs a behaviour tree that acts as the dialogue tree for NPC conversation. “EndDialogue” stops the dialogue tree and calls an event in the player blueprint that reverts the changes for the dialogue.
NPC AI
End Dialogue Event
The NPC blueprint is modular because I made public variables that are changeable for each instance that determine the NPC’s name and dialogue tree. The dialogue tree variable is used in the “NPC_AI” blueprint to set the dialogue tree. The model of each instance can be changed by default. The “Interact” function triggers the “Start Dialogue” event from the “NPC_AI” blueprint. Another event in the NPC blueprint called “Angry” is used as a placeholder to show when a change happens because of specific dialogue by showing an angry emoticon on the NPCs face.
NPC Functionality
The dialogue tree operates using composites, tasks and decorators. I created modular tasks allowing them to be reused even in the same dialogue tree and custom decorators used to determine what needs to happen based on different factors.
Dialogue Tree
Composites:
Sequence: Executes all of the connected blocks in left to right order. Selector: Selects one of the connected paths to go down with decorators indicating what path to choose.
Tasks:
StartDialogue: Shows the dialogue UI, sets the NPC name in the UI using the public variable from the NPC and enables the mouse cursor. DisplayLine: Shows input text in the dialogue box UI. To progress the dialogue the player must interact again. AskQuestion: Allows the player to choose a response to a question. They are set in the task values for each instance. The amount isn’t limited but too many may break the UI. TestNPCAngry: Initiates the NPC angry event and also changes the dialogue so they no longer allow questions. EndDialogue: Hides the dialogue UI and mouse cursor and initiates the “EndDialogue” event in the “NPC_AI” blueprint.
Decorators:
CheckClue: Checks if the player has obtained the clue. CheckDetected: Tracks whether the prototype murder has been solved by picking up the clue and confronting the NPC. CheckResponse: Checks if the chosen response is the one needed to progress to the part of the dialogue this is attached to.
Perspective Swap
Pressing F on a keyboard swaps between first and third person. The crouch only works in first person as that perspective is for investigation while third person is for when the player is walking around. The player can switch at anytime but that isn’t how the feature will work eventually.
Perspective Swap Demonstration
The perspective change will only work if the player isn’t in conversation and if no camera change is already happening. The two branch blocks with booleans as conditions track these things. A flip flop block allows the perspective to toggle using two sections of blueprinting like the crouch mechanic. Another branch in the third person section determines if the player is crouching so it can be toggled before the camera change. A boolean variable called “FP?” is used to track the current perspective. It is false in third person and true in first person. The camera needs to be attached to different components for each perspective. The third person camera needs a camera boom so it doesn’t clip with the environment while the first person camera only needs to attach to the player.
Perspective Swap Functionality1
The transitions use timelines and vector lerps so the camera doesn’t immediately change. The third person transition unhides the character’s head which was hidden to avoid clipping with the camera. For first person, the head is hidden on a delay so it isn’t seen during the transition. In third person, I didn’t want the player to rotate with the camera so the “Use Controller Rotation Yaw” boolean is disabled while first person enables this because not rotating with the camera would be unnatural for the character’s perspective.
Perspective Swap Functionality 2
Evidence Board
Pressing F opens an evidence board. This version already has three clues on it to test out a mechanic to connect clues. Clue 1 and 2 connect while Clue 3 is just a red herring.
A Flip Flop block swaps the visibility and ability to interact on and off with the F key input. The mouse cursor is shown and the input mode is changed to Game and UI so the player can click on clues. The movement and look input is disabled while on the board so the player doesn’t accidentally displace themselves.
Evidence Board Functionality
Clicking a clue checks if the connection has been found and informs the player. The first clue clicked sets the value of a text variable called “First Clue” with this clue’s value and sets the “Clue1Set” boolean true. The second clue clicked sets the “Second Clue” text variable and compares both clues with the solutions from other text variables. The connection will then be solved or the booleans will reset. Either way, the player is informed.
Clue Functionality
Perspective Swap Change
The perspective swap now happens when the player walks through a doorway. I kept the existing functionality but instead of an input event a custom event now triggers it when the player walks through the doorway.
Clue Change
I moved the clue into a vent so the crouch has a use. Picking it up now shows it on the evidence board.
Clue Hidden in Vent Example
Evidence Board Change
The evidence board now has to be interacted with on a wall. In the test level, the player needs to find clues to make deductions on the board allowing the NPC to be confronted. The board visuals are a bit more vibrant but still placeholder. Deductions use the connection system from the first version with some changes that make the text green if a clue has been used and text is displayed after to give context to the player.
To open the board, the player must overlap with it. Interacting triggers the “Evidence Board” event which contains the functionality of bringing it up and another event called “Check Clues” which checks whether a clue should be on the board.
Evidence Board Interaction
The “Check Clues” event checks the boolean variables that track if clues have been obtained so if any are true they will be visible on the board.
Check Clues Event
Inspect Body
The body can be interacted with to get a clue that is shown on the evidence board.
The player overlaps with the body to allow interaction. A Flip Flop block is used to toggle inspecting the body. A camera that is overlooking the body and an inspect message are shown when inspecting. A boolean is also used to indicate that the clue has been found.
Body Interaction 1
Body Interaction 2
I made two new events known as “Disable Player” and “Enable Player” which control the player’s visibility and inputs so this doesn’t have to be reimplemented every time it is needed as these can be called instead.
Player State Events
Dialogue System Change
I adjusted the dialogue system so it doesn’t end after each part of dialogue and so dialogue options disappear after being selected. A different greeting is also used after the first time.
I created more branches in the dialogue tree accounting for more variables by using more custom tasks and decorators. The dialogue now tracks if a question has been asked, if it’s the first greeting and if the player has already been greeted. This adjusts the dialogue accordingly for each state.
Restructured Dialogue Tree
Quality of Life Changes
The crouch key was changed to C instead of Left Ctrl. The perspective change was removed because it was unnecessary and requires time to finetune which is better spent on important mechanics. The evidence board now tells the player if they have no clues. The project was migrated to Unreal Engine 5 so the team could use the newer features.
Black and White Visual Style Testing
I tested the visual style from our research using post processing effects which was toggleable via the Enter key. Everything was made black and white using a post processing material that desaturated the world but specific things were intended to still be in colour.
Adding specific functionality to the material allowed any mesh rendered with a custom depth pass and stencil value of 100 to be in colour. Lower values would still allow colour but it would be partly desaturated with the intensity based on how close the value was to 0.
Post Processing Material
References:
Laley, R. (2020) Unreal Engine 4 Tutorial – Advanced Dialogue Pt.1 – Interaction [Video]. Available online: https://youtu.be/3uW7CgmrKAo [Accessed 10/10/2022].
To implement audio into my immersive piece I used the DearVR MICRO plugin mentioned before in Adobe Audition to adjust the positions of all my audio files to where they should be. When this was done I exported the combined binaural audio file into Premiere Pro and rendered out the final 360 video.
Adobe Audition with dearVR Plugin
I had to cut some of the sounds I intended to use as there wasn’t space within the animation for them to be implemented acceptably. To improve upon this I could’ve implemented test audio in Unreal to test the timings of the audio. This would’ve allowed me to adjust the animation times to allow for all the audio to be implemented.
My VR 360 experience is intended to be watched while standing up as the player is standing up within the animation. However, the experience should still be watchable while sitting down but there will be a disconnect between the height of the player and the user. As with some other VR experiences, it is up to the discretion of the user whether they want to sit or stand up.
Premiere Pro 360 Video Project
To create the animations for my immersive design piece, I used the level sequencer within Unreal to animate all the characters using the animations I sourced online. I didn’t implement any sound in Unreal because as stated already I am going to use Adobe Audition to simulate spatial audio. To make sure all elevator scenes lined up correctly I added a camera to my elevator blueprint so between sequences the camera stayed in the same place. This was especially necessary for the otherworld sequence as the scales were adjusted which caused an unconnected camera to be displaced from where it should be. However, the otherworld scene was a bit off center when I put all the scenes together in Adobe Premiere Pro so I adjusted the position of it in Adobe After Effects by duplicating the video of the otherworld sequence and moving it along to the left so it would match perfectly.
Office
The office sequence is very simple as it mainly consists of the player being able to look around before the elevator button is pressed and then the elevator opens before the screen fades to black. This sequence used to include the player being in the elevator but it worked better being part of the void sequence. This sequence was quite simple to animate as I just has to change a material and adjust the transforms of the elevator doors and the player hand.
Dark Void
As the majority of this area is dark, this sequence is going to rely on audio and used specific lighting to keep the player captivated. The intention was for the player to be on edge. This sequence starts with the player in the elevator as it is traversing to a different floor before it starts to strangely malfunction as the walls fade into transparency. The light then goes out as a spotlight turns on leading the player to see a glimpse of some mysterious entity. The entity also appears behind the player and then somehow sends the elevator to another strange place. This sequence will have audio of the void spirit talking to the player and audio of the spotlight to lead the player as to where they are supposed to look. To animate this sequence I used three animations that came with the Paragon: Sevarog asset pack to animate the spirit how I wanted as well as keyframing the transform of the spirit character. The rest of the animation involved toggling the visibilities of lights within the scene as well as changing materials. To change the materials of the elevator parts that become transparent I had to add a dither temporal antialiasing part to the material blueprint of the metal connected to opacity mask. This is because metallic materials can’t have their opacity manipulated normally. This is so the opacity of the metal goes down before it switches out with glass so the transition is smoother. This part will fade into the next scene to add to the magical teleportation as the two scenes will overlap momentarily.
Dither Temporal AA Blueprint
Otherworld
This sequence starts with the player being accosted by inhabitants of the otherworld. One of them is cautious and taps the elevator, another is inquisitive and inspects the elevator and the final one is aggressive and attacks the elevator. The giant appears after a little while and scares them away. The giant then sees the player and roars before attempting to crush the player. The animations used in this section were all sourced from Mixamo. The positions of the characters were adjusted by manipulating the transforms as the animations intentionally didn’t move them.
Elevator
The elevator scene is a short scene in which the player seems to be back in the real world and is recovering from the events that just happened to them. The animation is simple as it is just manipulation of the transforms of both the player hands.
References
mixamo (N/A) Character Animations [Asset Resource]. Available online: https://www.mixamo.com/#/ [Accessed 5/1/2023].
Animations: Banging Fist on Table Climbing (Pulling Up To A Ledge) Climbing Up A Wall Goofy Running Kicking (Male Thrust Kick With The Lead Foot) Kneeling Inspecting (Kneeling and Inspecting Element With Hands) Looking Around (Idle Stand Looking Around) Looking Down (Looking Down And Away) Look Over Shoulder (Quick Nervous Look Over Right Shoulder) Mutant Roaring Nervously Look Around (Nervously Looking Around Left To Right – Loop) Petting (Petting A Large Animal) Strut Walking (Male Strut Walk) Reacting (Being Surprised And Looking Right) Run Look Back (Running Looking Back) Running (Running Forward Quickly) Running (Silly Run) Walking (Careful Walk) Walking (Male Brutal Walk)
This first test render shows an early version of the environment when the full area was lit up. There was an error with this render as the camera is faced the wrong way. This is due to how the 360 render works in Unreal as the start point will always be the start rotation of the camera when it is imported into the scene. I couldn’t figure out a direct fix so I instead rotated the entire environment so that it would face the right way. Flickering can also be seen on parts of the environment in the back. I couldn’t figure out why this was happening either which is one of the reasons I darkened this area as well as having no purpose for the animation.
My second test render shows experimentation with implementing the simulated embodiment. This test allowed me to figure out that the camera was a bit too far away from the elevator button as it isn’t realistic for the player to be that far from their hand. I also decided to render in 8K resolution for this test. Compared to the first test there was a noticeable increase in visual fidelity without the render times changing that much. From these results, I decided to render my final project in 8K resolution as higher visual fidelity would better immersive the users.
The final test render shows the final iteration of this office environment in which the important parts are the only parts lit up. It shows how I adjusted the position of the camera to better match the player hand as well as showing how I implemented the “navigation”. The elevator that the player fades into is actually a different one as I wanted to match the rotation of the camera so I duplicated the elevator facing the other way for when the player moves into the elevator.
Before starting to develop my final project, I decided to reorganise my story structure to make it a bit more cohesive and to allow for the most complex part to conclude the project. Originally, the idea was for the giant part to be the middle section and for the dark void area to end the piece. I decided to move the dark void area to the middle as it will end with the mysterious entity sending the player to the environment in which the giant resides. I also developed the giant part further. While searching for assets to use, I was inspired to change the setting from a fantasy village to an alien-like world. I personally thought this environment would be more unique and potentially more interesting to the player.
Environments
My approach to environment design was to make use of existing maps from asset packs and edit them to suit the needs of my animation or create them in Unreal.
Elevator
SketchFab Elevator Model
The basis of the elevator was a simple elevator asset from SketchFab but I recreated parts of the model using Unreal Engine’s unbuilt modelling tools as certain parts of the model had to be changed for what I wanted. This was because I wanted to change the material of the walls of the elevator to make them transparent but with how the original model was set up this changed too much of the elevator.
Unreal Elevator Model
Office
Original Office Map
The office utilised the “Loft Office (Modular)” asset pack. This perfectly captured the type of office I was looking for as it’s a nice looking environment that wasn’t overly complicated. I edited parts of the environment to better suit my project which wasn’t too hard due to the modular nature of the pack. I wanted to have a poster behind the player and the wall that was originally there didn’t work too well for that so I replaced it with another wall from the pack. I adjusted the lighting of the environment as I wanted the narrative to be that the player was leaving work late but the map was in the daytime. To match the later time setting, I closed the windows and replaced the open blinds as well as removing a clock with the wrong time. The original map had a meeting room which I removed as I instead placed the elevator where the doorway was. The poster which I added is a reference to the Alice in Wonderland brief as it is a picture of a white rabbit.
Edited Office Map
Dark Void
The void environment didn’t involve any asset packs as it was mainly just the elevator in a pitch black environment. To create it I duplicated the office map and removed the office assets leaving the elevator in darkness. However, as I wished to use light to direct the player for part of the void section I created a floor for the void using the Unreal tools.
Void Map
Otherworld
Original Otherworld Map
For the otherworld I decided to look through an asset pack known as “Elite Landscapes: Bundle Pack” to see if there was a landscape that I would like to use. I decided to change my idea because of this pack as I was drawn to the alien landscapes included in the pack. The landscapes were quite big and intensive though so I had to delete parts of the landscape that weren’t going to be visible in my final render to make it easier to render. Due to the scale of the landscape, I had to adjust the size of my other models to better fit in with the landscape.
Edited Otherworld Map
Characters
Player
As I wanted to show the player’s hands as a representation of VR controllers, I needed an asset for this. I decided to use the Remy character model from Mixamo which I imported into Maya to separate one of the hands. I also used the Mixamo skeleton to pose both a pointed hand and open hand to be used in the animations.
Pointing Hand Model
Open Hand Model
Void Spirit
The void spirit was intended to be spooky and mysterious so I decided on using the Paragon: Sevarog character asset pack which perfectly met these attributes. I did have to adjust the model slightly in Unreal as the character had a hammer which I didn’t want to use. To get rid of it, I used a material with 0% opacity as it was an easier solution than editing the model. This asset pack came ready with animations that would be suitable for my idea also so I didn’t need to find or create any animations for this character.
Void Spirit Model
Citizens of the Otherworld
As I developed the otherworld section of the project, I decided that I wanted more characters than just the giant to add more narrative to this strange world. To meet the new aesthetic I decided on the Alien Soldier model from Mixamo. When testing this model in the world, it didn’t stand out in the environment as much as I wanted. To achieve this effect, I adjusted the material of the model to have a higher emissive value on it’s emissive texture which added a considerable glow to the characters removing any visibility issues.
Otherworld Citizen Model
Otherworld Giant
Original Giant Model
The final character of my piece was the giant. I wanted to get a menacing character model that would also fit in with the set aesthetic of the otherworld. I found this with the Paragon: Grux asset pack as it included a character model of an imposing figure wearing advanced technology. I chose a version of this model that had a magma effect on it’s materials to really make this character stand out when he arrives in the animation. This character pack did come with animations but they weren’t applicable for what I wanted so I brought the model into Maya to remove the weaponry as I wanted the giant to favour physical brute strength rather than weaponry. I also removed some accessories that I didn’t really like from the bottom half of the model.