Silent Space
Silent Space is a project that was submitted to the Themed Horror Game Jam #6 hosted on itch.io. It is a spooky metroidvania where you play as an engineer who has to weave a path through infected enemies to eventually find, fight, and kill the Xenoencephalon. We took a full month to produce this game.
In this project, my main objective was to work on a game whose core ideas and concepts were imagined by someone else. I wanted to follow someone else’s lead and try to implement their ideas. For this end, I took on more programming and implementation tasks.
This approach was both comfortable and challenging at the same time. On the one hand, it was nice not having to come up with ideas by myself. I could focus solely on getting my hands dirty inside Unity, figuring out ways to translate designer-speak into actually functioning code.
On the other hand, I had to get my hands dirty inside Unity, figuring out ways to translate designer-speak into actually functioning code.
I do not have any formal training in coding. I took one computer science course back in university, which was helpful — but that was Java. Most of my coding knowledge comes from trying to teach myself how to use Python.
C#, which Unity tends to use, is a different beast, but as the month progressed, I found myself more and more at ease using writing code. Different functions started to become familiar to me and I was able to solve basic problems and resolve bugs with relative ease.
On top of the programming, I also implemented a lot of different features using Unity’s tools themselves. I became more familiar with the Animator, Animation States, Timelines, etc. Honestly, this was the most I have ever been involved with actual game-making on Unity and it was a blast.
My “magnum opus” within this project is the Boss Fight that the player unlocks by collecting the required keys. I’ll be the first to admit that it is not very good. The pacing is off, there are a lot of safezones that the player can use to cheese the fight, the animations are a bit janky, and the combat requirements do not match the “vibe” we wanted to have in the game.
However, I appreciate all that it taught me in terms of technical skills. I programmed a basic state machine for this boss. Each attack/phase of the boss is a GameObject that is deactivated by default. Based on how many hitpoints the boss has left, different phases get activated and deactivated. Each phase includes a timeline a full loop of which is the boss’s attack. Each timeline is controlled by a custom script that allows these timelines to be run at regular intervals. The boss also then dies and perishes and there’s a timeline for that too.
I then had the other people on the team test the boss and adjust the fight based on their feedback. The final version of the boss fight (as of the date I’m writing this) is significantly better than my first pass — which is as it should be. I want to go back and keep adjusting it, but I also do want to move on and work on the next thing. Whatever that might be.
Honestly, I am very happy with how this project turned out. It could have been better, but I think I got what I needed out of it: technical practice.
For fun, here’s a list of all the things I did in this project:
Input Manager update. Modifying the character controller we use work with what we want.
This included adjusting the code to support both controller and keyboard.
Added animations and animation state machines for the Screamer, Crawler, Infected enemies.
Created an alert system whereby the Screamer enemy can detect the player and update the Game State. This creates an Alert state on all enemies and different behaviors can be plugged in.
Player animations added
Liptank enemy that knows where the player is and shoots was added. It can also hurt the player.
Adjusted the enemy projectiles so that they go through enemies but not the player.
Implemented a variable height jump that works by slightly lowering the player's gravity so long as the jump button is held.
Accidentally invented a jetpack while doing the previous thing.
Created a multi-phase boss fight with 5 different attakcs. These were created using several timers in C# as well as the gratuitous use of Unity's timeline function.
Attack 1 has "heads" that slam at the player. Before each head appears a flashing red tell object appears to warn the player.
Heads have jaws that move.
Attack 2 fills the room with gas. One head continues to slam at the player.
Attack 3 spawns enemies.
Attack 4 is more heads.
Attack 5 is faster heads.
Created a system that detects if the player is inside the boss arena. This triggers boss camera, boss HP UI element, black box elements that hide OOB, and the boss prefab itself.
Boss room locks when player is fighting. If player dies, boss resets, room unlocks. If player wins, boss dies, room unlocks. When player leaves, room locks again, but boss will not revive.
The boss attacks the player if the danger meter goes too high
It spawns a prefab at player's location and then a timeline does the attack
Several bug fixes!