Welcome to our game development log/README.
Click here for a working prototye of our game!
MS2 working prototype can be found here
README
- Level of Achievement
- Motivation
- Game Ideation
- Tech Stack
- Milestone 1
- Game Ideation
- DevLog
- Software Engineering Practices
- Testing
- Gameplay
- Save feature
Level of Achievement Apollo
Motivation As lovers of 2D pixel-art games as well as traditional platformer style games, making our own game that combines these 2 elements has always been on our bucket list.
(We want players to experience a retro-style looking game that has the smooth and sharp mechanics of modern platformers (e.g Metroid Dread and Ori franchise). We also wanted players to experience a game that is unique: offering special mechanics and a playstyle that is not restricted to a certain linear flow.)
Game Ideation We took inspiration from Metroidvania games for their non-linearity game progression as well as classic 2D pixel-art games for their retro style graphics.
In Metroid Dread, obstacles that require power ups not yet acquired such as Grapple Beam (as shown above) are introduced in the game early on, requiring players to go back to previous locations once acquiring certain abilities
classic 2D pixel artstyle we took inspiration from
Oslo was intentionally designed to look plain as his source of power doesn't come from within himself but the orbs he possesses. Oslo Milestone 1 design
Orbs grant Oslo his power and are meant to contrast Oslo with flashy visuals and colours fireball; a spell available once Oslo obtains the Fire Orb (Milestone 1 mockup)
- Unity
- the game engine used to create our game
- C#
- language used in coding scripts in Unity
- Pixilart
- used to design sprites and animation
Technical proof of concept
We have created a basic prototype game which includes Oslo basic movement and animation, as well as Oslo's Fireball skill.
A Health system has been implemented for Oslo as well as for enemies. This allows them to have a starting health value and take damage as they come into contact with enemy projectiles, and eventually die when they lose all their health.
Screens have been implemented to allow players to navigate through the game.
- Start Screen: To start the game, level select (future milestones)
- Game Over Screen: When the player dies
- End Screen: When the player finishes the game
The story starts in NoWay, Oslo's hometown. Oslo is part of a long running lineage of monks in NoWay who maintains the balance of the world. Right before Oslo is about to succeed his father as head monk, portals spawned all over the world, causing monsters to be unleashed across the worlds! Oslo must travel the world to acquire the elemental orbs that are essential to the balance of the world and use them to seal the portals once and for all.
Oslo harnesses the power of the elemental orbs for combat with his enemy. He starts off with the Air orb he claims from the monastery and gains Air-related powers such as double jump and air strike (a normal melee attack).
(work in progress) We intend to make Oslo's abilities interactive with his environment.
Fire: Fireball is used as a basic combat ability
Air: Float ability allows Oslo to levitate for a certain period of time, dictated by an ability bar. Once ability bar runs out, Oslo cannot use the ability until it fully recharges.
Water: Ability to dive into waterbodies and move freely for a certain period of time similar to Air ability. However, once the bar runs out, Oslo starts running out of breath and takes damage.
PascalCase: Classes, Scripts, Animations
camelCase: Variables
The number of hours spent and task allocation can be seen in the project log below. https://docs.google.com/document/d/1XT90z5Mit2AHdJE8UPNN7zeuluRcQ2i8rtYhRSdc5VQ/edit
Component pattern Unity GameObjects possess components that serve to add relevant functions and interactions to objects themselves.
Singleton pattern GameObjects that have multiple instances are referenced from a single "prefab" in Unity. For example: enemies that appear multiple times in our games are created as "prefabs". This reduces the work needed to create same enemies multiple times and ensures that they behave the same way. Liskov Substitution Principle Classes who are subtype of another classes can be a substitute of that other class. For example: Enemy Life and Oslo Life (scripts that manage enemy and Oslo (the character player plays as) health system) have a superclass Object life.
Version Control System We use GitHub to allow us to collaborate efficiently on the game and fix any merge conflicts when we make changes to the same pieces of code.
Class inheritance was used in some cases, but for most other scripts, they are unrelated and instead are grouped by the components they are attached to in the Unity Editor.
User testing | Issue | Implemented solution |
---|---|---|
Fire Level too easy, just need to shoot enemies without ranged attack | Difficulty of fire level too simple, mechanics were too basic | Increased frequency of enemy and difficulty for player to navigate through the fire stage. Player has to activate levitate to get past certain obstacles |
Air Level too simple | Air level does not engage the user as they were just jumping past enemies. | Make the user use the ability gained in air stage to navigate through the level |
Unable to keep track of multiple orbs after picking up more than 1 | Orb information was not made available to the player, only to developers through the scripts | implemented a display in the Status Bar for the currently equipped orb as well as all available orbs for the player |
Not sure what to do at the title screen, no instructions provided | Title screen assumes users know how to move Oslo before the instructions are shown to them | To switch to a click button for the start screen before introducing WASD controls to users |
No way to pause/quit the game | Lack of pause menu** | To implement a pause menu that allows users to pause, resume, restart |
Damage system too strict and simple - game over upon losing all 5 hearts is rather strict | Player health system is rudimentary and does not scale properly with damage dealt by enemies | To implement a different health metric when players are hit, consider a HP bar for health per life, and restart the level when players lose all their HP (lose a life), then finally game over when they lose all their lives |
Tutorial is good, but lack of purpose is given to the player, and I feel like I’m just walking around collecting stuff/attacking enemies | Lack of story element incorporated into the game, failed to sustain player interest | To incorporate some elements of Oslo’s story and background into the tutorial, consider cutscenes between levels to further the narrative |
Fireball was damaging Oslo | Fireball is too slow, Oslo can outrun the fireball and collide with it | Increase the velocity of fireball |
Players don't know when levitation was activated | There is no stark visual cue of levitation being activated | Oslo now moves up slightly once levitation is activated |
Levitation causes Oslo to bypass terrain | The method that moves Oslo up once activated bypassed rigidbodies | fixed levitation script |
Unity offers Edit Mode and Play Mode unit tests. Edit Mode tests check for things that don't require the game to be run while Play Mode tests check for things that require the game to be run.
Edit mode was used to make sure simple things such as animations are called at correct conditions.
Play mode was used to check movement of Oslo is always working as intended (e.g jump).
Oslo starts off walking through the title screen. At the tutorial stages, he is greeted with text instructions that guides him on how to use the orbs that he will eventually possess. Oslo encounters a ghost enemy that shoots out projectiles. Simple enemy that require minimal effort to defeat with whatever orbs that Oslo possesses.
We wanted enemies of air to be floating and easy to manoeuvre about as Oslo would be starting off without a combat ability until he reaches other stages. Shoots out tornado projectiles that are relatively easy to dodge.
Simple enemy which damages player once colliding with it.
Water enemy that damages player once colliding with it, could have possibly more erratic movement paths.
Metallic enemy that shoots out projectile in a fixed direction.
Air stage continues right off from tutorial, hence the similar design.
Fire stage contains floor tiles (orange lava) which causes Oslo to take damage periodically standing on it.
Water stage contains water tiles (water body) that causes Oslo to take damage once he runs out of breath.
Earth stage contains metal themed golems that shoot out beams.
Heart collectibles can heal Oslo when he is damaged.
Using the Unisave package in Unity, a basic save and load feature was implemented that allowed users to save their progress and load it.
Data was stored in ArangoDB, Unisave's database, and allowed users to use their email as a unique ID.
Potential future improvements would include multiple save states as well as the ability to load into a level directly when starting up the game.
A pause menu was implemented in playable levels (not cutscenes) to allow players to pause, resume, save, and load their game.