Introduction
In this project I set out to create a 3rd person action/stealth adventure set in a near future setting. The focus was to create a whitebox experience. The project includes level design and scripting.
Project Details
- Developed over 4 weeks
- Engine: Unreal Engine 4
- Level Design
- AI Scripting
- Performance
- Whitebox
- Epic Marketplace Assets used: Advanced Locomotion System V4, Blocking Starter Pack, Matte Painting Skybox Pack II
Pre-production
Gathering reference material
I began my process by gathering inspiring images, I believe that any material whether it being images, videos or music is worth gathering at this stage since it’s not only meant to be used as reference material but also as a source of inspiration.
My reference library largely consisted of images of brutalist architecture and Icelandic/Norwegian landscapes.
Landscape reference
Since I based my level on a real location I used google earth to survey the landscape in that area. This greatly helped when drawing my overview since I got a better understanding of the mountainous region.
Before and after overview
blockout process
Iterations
During the blockout phase I always try to iterate on my design since this is when it's the easiest to make changes. Although I try to iterate early in the process, I have no issues with making large iterations further into the process as shown in the blockout gifs.
Gameplay
Distract enemies
The player is able to whistle at enemies alerting them. When alerted the npc will search the origin location of the whistle. This mechanic allows the player to isolate targets and eliminate them without getting spotted by other npcs.
I thought about implementing a ranged distract ability similar to the coin toss from the hitman series but due to time constraints I never implemented this mechanic.
Using the environment
I wanted the player to be creative with their environment, using it to their advantage. Environmental kills also count as “accidents” meaning that they will not alert the npcs, allowing the player to take out enemies without alerting their associates.
Exploding barrels may not be the most innovative mechanic but they’re a lot of fun! Especially when they send npcs flying into the canyon, leaving no evidence!
Player perception
When playtesting I realized that it can be really difficult to predict enemy paths and sometimes players would walk around a wall and be surprised by an enemy lookin right at them. I combated this by introducing a “hearing” mechanic which allows the player to hold a key which will narrow the players field of view but outline nearby enemies, allowing them to predict npc paths more efficiently.
This mechanic felt a little unfair but by tweaking the distance of which outlines render It can be balanced.
Keycards
I wanted to create high risk high reward situations in the level promoting exploration. Certain guards carry keycards in the level. These keycards allow the player to access areas otherwise locked.
The player can either pickpocket the keycard or get them of a downed npc.
When implementing this system I was a worried that players wouldn’t understand that certain doors require keycards, therefore I created signs sharing the same color as the keycard, communicating their usage area to the player.
Platforming
Albeit a very “gamey” mechanic, I enjoyed adding a bit of platforming into the experience. It added a bit of lightness to an otherwise serious experience which I believe made the level more fun.
Design Techniques
Funnel Before Reveal
I utilized the funnel before reveal technique in order to enhance the reveal of the super weapon. Initially the reveal framed the weapon in the cave but I wanted to surprise the player. Which is also why I added the bird directing the players attention to the right just as the helicopters fly past.
Working with Sequencers
For the helicopter flyby I contemplated creating a blueprint actor that would follow a splined path, but ultimately felt that this was unnecessary. A more effective way of creating the same feeling was by utilizing the sequencer in unreal engine.
Framing the objective
I wanted to highlight the importance of the bridge so I used framing to draw the players attention toward the area.
I also placed two guards in this area to slow down the player's speed allowing the player to further take in the view.
Leading the player
During playtesting I noticed that it wasn’t clear that the player was meant to drop of the train onto the platform under the bridge. By adding a wire hanging over the edge I created a leading line. I further enhance the visibility of the lower platform by placing contrasting sheets underneath the wire.
In case this wasn’t enough I made sure that the player was never in any emergent danger while observing their escape route.
Using movement to draw attention
Another issue noticed during playtesting was, players not noticing certain guards. This lead to them being spotted without knowing who saw them. The most serious problem was the guards on top of the train center.
Initially there were 2 guards on the roof. Players would almost always forget about these guards and get spotted once they got close enough to the building.
By removing one guard and making the single guard patrol a path, I lowered the risk of getting caught while also drawing more attention to the single guard.
AI Scripting
Custom perception
Normally the built in perception system in unreal engine would suffice for a whitebox level experience, but I wanted to challenge myself in creating my own system using blueprints.
An issue I had with the built in perception system was that it traces to the middle of the cylinder collider of the actor. This causes the AI to lose sight of its target if it’s behind a low cover.
I solved this by using two linetraces, one to the head and one to the waist. If only the head trace reports a hit, then the target will be considered “in cover” and the AI will continue its combat behavior. If none of the traces reports a hit, depending on how far away the target is. The AI will either advance or search.
Cover system
I decided to use cover nodes for the AI similar to the system used in my Insurgency level. In the behavior tree there is a task which will look for an empty cover node, reserve it, then move there. This prevents several AIs from running to the same cover.
An issue I noticed during playtesting was that the AI would use covers right next to or sometimes behind the player. This didn’t feel realistic so I changed the AI from using a sphere trace around themselves, to a box trace towards the player. This made the AIs feel a lot better.
Dynamic patrol system
I wanted the AI to feel more believable so I created a patrol system which allowed me to assign tasks on each patrol node. An example of a task would be: Pick up a box then drop the box at another node. These small tasks made the AI feel more natural which improved the stealth experience.
I can also set the speed of which the AI should patrol between nodes and whether or not they should rotate to a certain angle when stationary.
Closing Thoughts
This project was a learning experience in which I got to delve deeper into AI scripting while also utilizing my design skills in creating a whitebox experience. I'm not entierly happy with the result and If I had a couple more weeks to work on the project I would redesign the beginning and the end of the level to better suite the stealth gameplay. I would probably also consider making the level a night level since I believe being able to hide in the shadows would enhance the stealth experience.
In conclusion this was a great project in which I learnt a ton. I could definitely see myself working on this type of level in the future!
Thank you for reading!