Game Development Final Task
Melvin Yung Khun Yew | 0357241 | Bachelor of Design (Hons) in Creative Media
DST 61104 | Games Development
Week 12 — Week 15
Task 4: Final Project - Playable Game
These are the jump links to each part of this portfolio
Instructions
Dr Mia Bong Mei Fern, my lecturer for the Game Development module for this April 2025 semester, gives us a heads-up on the upcoming tasks and exercises.
Work Process
In this task 3, I'm working together with my other teammates, Lin Si Yan and Teu Yu Tian, to initiate the game development, starting from the prototype to test out our intended gameplay mechanics.
In my blog, I'm going to share my contributions to this design project proposal that I've remembered.
For comprehensive details about work results, please refer to the submission section.
Task Dividing
To avoid confusion later down in the project, we start dividing our task, which is based on the same part we're taking in task 3: obstacles & enemies for me, player mechanism, sound, and storyboard for Yu Tian, and level design and UI for Si Yan.
Task divided on WhatsApp |
Task delegation, detailed refinement on WhatsApp |
Further obstacles and the boss enemies' development
To continue as planned in our game proposal, there will be 3 game levels in total. Thus, I quickly started on constructing and developing the behaviour for the obstacles and enemies in game levels 1 and 3. (As the level 2 was already developed during the Task 3 game MVP)
I included a public field for future adjustment, as well as audio clip fields to reduce the work of others who are working on implementing the audio effects to each obstacle and enemy.
Toaster boss (Level 1)
I prepared the sprite sheet of the toaster boss for the animator in different states, such as idle and attack. I also prepared the sprite sheet of the projectile toast beforehand to set the collision box.
Sprites for the toaster boss and the toast projectile, the animation clip, and the controller |
Toaster boss animation controller |
I set it to undefeatable as planned, so the attack pattern from the toaster will lean much more towards a random attack direction from the targeted direction. However, I also include the draggable sliders for different attack directions, such as random, approximate, and precise. These settings are to allow easier game difficulty balance in future playtesting.
I also include an audio field to reduce the workload for Yu Tian to add an attack sound effect to the toaster.
Fields and settings of the toaster in the inspector |
As for the toast projectile, I used the script to control the rotation speed when in-flight and fade away upon impact.
Toast rotation animation in the inspector |
Aircon boss (Level 3)
Same as the other boss enemies, importing the sprite sheets of the aircon boss with the different states like the inactive, idle, attack, hurt, and death, I later compile them into an animator controller to control the visual state of the enemy. I also include the sprite for the button that will be used for players' interaction to defeat the mega aircon boss, as well as the visual cue on the buttons.
Sprite import for aircon, projectiles, buttons, and visual cues |
Aircon boss animation controller |
Setting the individual script to control the collision with the player on the projectiles, I made both of the projectiles so that they will deduct the countdown timer, which acts as the player’s health.
The settings controller for the fireball and iceball projectiles |
Same as the pigeon boss on the second level, I made the aircon boss only activate and start attacking the player when they walk past the detection box.
Detection box in yellow outline |
To defeat the boss, the player will need to interact with the shutdown button, where the boss will take damage and be shut off in the end, granting the player peace of mind and allowing them to make it past level 3 and onto the ending storyline.
Power Off button in-game |
To prevent the players from spamming the button and instantly defeating the boss, I add a cooldown on the power off button and knock back the players.
Interaction cooldown settings |
As the final touch-up, in order to avoid frustrations on what to do next, I add a visual cue that will appear when the player is near the button, prompting the users to interact with it with the correct button.
Visual cue for button interaction |
Player detection for visual cues |
Obstacles
Some obstacles, including the fan and the socks on the first level, will have their own physics. Let’s say, for the fan, it will detect whether the player has passed through a detection box and trigger the fan to fall down and disappear when it collides with the ground or a player.
Falling fan obstacle in the game |
Movement settings, detection area, visual control, and audio field in the inspector |
The socks, on the other hand, which the physics logic is the same as the banana peels, will fly to the right (ragdoll-like) when the player steps on them and slowly disappear too. I also added that the sock will be in a parabolic trajectory, flying into the air and landing back down on the ground when the player steps on it.
Parabolic trajectory |
Sock obstacle in-game |
Sock obstacle script |
Moreover, for the obstacles on the third or the final level, I have the intention to make the box behave the same behavior as the fan, triggered upon player detection in a certain area. However, instead of disappearing when it collides with the floor, I added a collision so that the box continues to stay on the ground, making it a temporary platform for the player to stand on.
And also, there will be flying books towards the player throughout the level, so they will either need to dodge the books or deflect them with the defense mechanism.
Flying book in-game |
Following a similar behaviour with the skateboard on level 2, the book will start moving towards the player when the player is within the detection range. The book will fall to the ground only when it collides with the players; otherwise, it will continue on its trajectory until it times out and disappears.
Settings for the books in the inspector |
Health/Luck Bar
Since the health bar/luck bar UI is closely related to the player’s interaction with the obstacles and the enemies, I took the initiative to handle the player health UI, where I code the countdown timer in script and update it with the textMeshPro so the player can see how much time left before Luky is tired of the unluck or“death”. With a simple calculation formula, I include the state for the luck bar to update the sprite based on the time left. This is where I went back to my previous UI components illustrator file and started adjusting the individual amount of luck bar to be used for sprite swap.
Luck bar sprite import to Unity with different bar states |
At the same time, I also import the different Luky’s states of emotion based on the time left, such as happy, neutral, sad, and tired, so Luky’s player icon at the side of the luck bar will update accordingly, adding a bit of immersion into the game.
Luky's emotional sprites |
Finally, I drag the respective game objects into the public field in order to link the components together for the UI to work.
Script for luck bar timer and UI state sprite update |
Final Look |
Mid progression
After handing in my work progress to the other teammates to continue on the project with the new obstacles and enemies, I noticed that Yu Tian is trying to enhance the defense mechanism for the player so that the player will deflect the incoming projectiles away, such as the flying book, toaster, falling box etc. Together, I assisted her in the debug of the defense mechanism during class so that it worked.
Feedback from play testers |
Final game touch-up and refinement
After receiving the compiled Unity game file back from Yu Tian, I first checked on the gameplay by playing the game in Unity. After a round or two, I immediately noticed what should be done to the game to enhance the gaming experience.Things I've refined
- Button interaction on the main menu
- Main menu visual element animations
- Loading screen
- 10-second timer on first level (story accurate)
- Visual enhancement on the falling ceiling fan
- Player's defense mechanism enhancement
- Pigeon's attack warning (audio and visual)
- In-game guide on defeating the pigeon boss
- Aircon boss audio effect volume adjustments
Button interaction on the main menu
As I noticed, there are no functions on the settings and the quit button, so I added panels for the respective intended functions. The quit button for exiting the application and the settings button are supposed to be for the game-related settings. However, I believe there are no game settings that the players can change, so I incorporated an easter egg into the setting panels, making it a hilarious encouragement word for the players when they happen to come across this panel.
To make the main menu more visually compelling to the players, I ought to make the components on the screen move to add more liveliness to the main menu. Combining with the background music to pique the player's interest in playing the game.
Before that, I realized the background in the main menu is a static image, so I went ahead with Adobe Illustrator files for the UI to export the individual components out for specific animations, such as the game title logo, main character Luky, toaster, and the pigeon in the background.

Sprite import to Unity
I deemed this screen necessary for our game, it is when I noticed the subtle delay/lag when the game is loading up the complex game level scenes with different components. This lag, which often took a long time, will make the players frustrated about whether the game is still responding or not. Looking up the guides to make the loading screen, I've learnt to use the asynchronous loading on the scene manager, where Unity will provide a 0-100 number on loading progress for us to utilize it in a front-end UI loading animation.

Scripts for the scene loader that need async loading
By filling in the target scene name where the async loading is needed, the player will come across the loading screen with the game title logo, a background image, as well as the progress bar and main character with walking animation.

Loading screen
To make the progress bar smoothly fill up the background bar, I've used the filled image type using the UI image gameObject, where Unity provided the fill amount sliders that can be utilized in the script to link it to the Unity backend progress.
10-second timer on first levelTo make the first game level follow the storyline flow with the same time left, I modified the timer script so that I could overwrite the starting timer on the first level to 10 seconds instead of the default 8 minutes.

10 seconds left on board in the storyline

Time override for 10 seconds on the first level only
Ceiling fan visual enhancementIn the previous version, I noticed that when the player jumps on the first level, they can see the weird emptiness above the ceiling fan, which makes it illogical, as nothing is connecting to the fan.

No connection to the fan
Thus, I illustrated a connection axis to the fan with the wire to be placed under the fan so it looks more logical.

Fan axis with wire
Here is the final look:

Fan with the newly added axis
Player Defense Mechanism EnhancementAs my other groupmate mentions, they have a bit challenge in timing the defense correctly and deflecting the projectiles. I know there is something wrong with the deflection trigger in the script. Thus, I looked into the script written by Yu Tian, who's responsible for the defense mechanism, and I found out that the deflection is only triggered once upon pressing the "K" defend key. This makes the players have the right timing on defending the fast-moving projectiles, which proves to be a bit challenging for others.
Consequently, I modified the script to use the defend duration and allow the continuous trigger of deflection until the defend duration runs out. This helps the players to have a much easier time deflecting the projectiles.
Following the feedback from the play testers, I worked on improving the warning feedback to the players when the pigeon is charging up an attack, whether it's the poop projectile attack or the dashing attack.
Firstly, I illustrate a warning sign to be used as a warning cue for players when the pigeon will have projectile attacks. I made it so that this warning sign will blink on top of the players before the projectile comes in.

Warning sign

A warning sign on top of the player
To make the warning more prominent, I also added the sound effects for the pigeon's pre-attack, so there will be a stomach rumbling sound to indicate the poop attack, and the pigeon's growl sound to indicate the upcoming dashing attack.

Audio effects
In the meantime, I also keep an eye on the volume of the sound; the different volume levels on certain sound effects were tuned down in Adobe Audition to make the overall sound level consistent.
In order to give the players a brief idea on how to defeat the pigeon boss and pass level 2, Si Yan helps to illustrate the signboard with the tips and guides for me to incorporate in the background of the level.
To ensure the signboard stays above the background but behind the game elements, I place it on the background layers and set a high number in the order of layers so it will render above the other background elements.Aircon boss audio effect volume adjustmentAs I play through the game at the optimal volume on my laptop, I notice the unusual loud noise produced by the aircon (sound effect) that may provide an unpleasant experience during gameplay, thus I went ahead to reduce the audio gain (by -12 dB) so the audio will blend nicely with the other sound effects.
- Button interaction on the main menu
- Main menu visual element animations
- Loading screen
- 10-second timer on first level (story accurate)
- Visual enhancement on the falling ceiling fan
- Player's defense mechanism enhancement
- Pigeon's attack warning (audio and visual)
- In-game guide on defeating the pigeon boss
- Aircon boss audio effect volume adjustments
Sprite import to Unity |
Scripts for the scene loader that need async loading |
By filling in the target scene name where the async loading is needed, the player will come across the loading screen with the game title logo, a background image, as well as the progress bar and main character with walking animation.
Loading screen |
To make the progress bar smoothly fill up the background bar, I've used the filled image type using the UI image gameObject, where Unity provided the fill amount sliders that can be utilized in the script to link it to the Unity backend progress.
10-second timer on first level
10 seconds left on board in the storyline |
Time override for 10 seconds on the first level only |
Ceiling fan visual enhancement
No connection to the fan |
Thus, I illustrated a connection axis to the fan with the wire to be placed under the fan so it looks more logical.
Fan axis with wire |
Here is the final look:
Fan with the newly added axis |
Player Defense Mechanism Enhancement
Consequently, I modified the script to use the defend duration and allow the continuous trigger of deflection until the defend duration runs out. This helps the players to have a much easier time deflecting the projectiles.
Firstly, I illustrate a warning sign to be used as a warning cue for players when the pigeon will have projectile attacks. I made it so that this warning sign will blink on top of the players before the projectile comes in.
Warning sign |
A warning sign on top of the player |
To make the warning more prominent, I also added the sound effects for the pigeon's pre-attack, so there will be a stomach rumbling sound to indicate the poop attack, and the pigeon's growl sound to indicate the upcoming dashing attack.
Audio effects |
In the meantime, I also keep an eye on the volume of the sound; the different volume levels on certain sound effects were tuned down in Adobe Audition to make the overall sound level consistent.
To ensure the signboard stays above the background but behind the game elements, I place it on the background layers and set a high number in the order of layers so it will render above the other background elements.
Final game touch-up and refinement
After checking everything is intact, I proceed to build and run the game on my laptop with Windows so I can launch the game in .exe files. I also tried to build and run the game in WebGL for a universal gameplay experience where everyone can access the game. I later uploaded the game file to Netlify, an online development platform that includes building, deploying, and serverless backend services for web applications, in this case, suitable for the online deployment of our Unlucky Day game.
In the process of uploading to Netlify, I encountered issues with the Netlify web failed to extract the zip files in the game folder necessary for running the game content. With ChatGPT's assistance, I quickly understood what is the problem was here, and I followed ChatGPT's advice to include a text file that helps the development platform understand the unique file format of several game folders from Unity and extract them for the game files.
Submission
Play our game, Unlucky Day, now!
In the process of uploading to Netlify, I encountered issues with the Netlify web failed to extract the zip files in the game folder necessary for running the game content. With ChatGPT's assistance, I quickly understood what is the problem was here, and I followed ChatGPT's advice to include a text file that helps the development platform understand the unique file format of several game folders from Unity and extract them for the game files.
Start Playing
Access our Unity Project File and .exe game
Google Drive
Gameplay Presentation Video
My reflections
Working on our final game project, Unlucky Day, has been a truly eye-opening experience. This was my first time seeing a game come to life from the ground up, starting from our own assets and ideas to fully functional gameplay. Throughout the project, Unity scripting took up the majority of my time, as I focused on building obstacles and enemies that connected directly to the player’s health UI. It was a challenge, but it pushed me to explore more advanced scripting and game logic than I ever expected.
The toughest moments came from debugging and refining the gameplay experience. Coding enemy and obstacle behavior, ensuring the health system worked, and even creating a smooth loading screen all taught me how much attention to detail game development requires. Every time a bug was fixed or a feature finally worked as intended, it felt incredibly rewarding.
Working in a small three-person team also taught me the importance of communication and task delegation. With each of us focusing on different areas, we had to stay aligned so nothing was left out. This experience gave me a better appreciation of how game development relies on teamwork, even for a small indie-style project.
Overall, this project gave me hands-on experience in turning creative ideas into a playable game. From scripting to debugging and polishing the final product, I now have a much clearer picture of how games are built—and how every small feature contributes to the overall player experience. It was challenging, but seeing our game finally come alive made every late-night debugging session worth it.
Comments
Post a Comment