Level Design

lake level design process

Game Scripting

side objective, switches, platforms


difficulties encountered

Project Overview

Spooky 3D Collectable Platformer

SpookShot is a third person 3D collectable platformer. The player enters sandbox like levels and completes objectives to progress. For this project, I designed, scripted, and constantly iterated on my work. The project was created in Unreal Engine 4.26 with a team of eight others.

Level Design


The goal for this level was to create an lake area with little islands, platforms, and a foreboding tower. The level needed to introduce and reinforce the use of switches and platforms. Given the many uses for platforms and switches, I wanted to incorporate them into the collectables and side objectives as well. I also wanted tricky platforming sections for some collectables and shortcuts.

Design Goals

Level Flow

Like Super Mario 64, the player has a main path and additional side objectives along the way. I incorporated this design philosophy with the addition of collectable coins, and a time trial objective. The main path for this level is broken up into three major sections.

1) This section introduces the player to switches. It starts with a confined area requiring the player to use the switch to progress. The area then opens up but allows the user to continually fall without much punishment. This reinforces the switch mechanism to the player up to the first checkpoint.

2) This section reinforces the use of moving platforms while mixing in more complex switch uses. The player will need to use switches and moving platforms to time openings and jumps. This shows both mechanics can be combined in interesting ways. This area also makes the player respawn when they fall, which adds less room for failure.

3) The final section requires the player to quickly platform before the platforms disappear. This area still has little room for failure but acts as a final stretch for the player to overcome.

Depending on the skill of the player many parts of the level can be skipped entirely with precise platforming. Reinforcing exploration and the plethora of hidden paths.


Scripting Goals

Side Objectives

It was very important to make all systems in the project modular. As the design of the game is contently being irritated on, side objectives would often be added, removed, or modified. Objective are often very different from each other, so I started by creating a master objective object. This object contains all variables and functions that would be consistent between objectives. This includes the objective’s id, name, and an is-active boolean. From there I created child objects and created their individual code. Using this technique, I created the timer objective object. The timer contains it’s own unique elements like a box trigger and UI element, but it is easy to manage since it is part of the objective object.

Switches & Platforms

Switches and platforms take a similar design approach to objectives with them being child objects of a master object. The platforms are part of the event object class and the pound switches are part of the switch object class. With the master event object, I created a function to reset all event objects to their default state. This function is very useful when I need to reset elements of the level without reloading the level entirely such as with the time trial objective. With the switches, I decided to implement different types of triggers such as ground pound, spin, volume, and room for more in the future. Each of these switch types required their own meshes and hitboxes, so I created a master switch object to house the majority of the script needed. The individual switch child objects would have their triggers, meshes, and animations associated with them.



It was very important when creating switches and platformers to get the correct player feel and determine proper use cases for them. I started off by creating a separate level dedicated to introducing the player to switches and different ways they could be used. I used this level to determine the proper timing for disappearing blocks that I would later implement into the lake level.

After the testing level was complete, I gave it off to the user experience side of the team to test and gather data. The initial feedback pointed towards players having difficulty determining what state a switch was in. This was because at the time the state was only conveyed through the color. As I am not colorblind, I did not think about this issue at first, but given this information I was able to iterate on the switch design. I designed the switch to change to a unique shape and play a sound effect. I also accomidated the colors of the switches to more readable for different colorblindness.