The Great Escape
Development Info
Role: Programmer, Audio, Designer
Tools Used: Unreal 5, GitHub, Canva
Duration: March 2023 - April 2023
Team Size: 6
Game Info
Genre: Stealth, Puzzle
Platform: Windows
Project Status: Published
Game Description
Dad, mom, aunt and yourself live together in harmony... not. You like to party, but they've grounded you. The biggest party of the year is tonight and you have to sneak out without being detected.
Contributions
Implemented system for player feedback loop including the highlight ring and the object text display
Implemented sound effects and ambience total of 28 sounds used
Implemented a few hints for the puzzles most notably the diffuser puzzle
Helped integrate art assets into the engine
Quality of life fixes that improve gameplay feel
Helped design puzzles and level
Object Highlight
Object Name Display
SFX Excerpt
Challenges
The learning curve for Unreal was very difficult. This is my first experience using Unreal as well as the Blueprints framework. It took me around a week to learn how Blueprints worked on a basic level. I overcame this challenge by familiarizing myself with the terminologies that Unreal uses like Actors, GameModes, Attenuation, other auxiliary functions, etc. If you know what type of Blueprint or class you are dealing with, you can guess what type of Blueprint nodes to use for your goal.
Using line tracing was a little confusing at first. There were many things that could affect the line trace. For example, it took me a while to find that collision type, channel type, the static mesh even having the collisions set up, distance of the line trace are among the few things that would make or break the line trace. I overcame this by searching multiple posts in the Unreal forums and accumulated the solutions into a list of checks. After that, line tracing was not a problem.
Balancing the difficulty of the puzzles was a challenge. We thought the puzzles were straightforward. It was only during the playtesting session that we realized our puzzles were too difficult and hard to understand. We had to understand that we do not know the perspective of the players since we worked on the game.
Version Control
We used GitHub and Git LFS as our version control software, and we had a rough start with it.
Git was not too compatible with Blueprints. If two people are working on the same Blueprint, there will be a merge conflict and Git will force them to choose one of the Blueprints, discarding all changes made to the other one. There were several instances of this happening in our team, which led some team members to redo all changes they made to the Blueprints. Towards the end, we made sure that everyone was working on a different Blueprint at a time, and we merged often to ensure that we get the most updated version in our local repositories.
Like Blueprints, only one person can edit the map else all changes will be overwritten. We didn't realize it until the end of the project that we should have used sub levels so that multiple people can work on the map.
Issues with version control were the primary problems our team has faced, but after learning how to deal with merge conflicts and communicating to each other what we are working on really helped mitigate these issues.
Git LFS has a bandwidth. We made the mistake of unnecessarily cloning the repository several times which used up the bandwidth. Be wary of this and try not to clone too many repositories.
Code Architecture
I mainly worked on the code architecture for the interactable objects. An object can either be picked up and interacted with, and they both implement the Interact interface. This interface acts like a channel where all line tracings only detect these type of objects.
The pickup object base class contains all of the necessary methods and variables. Each child class only needs to implement its custom pickup and drop function to include the specific sfx when the player does that action.
Similarly, the interactable object base class contains all the necessary methods and variables, and the child classes just need to have their own implementation of the Interact() function. For example, the front door's interact function first checks whether there is a key being held then it opens, whereas the diffuser interact function checks if the player has the correct essential oil before turning on.
Both classes have a detection sphere, which triggers the highlight ring when players are close by.
Overall Code Architecture
Gameplay Loop
Detailed Implementation Of Object Interaction Architecture
What I Learned
It is very important to understand how your version control works. Especially with Blueprints and other uassets, merge conflicts can be a pain to deal with. No one likes their changes being forcibly overwritten. We learned that Perforce works better for uassets.
Code architecture concepts work the same way in Blueprints. It is so important that your Blueprints architecture is scalable.
The audience knows best. Listen to playtesting critiques and feedback.
The forums and the documentation for Unreal is pretty helpful. Familiarizing yourself with terminologies can save you time and improve your intuition when navigating Blueprints.