- Game Summary
- How To Play
- High Level Gameplay Decisions
- Graphical and Sound Assets
- Graphics Pipeline
- Procedural Generation
- Particle System
- Querying and Observational Methods
- Changes from Participant Feedback
The Minotaur is a mythical creature of great might, who had a labyrinth created around it just to contain its power. Every year the king sends nine of his greatest warriors to try and defeat the unstoppable beast and after forty winters, no mortal has yet had the power to defeat it.
Theseus, son of Aegeus and the undefeated champion of Greece, has taken upon himself the challenge of defeating the Minotaur. Our courageous champion has decided to face the beast alone.
Traverse the labyrinth as Theseus, collect items and fight monsters, and delve deeper into the brink to finally kill the accursed beast.
Controls
Move: W, A, S, D Keys
Jump: Spacebar
Sprint: Left Shift Key
Melee attack: Left Mouse Button
Charge ranged attack: Hold Right Mouse Button
Ranged attack: Release Right Mouse Button
Pause: Escape Key
Gameplay
Walk into health items to heal
Walk into stat increases to increase the corresponding stat
Finish levels by falling down the hole
Beat the game by reaching the final level and beating the Minotaur
Camera View Choice
Our game is in first person view as it brings a more immersive experience and makes the game scarier since players will not know what is hiding behind a wall providing an element of surprise!
Enemies
We decided to put enemies into our maze to make the game more challenging for our players.
Enemies attack with projectiles since it’s simple to implement and enables the player to predict and dodge attacks as well.
Enemy AI uses the unity navigation mesh system for built in pathfinding. If an enemy has direct line of sight of the player, it stores the player’s last known position, and moves toward it.
Stat System
We included a stat system in our game that makes the player stronger as the game progresses as throughout the levels, the number of enemies increases and the player will have to be stronger in order to progress.
The stat pickups are randomly placed in each level and players will have to explore the whole level if they want to get stronger.
There are 4 different types of stats: Health Stat which increases max health of the player
Stamina Stat which increases the max stamina of the player. When the player sprints, it consumes stamina in order to move at x1.5 speed.
Speed Stat which increases the speed of the player.
StrengthStat which increases the strength of the player.
Ammo Stat which increases the maximum ammo capacity of the player. The player can hold right click to charge a ranged attack. Charging longer will deal more damage (quadratically) but consume more ammo (linearly), thus making it beneficial to fully charge the ranged attack.
Healing Item which refills the player's health.
Ammo Item which refills the player's ammo.
No graphical & sound assets were custom made for this project. Refer to the references section for all the assets used in the game.
Graphics
We chose graphical assets that fit the ancient Greek theme of the game. The texture of the walls and floor along with the torches on both sides of the walls are intended to fit the visual look of a labyrinth from that time. Two of the enemy models, the centaur and of course the minotaur, are figures from Greek mythology. The sword used is a 3d model replica of an actual ancient Greek sword. The borders of the UI health and stamina bars have a Greek patterned texture. The font used is also Greek-inspired.
Sound
Ominous background music was chosen to fit the foreboding and puzzling nature of the labyrinth. The enemies each have a unique damage sound effect in order for the player to clearly know which enemy they are attacking. A player damage sound effect was also added to give a clear indication of when the player was hurt along with the health bar decrease. Pickups have a sound effect to also clearly indicate to the player when they have been picked up.
World Space Texture Shader
The World Space Texture Shader was created to solve the issue of distorted texture mapping on the walls of the maze due to their differing sizes.
Distorted textures when using Standard Unity Shader
Fixed when using World Space Texture Shader
Instead of mapping the wall textures to the object UV maps, the texture is mapped to world space. The side of the wall that the texture is mapped to is first determined by calculating the direction of the normal of the wall and then assigning UV coordinates accordingly.
Along with the conversion to world space, lighting was also manually implemented in the shader since it was required to be a vertex/fragment shader rather than a Surface shader. This involved adding diffuse lighting, ambient occlusion and specular lighting. The specular lighting is calculated using the Blinn-Phong model. The lighting is done in two passes in order to incorporate the effects of all the lights in the scene.
Dissolve Shader
The Dissolve Shader is applied to enemies after they die to make them dissolve out rather than abruptly disappear when they are destroyed.
The shader works by sampling a noise texture, and then removing the pixels with a lower noise value (the darkest pixels in the noise texture). As time passes, the threshold for a pixel not being removed increases, until eventually all pixels have been removed. The randomness of the noise texture leads to a random-looking dissolve effect. The shader also incorporates different colours to look more interesting. Each colour has a different threshold that must be passed in order for it to be rendered, making the different colours merge into each other. In order to activate the shader only after the enemies die, a time variable is incremented from a script and its value passed into the shader.
The game’s levels are multiple sections placed sequentially. Each section has a maze inside, with walls between sections removed.
The first section of the level is always empty with a tube the player falls down from. The last section of the level is always empty with a hole the player falls into to finish the level.
Mazes are generated using what is essentially a depth-first search in a 2D array of cells. Each cell is initially set to have walls at every possible position. A random cell is selected to be the start for the search, and as the algorithm moves between cells, it marks that there should not be a wall between the respective cells. When the algorithm detects it cannot move between cells, it backtracks along the path it has taken to find a cell to enter.
Enemies, health items and stat increases have a set amount per section, and each category are placed independently of each other. They are placed inside the maze using a priority system on cells. Cells that are further away from previously placed entities are prioritised.
The particle system that is to be assessed is the Fireball projectile, which is shot by the enemies when they attack the player.
The fireball is a combination of 5 particle systems that each contribute a particular visual effect to the overall fireball, such as the base material, outer glow, smoke and sparks. For the base fireball, an explosion sprite sheet is animated over time to create a fire-like flickering effect. The Colour, Size and Rotation of the particle system are modified over their lifetime to make the fireball more dynamic. The trailing effect of the smoke and sparks are created by setting their Simulation Space to World. The different shape of the sparks to the rest of the fireball is done by setting its Shape to Cone.
The querying method used was a survey. 7 people participated, all between the ages of 18-22, with a fairly even gender split and varied gaming experience. The responses from our survey can be found here
The observational method used was the Think Aloud method, with the participants being asked to vocalise their thoughts while playing, which were recorded and analysed. 5 people participated, all between the ages of 19-21, with a fairly even gender split and varied gaming experience.
Some of the main improvements that were suggested by participants from both the querying and observational methods:
- Make it clearer what each pickup does
- Make it easier to collect pickups
- Add a way to exit from the main game
- Add an incentive to kill enemies rather than just run around them
- Prevent enemies from spawning in one location rather than evenly distributed throughout the maze
- Make the final boss & enemies in general harder
- Reduce the time that the player has to wait before attacking again
- Enemy health bars are too high to see
- Add boss music to play during final level
- Add a ranged attack
- Added text that is displayed when the player collects pickups to make it clearer what each pickup is supposed to be
- Made the pickup hit colliders larger so that the player can collect them more easily
- Added a pause menu where the player can view the game instructions again, exit to menu or quit the game
- Made enemies drop pickups when killed to give a greater incentive to kill them
- Updated the amount pickups increase by due to more pickups being spawned
- Made the enemies harder to run past by increasing their speed, and making their colliders no longer triggers
- Adjusted enemy spawning to be more evenly distributed throughout the maze
- Increased difficulty of final boss
- Reduced the player attack cooldown time
- Moved enemy health bars to be in front of enemy rather than above them
- Added boss music
- Added a charge-able ranged attack that shoots a bouncy ball.
- NavMeshComponents - Unity Technologies
- TextMeshPro - Unity Technologies (Only available in the Unity Package Manager)
Models
Enemies
- Enemy 1
- Enemy 2
- Enemy 3
- Enemy 4 with animations done using https://www.mixamo.com/
Items
Textures/Materials
Fonts
Sounds