Who Opened
The Hatch?
Introduction
It had been over a year since I worked on a game project. A 20 Second Game Jam prompt was a good opportunity for me to refresh my memory of the process of game development. The focus of the jam was on the honing of skills necessary to polish the core elements of a game in order to grab the players' interest in a short amount of time and have them wanting more. For this project, I've teamed up with an artist and a music composer, April and Claire, from the jam's Discord server.
Theme
The jam offered a range of themes to choose from and they were all optional. I have leaned towards the theme "rocket" since, at the time, I was interested in the physics mechanics, inertia and gravity assist.


Zodiac Ranger HSS (Haffkine Space Station)
Title
This was initially going to be the third game in the Zodiac Ranger series, but I have chosen to keep this game as a stand-alone project for a few reasons including the following: all the games in the Zodiac series so far are set in an environment where the player's ship rotates around an object as a result of gravity, and gravitational slingshot is the essence of those games which is missing here. I have chosen the name "Who opened the hatch?" since it felt like a question that could pique curiosity and it also sounded funny.
Gameplay and Level Design
I wanted to make use of inertia as one of the core mechanics since I find a mix of control and randomness to be quite enjoyable at this time. I have decided that a fixed screen would be efficient since it would cost considerable amount of time to move around an object like in Zodiac series. Once I've established that I wanted a fixed-screen game, I had to choose a role for gravity. To do this, I needed to see what the level looked like and I had to playtest it a few times with different parameters.

Prototype

Prototype

Spawn layout (not to scale)
I've set up a 2x4 grid where each "cell" contains a script for
spawning tiles. Each spawner consists of nine slots (positions) in
a 3x3 grid layout. A specific number of these slots would be
chosen randomly at the start of the level and tiles would be
spawned in these slots. Some of the ideas that I have considered
and prototyped are:

Prototype
Though I have started with the idea of gravity being enabled, I have decided to disable the gravity after a few playtests since it felt better to keep the ship moving without resistance. If gravity were enabled, the gameplay would have been much more similar to Lunar Lander. It is not an implication that one is better than the other- they are different mechanics and it is more of a personal preference.
Spawning the Level
I have made a list of slots (positions) from which one slot is randomly chosen by the spawner at the start of the level to spawn a rock in. From the remaining slots, 2 slots will be randomly chosen to spawn NPCs in. I have decided to reduce the number of rocks since it would allow more space for players to move around in and enjoy the smooth flow of the ship while also keeping an eye out for the rocks. Now it feels way more relaxing since the focus is shifted towards embracing flight as opposed to focussing on constantly avoiding rocks.
Art
I was focussing on refreshing my memory more than I was trying to make a polished game at the beginning of the project. Some of the earlier assets used involved Kenney's sprites as well as my own.

Prototype 1

Prototype 2

Prototype 3
I've made a few prototypes for the timer UI. An oxygen tank seemed
to be a decent idea that fit well with the premise of the game.
Once I had a stable foundation for the game and realised that I
would be able to complete the project, I have teamed up with an
artist,
April
from jam's Discord server. Though they were relatively new to
producing game art at the time, they were able to adapt quickly
and deliver quality content.
As I have tried pixel art a few times in the past, I wanted to
experiment with a different art style. Inspired by games like
Hollow Knight and Cuphead where the visuals feel like traditional
visual art, I wanted to try an art style that would resemble a
painting.

Collider on the ship
The artist made a few rough sketches of the assets and a variety
of options to choose from. I have chosen this model of the ship
since I felt that its silhouette was visually way more attractive
and seemed suitable for a ship that would be used for rescuing
astronauts in the game.
In terms of functionality, a ship with length and width close to
1:1 ratio is likely to do better in terms of collision with
environment since spinning on its own axis is a significant
mechanic in this game. Spinning with an elongated collider is
likely to cause inconveniences in the level such as hitting a rock
which the ship would have not hit were it facing a different
direction. This decision was made to make the gameplay convenient
for the players.
Perhaps I could have added an elongated collider and designed the
level in such a way that players could choose between an easy
route and a high-risk, high-reward play style. This would require
a good amount playtesting, of course.
The colour of the ship was chosen to contrast the background. The
astronauts were also chosen to be of similar colour since it
conveys better that the astronauts and the player ship are
associated while also standing out from the background.

Rock design 1

Rock design 2
The colours of the rocks make them fit in with the environment but
also stand out just enough for the players to easily spot them.
There are two different rock sprites and the script randomly
chooses one of them at the start of the level. Initially, I have
allowed both the sprites to be used in each game, but I have
noticed that it feels relatively refreshing to have them show up
separately.
For my earlier projects, I have often used royalty free assets
that were made by experienced and dedicated game artists. This
meant that I had little to worry about how well they fit in the
scene. Now that I was having assets created, I had to make sure
that the resolution at which they were being imported into the
engine fit well with the size of the scene, the target screen
resolution, and that the renderer parameters in Unity were set
appropriately to have the images appear in the best way possible
without having pixels glitching.
Music
I have teamed up with a music composer,
Claire, from the
jam's Discord server. They were able to understand the needs and
produce quality audio for the game.
The music was designed specifically to highlight the randomness
that comes with inertia while also focussing on the control that
the player has on the ship. All this was done while preserving a
pace that keeps the players' energy up.
To build hype and reduce monotony, I have chosen the audio
feedback for the NPCs to be escalating each time the player
rescued an NPC.
To save time, I have used Kenney's audio resources as placeholders
and set up the code and components while Claire was working on the
music.
While I already knew how to have one music track looping in the
background across multiple scenes, I learned to implement two
music tracks that would span across multiple scenes depending on
whether the player is in the menus or restarting the level.
I have also learned to use One Shot in Unity which I used for NPC
feedback and explosion sound effects. One Shot is basically "start
and forget" since it cannot be stopped; the benefit is that one
audio source component can be used multiple times and for multiple
audio clips. An example I found while learning about this is of a
cube that is being thrown around in a room and the thuds being
played repeatedly while also overlapping.
I've written a script that changes the pitch of the engine sound
within a fixed range depending on the ship's speed in order to
reduce monotony and to make it feel like the engine is behaving as
expected.
The pitch value changes between 0.5 and 3. The maximum magnitude
of ship's velocity is set to be 4. The magnitude is divided by 4
in order to bring it under 1, and then it is multiplied by 3 since
the top limit of the pitch I have assigned is the value 3. The
bottom clamp, 0.5, ensures that the engine sound does not
completely stop even if the ship is stationary or moving at a very
low speed.
Juice
To make the game feel alive, I've added visual juice and subtle details. There would be shooting stars in the background that fly across the screen every few seconds.

Instead of spawning new shooting stars each time, I had only three
game objects which return to the starting position on the x axis.
After travelling a certain distance within a fixed range, the
script chooses a random position on the y axis, a random speed, a
random length for the body- all within fixed ranges.
These controlled changes allow the shooting stars to appear as
different objects. This is perhaps not the best way to achieve
this effect but this was added towards the end of the project - I
chose to quickly put something together that got the job done
instead of worrying too much about efficiency considering the
scope and size of the game.
I have initially tried to make the stars in the background twinkle
as well, but it was taking more effort than what I was willing to
put in at the time to make it look and feel as desired.

Rock scaling

Rock scaling
The rocks and the astronauts carry scripts that make them spin clockwise or counter clockwise. I have also added two different speeds for each direction in order to add variety and make them feel less monotonous. The speed and direction are chosen randomly at the start of the level for each rock and astronaut. The script on the rocks also makes the rock sprite stretch by a random value within a fixed range at the start of the level.

Ship trails
In order to improve the visual attractiveness, I have added trails behind player's ship. Realistically, it is not possible that such trails would exist in space where there is no atmosphere. However, the need for player's enjoyment outweighs the need for realism.

Filler design
Asset reuse is crucial to save time and energy. This above asset was used (without the faded text) as the filler for the oxygen tank, background for the buttons in menu screens, and a few other places.

Colour test
I've written a script that chose a random colour for the heart each time an NPC was rescued. Though this felt refreshing and exciting, it strayed from the rest of the art style. For the sake of the greater good, I have decided to leave the heart in its original colour.

Scene transition
The circular masking helps in making the scene transition look less boring while also serving the function of getting the players' attention towards the ship at the start of the level.

Camera shake
The camera shake is an obvious element at this point in my game dev journey. The shake upon explosion increases the intensity of the collision and also the players' immersion in the game.
Accessibility
Royalty free font "OpenDyslexic" was used in order to provide a relatively better experience to players with dyslexia.
Bugs
The first bug I had come across was a music track playing in only
one ear. However, the other sound effects were playing in both the
ears. I fixed this by resetting the parameters of the audio source
component in Unity when I found that some of the values were not
in their default state.
The game would stop responding upon starting the level but not
when I start from the settings menu. I narrowed down the
possibilities to audio script which remains across scenes. I've
tried changing the code for how background music gets called upon
scene transition, but it did not fix the problem. I then found
that I was setting the volume of level's background music after
loading the level by taking the value of the volume slider instead
of the slider's value which is saved in a variable. I fixed this
by removing the reference to the slider which does not exist
anywhere outside settings menu and replacing it with a reference
to the variable that keeps a copy of the value set by the volume
slider.
In one of the playtests, I found the audio being delayed in the
game build but working as expected in the engine's editor. I fixed
this delay by using wired earphones instead of bluetooth
earphones.
Playtest and Feedback
Information is key to the player and when the player fails at something in the game, it should not be due to the reason that the game did not give them adequate information.

Danger zone
I was originally going to set the screen boundaries to be lethal
but chose to leave a few pixels of safe space beyond the edges so
that if players accidentally got too close, they would still have
a little breathing room to turn around and get back to safety.
However, this has caused confusion to some playtesters since it
was not indicated clearly where the boundaries exactly were. To
deal with this, I have added a red glow at the boundaries that
light up on that respective side of the screen to indicate danger
if the player touches the screen's boundary.
Lesson: Always provide clear information in visuals, and
preferably audio too, if something has a significant effect on
the players or the gameplay.

Input settings
Though I have added the ability to navigate the menus with both
mouse and keyboard, the initial control scheme for the player's
ship had only WAD keys. Upon playtesters' feedback, I have added
arrow keys to the ship's control scheme.
Lesson: Give multiple options for inputs to allow flexibility
and provide better experience throughout the game for players
with various needs. It is also worth noting that allowing
players to remap the keys is a good idea as well since it gives
them more control over how they interact with the game.
If you are a developer and your game's difficulty level seems
reasonable to you, it is likely extremely challenging to the
players. Some playtesters have said that it was difficult to
maneuver the ship. I tweaked the ship's maximum velocity,
acceleration, and turn speed a few times to make the game playable
to a wider range of players.
Lesson: Keep the game playable for casual players and add extra
challenges and rewards to motivate hardcore players.
"This is extremely good!"
"Good job. Fun game!!"
"Cool visuals and music!"
"I really liked it."
"this ones a ton of fun"
"nicely done. good play and polish!"
Lesson: Use the praise as additional motivation to make more
games. Reciprocate the positive attitude to create a healthy
community and environment to grow in. Offer constructive
criticism if possible.