top of page
Search

The gates of the underworld are now open! Enter Dragonscape!

  • Writer: Adam House
    Adam House
  • 18 hours ago
  • 5 min read

Type: Public prototype

Genre: Platformer and Rocketship game.

Engine: Unity.

Key Roles: Game designer, Level design, and programming.

Released: 3rd March 2026.

Last updated: 8th March 2026.

Learned from: Complete C# Unity Game Developer 3D from Gamedev.tv.

Made by: Only myself, though few assets were provided to me by the instructor.


You are a lost dragon soul who was mercilessly killed by those puny, blood thirsty humans. You currently reside in the Underworld, suffering for eternity; you are sick of the torment and are willing to escape to the land of the living to get revenge on humanity, while avoiding traps and other collisions along the way. Do not lose your head....


Will you be able to pass through nine dungeons to escape the cruel and unforgiving Underworld? Step into their gates and find out or suffer forever in the Underworld!!!


Originally going to be a Rocketship game, I decided to make it more interesting by flexing my creative muscles and using assets from Synty to create dungeons within the underworld instead of Space and a flaming lost dragon skull instead of a rocket.


Some new tricks I learnt from the course while others I learned from research on Youtube.


This was a short exercise to increase my level design, game design and programming toolbelt for much more complex projects in future. 


Fun fact: the game was originally going to be called “Dragon escape”, but was shortened to Dragonscape instead, pretty cool huh?


WHAT WENT WELL?

•  I used my experience to make creative level designs and made some assets share the same code to perform similar actions, some e.gs are  

- Used swinging trap script on pendulums and hanging chains.  

- Used rotate script on not just saws, grinders but also on a gameobject parent pivot to rotate saws and flame bricks clockwise around the level making it challenging for the Player to get through the last level.

- Stone slaps and grinder parents share the Oscillator script.

•  Made prefab presets of walls, floors, and ceilings, ground, and other assets to make level design less time consuming.

•  Used some code that I learnt from the Super Mario Clone a while back to make the Spear trap trigger only activate when the Player is in its trigger.

•  Managed to make the lava geysers and fire traps to be deadly to the Player. They also share the same code.


WHAT I LEARNED:

•  From researching on Youtube, I made a mechanic where a pendulum swings back and forth repeatedly by using three variables controlling its rotation speed, angle direction to change, and position to start. This same script is used for the chains.

- In further detail, it rotates from its current position in a new vector3 using LocalRularAngles and Mathf.PingPong with Time.time.

•  public variables are also known as member variables.

•  Another thing I learned from Youtube was making text slowly appear on screen rather than all at once. This is done with Textmeshpro with an IEnumerator, yield return Waitforseconds with an for-each loop and int variable to determine how many letters appear per second.

•  Rb.Relative force is used to make the Player thrust forward which adds force to the rigidbody relative to its coordinate system, meaning no matter the current rotation of the Player, it will always go forward in local space. Vectors are both directions and magnitudes.

  •  Able to make Player thrust sounds loop seemingly without glitching hurting the Players ears using an if statement with a property. e.g if (!audioSource.isPlaying).

•  Made the Player freeze and then unfreeze rigidbody rotation while manually rotating by its transform so it does not cause a bug to make the Player jitter when colliding with obstacles. We don't want physics and collision to fight each other the whole game.

--Oscillator--

•  Created an Oscillator that starts from Point A to point B and back again in a loop from transforms.

•  Prevented the Oscillator to have errors by comparing its given period/speed (float) to Mathf. Epsilion.

•  The Oscillator measures how much time has passed with period multiplied with Time.time.

- Time measures how much time has elapsed.

- Period controls how much time for the cycle to be.

- Cycles will divide with the period to complete 1 cycle. e.g 2 secs to divide with time is to complete 1 cycle. - Time will keep on updating every amount period makes.

- It is calculated by Tau which is multiplied with PI which gives it a wine movement equation.

- It than uses a Math.Sin to multiply the tau with the cycles to give it a +1 to -1 in direction, though it moves from 0 to 2.

- than we assign the movementFactor with rawSinWave which we add 1 which equals 0, we add it to 2 and then we divide them with 2 = 1.

- This will offset within its vector creating a smooth movement from point A to Point B with clean code as a result.

•  Created a debug feature that turns collisions on or off for prototyping purposes, this allows the Player to collide with obstacles without dying when hit.

•  State machines are like if and else statements. This is used when Players collide with certain objects.

- It only executes true if the Player collides with certain tagged objects (e.g finish, untagged, and friendly), and does not go further down code unless it is false.

- Break: do nothing more and don't go to the other cases.

- default, also known as else. This is used for untagged objects that kill the Player character when collided with it unless the debug collision is on.


WHAT WENT WRONG, COULD I HAVE DONE BETTER?

•  I could have used the Mathf.Round to make sure that the Spear trap exactly goes to the accurate calculated distance by floats forward once activated. I will keep that in mind for next time when I make similar traps in dungeon crawlers.

•  I should have the prefab set sharing 1 whole collider on the parent gameobject rather than its child gameobjects to make tweaking colliders or turning them off easier when collision is not needed.

•  Next time, I will need to program more variables to better control how long the fire shoots for, wait before shooting again and test a bit more before developing levels. Sometimes the Player can pass through the fire without being killed, it could be the amount of particles is small or collider placement issues since they don't use 2d colliders.

•  The Players soul fire particles have a delayed response except for the sound, I don't know if it's a code issue or particle issue, but I will let it go this time.

•  I haven't figured out how to reset the Oscillator every time the Player dies and restarts the scene, If I want it to be consistent with the scene, I should research how to restart positions of the Oscillators with every scene load.

• Next time, I should have removed the debug keys, so Players don't figure it out and cheat their way through the game. Good thing I will remove them next update.


OVERALL

•  It was a nice fun little project, some things I could have done better, but still made me more confident of making games on my own.

•  I definitely want to stick to making fps games, though the preset prefabs I made can be useful to making dungeon crawlers in less time.

•  The mechanics can be good for making spacecraft minigames if it was for a fps sci-fi game.



 
 
 

Comments


bottom of page