After making this game, it turned out better than how I expected to be! Due to previous experiences with Unreal Engine 4, I managed to overcome most of the game's technical issues and focused of developing the narrative.
Our initial phase of idea development was slow but steady at the same time. Guilherme provided many interesting concepts and we finally settled on the concept of Dante's Inferno. We started researching on the story and found several images from Pinterest which sparked our interest in creating the game.
Guilherme was interested in character design and I was interested in environment. From there we delegated the tasks to work on. The most important part about working in teams is to make sure we both know which areas we are covering so that we will not have any conflicts in the near future.
We started off blocking out the key areas of the map. From past experiences, I always skipped blocking out because I felt that it was unnecessary and a waste of time. However, I was proven wrong with this game as blocking out allowed us to make changes without scaling and warping the actual model. Blocking out allows us to quickly build up scenes quickly without wasting time building the actual props for the scene. After finalizing the blockout, only then can we swap in and replace the blockouts with actual assets.
Lighting is a key part of making a game come to life. A game can have a strong mechanic but if it doesn't feel real then half of the gameplay is lost. Lighting was challenging and fun at the same time as we had to do several test build of the scene. UE4 has a build lighting feature which accurately displays how light would actually light up the scene in real life. Sometimes, the process of lighting can take multiple tries to get the desired effect.
For the Destructible mesh, I was thinking of using Houdini to generate the fractures and the alembic file needed to contain the destruction animation. Eventually, I found out that Unreal has the option to generate a destructible mesh from a static mesh which is truly wonderful. This was one of my takeaways from making the game.
Sound design is also another aspect to making the game work. You can have a visually pleasing game but you can't have a horrible sounding game. Our goal was to make the player feel immersed in the environment by playing a cave like-ambient sound. With water dripping from the stalagmites onto water puddles, these little sound effects help make up the entirety of the game. Footsteps sounds were also accurately matched to the miner's walking animation to make it seem more believable. Mining sounds and rock destruction sound effects help sell the effect of being in the miner's shoes. The voiceover was quite fun as I had to alter it so that it doesn't sound like me. Reverberation also made it more believably scary and eerie.
To summarise, this game produced unexpectedly good results and I had a blast making it!
We decided to add a prompt at the end of the soul cave hinting that they have to turn back. This was because the player thought that the rocks are minable. Hence we added a popup UI saying that "you can't mine here".
To give the appearance of the devil, I used two animated spheres with emission and black particle systems for the black fog.
The sphere's animation were controlled using a timeline node and then set actor scale 3D node.
Once that is done, the next part was to set the particle systems visible.
Subsequently, the narrative UI part is then triggered.
For the demon's voice, I used a voice modification software called VoiceMod.
- Welcome Dante -
I know you very well...
Well somebody has broke their cycle again...
Have you changed your mind?
Will you choose to go back...
to live a life of mining...
will you choose to go back and forget your sins...
Or atone for all your sins by suffering...
and stand a chance to go to heaven...
So... Which will you choose?
Press 1 to atone for your sins
Press 2 to forget everything
I could choose from a bunch of effects to warp my voice. I chose something inaudible at the same time, dark and eerie but it still felt empty. As such, I used an Audio Volume in UE4 which basically acts as an reverberation box. It creates echoes which simulates speaking in a cave.
The decay time is then set to 9 so as to simulate the height of the cave and the time taken for sound to travel and bounce back to the listener's ears. The final effect was much more believable and realistic!
The series of narrative subtitles over the demons voice were made up by the same system of displaying UI. It was just repeated over and timed properly to ensure that the UI lines up accordingly to the voice over.
It goes on like a train...
At the end of the devil's speech, we wanted the player to make a choice. Either he atones for his sins and suffers immense pain but stand a chance to go to heaven or he chooses to forget his sins and live comfortably with his current life now as a miner.
If he chooses atone for his sins, the character will play a death animation and the screen will fade out slowly to black. After awhile, there's a scream which represents the agony and torture for redeeming for his sins. After sometime, the screen turns to white which could represent an ambiguous ending.
If the player chooses to forgets his sins, the screen fades off to black and after awhile, the game restarts itself, leading the player to "repeat" his cycle of his life as a miner.
We took reference from Dante's Inferno that the last level of hell was a frozen icy lake. Souls which were sent there basically saw the devil themselves and are being devoured constantly by him. We incorporated Plutus's statue which was regarded as the puzzle piece to meet the devil.
I sculpted the statue in Zbrush and then ported it to substance to texture it.
Similar to the destructible rocks, I applied the same concept to the statue. The player has to mine for several times before crumbling. In addition to the breaking of the statue, I added camera shake for a stronger effect. You can control the oscillation duration, the pitch, yaw and roll.
We wanted to create player - triggered illuminated words in this section of the cave.
For reference, Guilherme went to find some quotes of Dante's Inferno. Instead of the usual english quotes, we wanted something more incoherent... As such we went for this particular Italian phrase
"E qual è quei che volontieri acquista,e giugne ’l tempo che perder lo face,che ’n tutti suoi pensier piange e s’attrista"
Translated to english,
And as he is who willingly acquires,
And the time comes that causes him to lose,
Who weeps in all his thoughts and is despondent,
I used Photoshop to create the words and the alpha. I then ported it to unreal and attached it to a plane.
Similar to other triggers, this trigger creates an dynamic material instance which uses a timeline node to control the opacity and emission intensity of the material. I used a linear interpolation node to basically blend opacity (zero) to 100 opacity over a period of time.
Worldofdante.org. (2019). Inferno / Dante Alghieri. [online] Available at: http://www.worldofdante.org/comedy/dante/inferno.xml/1.1 [Accessed 27 Apr. 2019].
We wanted the miner to discover a hidden cave after mining and breaking the rocks. Hence, I used the BSPs to create a rock cluster which is shown in the bottom picture. For initial debugging phase, I set the rocks to have zero collision with the player so it acts more of a placeholder.
The destruction of the rocks was done in Ue4's destructible mesh. It essentially fractures the mesh using a procedural voronoi pattern in which you can control the parameters. In this case, I made it so that the rock is fractured into smaller pieces like this.
Now for the trigger to destroy the rocks!
When the player steps into the trigger it will set the condition node (Mine Trigger) to be true and vice versa when the player exits. Instead of using the event begin node which only fires off a executable flow once when the game begins, we will now use an event tick node which essentially is the same as a void_Update() in Unity.
We will check if the MineTrigger is active, if it is we will want to check whether the player is playing his mining action and this is done by checking the SideScrollerCharacterBlueprint.
Inside the blueprint, we have a mining action which essentially plays the mining action on mouse button left click. When this action is played, it is setting the condition node (isMining boolean) to true and when the action is over, it sets the node to false.
So now, we both conditions (when player is mining and is inside the trigger) are true, the function now moves on to the next stage.
Looking back at the level blueprint, the flow passes through a sequence node and diverges into three outputs. I am just going to explain the main one now. Since we want the miner to mine several times before breaking the rock, we need to create a counter or a countdown system. To do this, we create a float variable called Mine Count and we add a ++ or incremental node which essentially adds 1 to the number each time it is called. Since this is an update function, we can track the Mine Count by adding a print string node.
All we have to do now is set a limit to that mine count to trigger the rock destruction! We implement a greater than node to check if the minecount is greater than (in this case it's 520 for 5 hits), destroy the rocks.
The rock destruction is then triggered by apply a damage to it and setting a hit location for that damage.
Trigger to replace cave section
A box trigger was placed at this section of the cave for the player to trigger the UI text as well as the cave replacement section.
The following code below shows how the trigger works.
When the player steps into the trigger, it will trigger a condition node (Scene 1 boolean node) and set it to be activated. It will trigger the rest of the instruction once with a DoOnce node and the execution will flow through a sequence node. You can imagine a sequence node as a multi gateway in which the execution will flow from multiple outputs. Now, the execution initializes the UI display for the text "- Soul Cave -" as well as destroys that actors from the introduction cave. The multiple blue nodes are referenced actors (whispering cave assets) which have been set to hidden visibility. So in a sense, the introduction cave assets are destroyed and the whispering cave assets are set to visible and collision-prone.
Lighting of the cave was relatively tricky as this was a dark environment and lights had to interact the scene properly.
We were heavily inspired by this illustration by Florian Aupetit. A link to his website can be found here https://florianaupetit.com/all/bw3p5ksxfnlkt8jlh1ac7kitipbebq
In game environmental soul cave in UE4.
To get the final scene as shown above, we made use of 2 elements. Point lights and environmental fog.
The properties for the point lights are as shown. I played around with the intensity of the light to control how strong it gets. The light color is self explanatory and the attenuation radius refers to the falloff of the light. I chose to go with this number as it was provided a mid falloff radius which illuminated the scene nicely. Volumetric scattering intensity setting was used to control how foggy the light gets.
Exponential Fog was used in this case to complement the cave aesthetics. We wanted this cave environment to be somewhat moody, eerie and soul like. Hence this fog proved the most effective in delivering this aesthetic outcome. The properties were relatively straightforward - controlling the density of the fog, the color and the falloff. All in all, fog and lighting works perfectly in harmony.
Aupetit, F. (2019). Work — Florian Aupetit. [online] Florian Aupetit. Available at: https://florianaupetit.com/all/bw3p5ksxfnlkt8jlh1ac7kitipbebq [Accessed 10 Apr. 2019].
Creation of the assets.
Props such as rocks, stalagmites caves were created using the in-built BSPs.
Unreal has a useful foliage tool which allows you to paint and generate static meshes over environments. This allowed me to change the look of the cave from somewhat dull and uninteresting to a more atmospheric one.
All of the rocks and stalagmites were painted in using the foliage brush and I could easily change the position by erasing and re-brushing it again.
Our game was narrative based. As such, we needed some kind of text display to help develop the narrative. As such, UE4 had a UI system which enabled us to do that.
I followed this tutorial video for the implementation of the text: https://www.youtube.com/watch?v=XVU5vNnhgxo (YouTube, 2019)
The UI entails a text box in the center and I created a binding which allowed me to replace the " - Cave -" text to something else via the level blueprint. Now i can create text for the different sections of the caves. I added two animations for the text. One for fading in and the other for fading out. These animations were created to prevent the word from appearing instantly and disappearing the next second.
The following blueprint below shows the initializing of the UI text. An event begin node is used to send a an instruction whenever the game begins. The instruction flows through the enable input node which essentially enables player inputs (keyboard/mouse click) and creates a UI widget. From there, we need to display the UI widget and we can do so by using the Add to Viewport node. Next up is to play the fade in animation for the widget and using a delay node, we can make the text visible for 5 secon