Tornado Alley
Featuring a rogue tornado controlled by the player. Destroy buildings cartoon-style to level up your wind speed!
-
Genre: Top down simulation / arcade
- Engine & Platform: Unity 2022 for PC
- Development Context: University module assessment
- Development Duration: 4 weeks
- Team Size: Solo project
- Total Grade of Module: 91% (A)

Introduction
This is the 3rd assessment of a 3-part assessment series for my university module: Gameplay Scripting. I wanted to create something unique, something that wasn't thought about by my peers. At the time, I was watching videos of hurricanes on YouTube, therefore I had this idea in mind to attempt at coding physical objects spinning in a funnel or vortex. It was at this point of early planning that I recalled I once played a game called "Tornado Jockey" when I was 10 years old. That was where I got most of my inspiration from for this simulation game.
The goal of the game is to grow your wind force or the "Enhanced Fujita" scale of your tornado by destroying buildings and enemies. Following real world ratings and modifying it to make the simulation look attractive and fun to play in:
EF0 (65-85 mph)
Minor damage, such as to plants and street lights.
EF1 (86-110 mph)
Moderate damage, such as to telephone boxes and trees.
EF2 (111-135 mph)
Considerable damage, which will destroy barns and water towers or silos.
EF3 (136-165 mph)
Severe damage, which will destroy small houses.
EF4 (166-200 mph)
Devastating damage, levels whole mansions and small buildings.
EF5 (>200 mph)
Total devastation, levels whole city blocks with relative ease, including tall skyscrapers.
Mechanics
1. Procedural Generation of Map
Instead of manually placing each building down, I used Perlin Noise Generation to simulate somewhat realistic landscapes based on the 4 main types of Prefabs; Light (Small Object)[0], Medium (Farm Building)[1], Heavy (Townhouse & House)[2], Heaviest (Skyscraper)[3]. Typically, this is how human civilisations are in the real world where urban areas are clustered together and farmlands are spread out far and wide, sometimes surrounding a town centre. At this time of development, I hadn't yet learnt to use variables widely instead of harcoding the values inside the code itself.


Snippet of script for perlin noise generation based on prefab type.
An image describing how I came up with the idea.
2. Movement & Camera
The camera is dynamic, making the tornado move in the direction of the camera's orientation. Prior to feedback I received from my peers, the tornado moved independently of the camera's orientation. That led to confusion and unintended movements by playtesters.

Feedback received from my peers who playtested my game.
3. Collisions & Destruction
Buildings don't just disappear, they shake then break, simulating structural integrity based on tornado intensity. Debris get sucked into the vortex then catapulted out. Initially I faced an issue where the collisions were inconsistent where at random times, the buildings won't detect the tornado's collision box. I solved this by merging my trigger logic into one script.

The resistance is based on prefab type as well, though it was manually hardcoded in at the time.
3. Dynamic Scaling & Field of View (FOV)
As the tornado levels up in scale, it doesn't just say it's stronger, it visually grows in size and the camera's FOV dynamically scales with it. This makes destruction feel more intense as you progress.
Features
1. Custom-made UI
Made all UI on a UI/UX app called Figma.


2. Enemies
I initially planned for 5 enemies but due to the constraint of time, I reduced it to simply 3 enemies, each showcasing a different style of attack split into two types: Passive & Hostile. Passive enemies only annoy the player, giving them debuffs, such as affecting temporarily movement speed or scale. Hostile enemies deduct the player's health with projectiles. Since it is a game about tornado and destruction, I had to make it weather-based. For example, tornadoes in the real world dissipate when in contact with water as the density of water is heavier than that of air. Therefore, I based the enemies around water.

1. Tanker (Passive)
Tankers are stationary objects filled with water. When destroyed, it releases water that temporarily slows the tornado down.

2. Storm Chasers (Passive)
Storm Chasers are moving enemies that chase the player down to disperse balls of water. It temporarily decreases the scale of the tornado.

3. Armour (Hostile)
Armours are slow moving enemies that shoot water balloon projectiles at the player as it approaches. Each balloon deducts the player health by 5%.
Challenges
1. Inconsistent Collisions
Tornado collision wasn't detecting objects consistently while the objects were inside the vortex. Turns out, splitting the triggers into individual scripts broke it because it was individually being activated. This was also causing a dip in frame rate as well. I fixed this by creating a singular script for triggers and it has made detection reliable.
2. Time Management
I have massively overscoped on this project but I have learnt to manage my time better by using the Notion software to track my progress, following the way I've done on my previous project called Ironclad Crisis, though I used a different software called Trello for that.
3. Organisation
Initially I haven't been keeping my scripts organised, since this was my second attempt at developing a game in Unity and developing a game of this scale. However I've tried to keep to a standard method of scripting partly for aesthetic reasons as well. Such as adding comments where necessary and keeping most relevant things in one script instead of hundreds of individual ones, except for the triggers of course.
Final Thoughts
This particular project has been meaningful to me as I learnt that I have the potential to develop my own games independently given enough time. I faced a lot of scripting challenges especially considering the fact that I hadn't had prior C# experience before this module. I learnt most C# concepts via tutorials on YouTube after learning the basics from lectures in class.