Exhibited is a first person stealth game where you play as a genius inventor who crafts her own gadgets to help her steal artifacts from a villa in a Mediterranean country.
|Development time:||32 weeks total (still ongoing)|
|Made in:||Unreal Engine|
|Team size:||+/- 33|
|Supported platforms:||Windows & PS4|
|Planned release on:||Steam|
|Gadget system (more information here)|
|Shock glove gadget, noise maker gadget and goggles gadget (more information here)|
|Player heatmap tool (more information here)|
|AI Debugging tools (more information here)|
|Player game statistics (more information here)|
|Steamworks implementation (more information here)|
|Automation tests (more information here)|
For this game I made the gadgets system, this is made mostly in C++, with some exposed functions to blueprints to make it easier for designers to use/change it if necessary. All the variables to change the behaviour of the gadgets are also exposed to blueprints/the Unreal Editor.
This was one of the first things I made using C++ in Unreal so there where quite some things that I needed to figure out and I needed to get used to the way Unreal uses C++. Luckily I had done some research beforehand and I think the code turned out quite alright.
There also are definately things that I would do different if I had to do it again with the knowledge that I gained. I did do some refactoring on the most important parts, but because I did not have time for it, I could not change the entire system.
The image to the right shows some code of the shock glove gadget that I made which can be used to check if there is a valid target within range. This is a function which is exposed to blueprints, so the boolean argument will be seen as an output on the blueprint node in the Unreal editor. It also returns a pointer to the target.
For this project I worked on implementing the three gadgets that we wanted to have in the game, the shock glove, noise maker and goggles.
The shock glove is a gadget that can be used to shock a guard if the player sneaks up him. Some interesting challenges while making this gadget included figuring out what I should expose to blueprints, since this is the first gadget that I made. Another challenge was figuring out how to check if the player was behind a guard. The last challenge was figuring out how I wanted to make it interact with the Guard, I ended up using an interface for this.
The noise maker is a gadget that can be thrown and when it lands it will play a sound that can attract guards. An interesting challenge with this was figuring out how to display a trajectory of how the noise maker will be thrown. I ended up finding a function in Unreal called "Predict projectile path" that gave me the positions I needed to display the trajectory.
The goggles are a gadget that lets the player spot guards through walls to help him sneak around unnoticed. These where initially scripted by a designer in blueprints but at one point I had to fix an issue with it for which I had to re write most of the logic so I decided to port most of the code to C++ while I was at it.
One of the things that I made for this project is a heatmap tool which can be used to keep track of what happened in a playthrough of a level. This data can then be loaded by designers to see what happened, where players tend to go or to look back at what happened if someone encountered a bug or something.
The tool supports the loading of a single file by name, or every file at once. Once loaded you can decide exactly what you want to display to make it more clear what is happening, since showing everything at once with multiple files loaded can become quite cluttered.
To the right you can see an image of the tool in engine. This example shows all the data that can be shown from multiple save files.
I worked on making debugging tools for the AI in our game. These include showing the paths of the AI agents, showing their current state, the state of the AI director, last known player position, last suspicious spot and who they are following (if they are following another agent).
Our team wanted to know what the general playstyle of a player is so that the scoring system could be balanced off of that.
So I implemented data gathering into the game, this was necessary for the score screen as well as for what design wanted. Then, I made support for saving to and loading from a csv file. I considered using a JSON file, but as a csv file can be opened directly in Excel (or something similar), it was a better fit since it is easier to look through for design.
Since we want to release our game on steam, we needed to add steam achievements. We also wanted to make use of the steam leaderboards so that players can see how well they did compared to others.
Because of this, I added steamworks to our project and made sure that the steam achievements and leaderboards were working as intended.
For this project I worked on some automation tests to speed up development of the project and making sure that the quality is up to our standard.
One of the tests that I made was an asset test which checks the amount of vertices of the mesh and it checks if it has a material applied since this was requested by QA.
To do this I used the automation system that Unreal provides. This brought up some interesting challenges since there is not a lot of documentation on this.
In the end I managed to get the tests to work and to run on our buildserver so that the tests automatically get run after it builds the project.
Copyright 2020 - Jonah Rutten