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

To mark an end of our game project, I worked together with my other two teammates, dividing the task to work on specific parts of the game for final compilation. This is where I came in to deliver my efforts, responsible for the obstacles and enemies in the game, the luck bar (health based on timer), as well as final game refinements.




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.


MIB - Module Information Booklet

To guide us step-by-step into the Unity app, Dr Mia also lectures and guides us every week on the features in Unity with practical knowledge during class.



    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.


    At this stage, I'm waiting for the others to finish on their part, so I can make a grand finale to this project by making the final polish and refinement to our game.


    One of my groupmates conducted beta game testing with the other people, and the insights given from the gameplay test proved useful for us and provided ideas on the areas for improvement. From the feedback, we noticed that others will have a hard time understanding what the criteria are to pass the level 2, the controls to deflect the poop to defeat the pigeon boss, and the pre-attack visual warning cues.

    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.

    Short encouragement text on the settings panel


    Same from the quit panel in the pause menu during gameplay

    Main menu visual element animations
    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

    Anchored Position and rotation animation

    Loading Screen
    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 level
    To 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 enhancement
    In 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 Enhancement
    As 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.


    Pigeon Attack Warning Cues
    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.

    Reducing the audio level to avoid sudden loud volume 

    In-game guide to defeating the pigeon
    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.
    Higher order in the layer


    Aircon boss audio effect volume adjustment
    As 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.

    Audio level reduction

    Aircon death sound


    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!

    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

    Popular posts from this blog

    Information Design | Exercises

    Information Design | Project 1

    Application Design II Task 1