- Made by myself using Unreal Engine 4.18
- Built during 2 months half-time
- Scripted using blueprints, Unreal Engine 4's built in visual scripting system
- All system and art created by me
- Modelling done in Autodesk Maya 2018
- Art done in Photoshop CC
The Stealth Project is a project I created working half time for about 1.5 – 2 months in the Unreal 4 engine. It’s a stealth experience focusing on the built in visual scripting tool Blueprint, and creating something from the ground up all by myself. The player is told to move through a few simulation test chambers built to test the players stealth-abilities.
The game features two rooms that increase in scale and difficulty, and the amounts of freedom the player has. The player is free to complete the room however she wishes to and is not limited by a specific path. Every room ends with a door frame, that is clearly shown and lit up.
Working with iterations
Starting this project had me look at a lot of other stealth games and try to figure out what features and design choices I felt where going to make a fun and interesting game.
I also had to make sure that I wouldn't be overscoping. It was also very important for me to know that I would be able to complete the features I wanted to implement, and that there wouldn't be any huge difficulties that would slow me down too much.
References and inspiration
During the project I iterated a lot on the base ideas and mechanics. It was important for me to find something that was new and interesting, but also something that people would feel safe playing, as it felt a lot like previous games.
I started out using the older Thief games and the more recent Dishonored games as inspiration. I knew with the limited time I had I wouldn’t be able to create the powers that Dishonored has, so the inspiration was mostly taken from Thief.
Cut light mechanic
The game originally started out having the player wait in darker areas and was a lot more like Thief. This didn’t feel very good however, because of the limited amount of time I had assigned to the project, this became more of a problem than a good feature.
I decided to cut it, to let me focus more on the level design, and the game second-to-second gameplay. There was also an issue with creating well-lit scenes that I could show off and talk about if most of the levels were dark corners.
How the guards see the player
The guards are based on the Pawn Sensing node and can therefor hear and see things in their vicinity. They then have scripted specific behavior for reacting to different actions.
The way that I visualized the cone of vision for the guards was a quite simple method. I used the built in volumetric fog in Unreal, and applied it to a spotlight in front of the guards head. i then matched that with the values of the vision cone, and it gave a pretty good result. Something that I wished I had been able to do is to make it parented under the head, so that it moved with the animations. I think that would've made it feel a lot more polished, as it right now is just a floating light that mostly follows the location and rotation of the Guard only.
When a guard dies or sees the player it sends out a sound to alert guards in it's vicinity, and if a guard is close it will do the same. This could in situation make it very hard for the player, as it creates a ripple effect and can alert a lot of guards to it's location.
When a guard can see/hear the player it enters the alert mode. This changes some of it's behavior, and has it chasing the player around the level for a while. If it looses the player, it goes back to it's patrol route and enters the normal Idle mode again. If the player and the guard touches each other, the game is over.
I originally wanted a more complex system to handle the behavior of the guards, but the combination of time and difficulty made me prioritize other things.
Guard Patrol Routes
The Guards patrol on a set path, that I create using a spline and some basic scripting. The guard checks every second after a new location on the spline, that is a bit further than the one that the guard is currently on. This makes the guard move around the spline, using a simple AIMoveTo-node.
When the Guard is alert and is chasing the player, I also use the same AIMoveTo-node. Using the same node for both was a good idea in my opinion, because it made it very easy for me to stop the guard whenever I wanted.
Scripting the guards
The guards where probably the most time-consuming part of this project, and they underwent a lot of iterations during the development. They originally started out wandering around, where I did a lot of testing. For this I used a wander-AI that I quickly built, using a random position generated in the area around the guard, and a AIMoveTo.
This worked well for quite some time, but I needed some sort of path for the guard to walk on to actually make some gameplay and level design that worked and was interesting. Here is a picture of that script.
The guards also needed a way to hear and see other Actors in the game. Unreal comes with a PawnSensing feature, that helped me quite a bit to do this part of the guard. With some simple tweaks of some values the guard now had some very basic eyes and ears, and I could connect behaviour to these.
Starting out with the basic player
The player is based on the FirstPersonController from the base project included in the engine. This gave a solid base to build upon, and saved me a lot of time. In the final product, most of the blueprints are completely redone however, to make it easier for me to implement my own features and designs. Adding a proper tilt feature and a smoother crouch was for example a lot easier after I redid the players input.
Implementing the Stun Dart
The player has a stun dart it can shoot at guards to take them out silently. This is the only way to take out a guard, and can change how a room is played. When the dart has been fired, it stays in the location it hit something. The player needs to go pick it up again to fire again. This makes it a risk to just randomly shoot the dart, or try a daring strategy. This added a new level of risk I really enjoyed, and this is something I believe helped the game a lot.
When designing the level I wanted to focus on a smaller space with two different distinctive areas. The first room needed to be smaller in size, and simpler in gameplay, so that the player would feel comfortable starting the game and trying it for the first time.
The first room therefore only has two guards, who never intersect. There is no penalty for using the stun dart, as the guards can't hear each other due to the distance and change in elevation.
The second room was a lot more fun to work on, because it is more complex. It was also a room that I built after all the basic gameplay was in such a developed state that I could test it out instantly.
When laying out the first iterations of the levels I had a few requirements for a room. I needed the exit to be clear, and I needed the room as a whole to have good flow and a clean layout. This was to make it very clear for the player where to go. Both rooms also give the player the advantage in the start, placing the player higher up and free from danger when it enters through the door.
Adding an underpass to the second room helped the design a lot I think. It gave the player two different distinct ways to complete the room. The response from testers was good, so I kept the room and kept iterating on it.
I think that if I would have more time to work on the project I would probably do more areas like this, maybe vent shafts or a path through a cieling. I think it added a lot of depth to the level.
I thoroughly enjoyed working on this project, and I learnt about blueprints, scripting, stealth mechanics and game design and space planning during this project. It allowed me to go deeper into something that I really enjoyed working on, and it was a very rewarding experience. I think the part I improved the most on was the visual scripting, which was something I had played around with before but never really made something complete. This project gave me that possibility, and I learnt a lot about balancing the work and prioritising things that were more important to the games over all feel, instead of just working on the most fun thing for the moment.
If I were to do this project again I would probably focus a lot more on the enemy behaviour, and make it feel more alive by giving it more states to act. This was always the intention, but due to the complexity of the scripts I did not have the time. I would also probably create some basic meshes to prop the levels more, and create a more believable world for the player. Another thing that I would love to create is an alarm system, that connects with the guards and makes the whole level work together.