Full list of Changelog can be found here:
Added Final Assistant Boss
The final stage did not include a procedural generated level. Instead, it entailed a pre-built level.
Added assistant boss state behavior and narrative text which follows once the assistant has been defeated.
The narrative was coded out using a coroutine which involves waiting for a few seconds before changing the text.
Added future level
I wanted a vaporwave aesthetic for this particular level as this is the dimension where the time traveler came from. Vapor wave includes pinkish tints and cyperpunk elements. Example picture below.
Added machine and liquid canister props
The liquid canister emits a poison gas when destroyed. Player and entities standing inside the gas cloud will take damage over time.
Added Turret enemy
Turrets were the given choice as they were used for self defence. If the player is too close to the turret, the turret will go into their attack state and start firing a rapid succession of projectiles. If the player moves away from the turret detection radius, they will enter their idle mode and retract.
Added Robot Enemy
These robots possess a powerful sniper rifle each. When a player is detected, a red laser beam will appear and track the player. The robot will also change its color to red. After 3 seconds, the robot will fire a fast moving projectile. This particular enemy serves to make the game much more challenging as the enemy sometimes could be out of sight and it is up to the player to dodge these projectiles and destroy these enemies.
Added enemy spawn prevention radius
I ran a playtest with some of my friends and i realized this game breaking problem. Enemies sometimes spawned at the same position as the player and this caused the player to take damage unfairly. To remedy this issue, I ran a check on the player spawn position by drawing a physics circle overlap. Player detection was a public float in which i could control the radius of the circle.
The circle collider checks through all entities(wall and floor prefabs) and collisions which resulted in some lag. To prevent that, I gave it some conditions to check only for enemies.
if(hitColliders[i].tag == ("Enemies") && hitColliders[i]
To prevent the circle from detecting the player,
hitColliders[i] != boxCol && hitColliders[i] != edgeCol
If enemies are detected, destroy them. Hence, this created some breathable space for the player at the start of each generated scene.
Added in game timer (Source: https://www.youtube.com/watch?v=ixlIaMuhkbM)
I felt like the players needed a sense of how long they have played the game. As a result, I included a timer for the players to keep track of their playing time.
In Addition, I wanted to further the narrative concept by making the player lose certain amount of time whenever he fires his weapon. This is still in development.
Adjusted health pickups to drop only when player has lost health
Prior to this, health pickups were dropped by enemies even when the player had full health. This could be a potential exploit for the player to "conserve" health pickups and using them only when they had taken damage. To fix this, all I simply had to to do was to enable health drops only when the player's health is not full.
Further development could include increasing the drop rate of health pickups according to how much health the player has left.
Object Pooling (Source: https://www.raywenderlich.com/847-object-pooling-in-unity)
The most important part of game development is optimization. Optimization refers to the cleaning up of junk codes and making the game take up minimal yet necessary CPU memory.
Initially the game was running fine with little to no lag. However as the game progresses, more enemies are spawned which results in more projectiles and being created. Hence, the process of creating(instantiating) and destroying are two of the most intensive operations in the game. To help lighten the load on the memory, we make use of object pooling. This refers to pre-instantiating gameobjects which are going to be used in the scene itself. For example, In the forest level, we know that bandits are going to fire projectiles. As a result, I would need to create an object pooler to instantiate these projectile gameobjects at the start of the scene. During the scene, the projectiles that are supposed to be created and destroyed are now being replaced by the activating and deactivating of the pre instantiated gameobject which is now the projectile.
In this case, I assigned 30 enemyskeleton projectiles to be pre-instantiated. We can see the highlighted projectile represents an activated version of that particular gameobject.
As a result of object pooling, there are lesser instantiate and destroy executions which results in a smoother gameplay experience.
Added Boss CutScenes
This is to preempt players that the current stage they are in is a Boss Stage rather than just going in blindly and encountering the boss.
Added Yakuza Boss
Yakuza Boss is an advanced version of the mafia enemy. He has a minigun that fires a rapid succession of projectiles in the shooting state. Using a random factor, the boss may have a chance to chase the player and if the player gets within the range of the boss''s katanta, he will swing his weapon, dealing 2 damage to the player.
The minigun settings:
The low cooldown rate allows projectiles to be triggered rapidly.
Added Urban District Level