In this project I wanted to challenge myself with scripting and I wanted to create something light and fast paced.
First person platformer
5 weeks half time (4h/day)
Unreal Engine, Maya
Some assets taken from:
Platformer Starter Pack
Particle and Wind Control System
Chameleon Post Process
The initial idea
I had wanted to make a platformer for quite some time, so this project was obvious to me from the beginning. I was inspired by time shifting levels where you click a button and the world around you changes to a different scene, for example shifting from running in a clean hallway to that same hallway having exploded and you now running and jumping over flames.
I wanted it to be more abstract though, so I decided on just yellow and red platforms floating in the air, and when the shift happens I wanted even the light and skybox to change color. When a red platform is active, all yellow platforms should be seen as a ”ghost mesh”, aka a transparent but still visible version of itself so that you know where the platform will be, but if you try to jump onto it you’ll just fall right through.
I knew early on that I wanted a few different platforms, for example one that was safe, one that could hurt you, one that would move etc. The colors would still work on all the different variations. A platform with red spikes will, just like a regular red platform, get deactivated when you switch to show the yellow platforms.
Switching between platforms by left clicking
All platforms and their ghost meshes.
Note that the black spikes' ghost mesh is only for collision, it can't be toggled on and off.
The goal of the game
For a long time, I was unsure exactly what the goal of the game would be. I was thinking about this abstract world with just platforms in the sky and two big structures in the distance. You were supposed to go to the structures and collect orbs after solving some extra difficult color switching-puzzle in there, and then backtrack to the beginning and leave the orbs there. It wasn’t very well defined in my head.
The project soon became too abstract to me and it made it difficult for me to come up with level ideas, so I changed a few things:
I added the Platformer Starter Pack from the Unreal Engine Marketplace, which I had been wanting to use in a project ever since I first saw it.
I went back to something I had thought about from the start – speed running!
Now, instead of having one big level with backtracking etc. I split it up into several smaller levels that had a time limit to them. With this idea I could now build levels that had a purpose and I could use the assets from the Platformer Starter Pack to make fun reroutes and obstacles.
The idea is that you can play the game once, reading the tutorials and learning the levels, then you can play it again and again, trying to beat your own or a friend’s score. I wanted it to feel like a full game which is why I also added a main menu and a pause menu.
Countdown and the timer starting
Each level has a customizable timer
The platform master blueprint
The second large thing that I changed were the platforms. I wanted to make them more efficient, so that rather than having 15 different blueprints and placing them in the world, I wanted to make one master that held all the different platforms. This was something I had thought about from the start, but I thought my lack of knowledge in scripting would make it too difficult. But, I decided to try anyway and it worked out great!
The master platform blueprint
You can change which type of platform you want the base to be by inserting its number in the field “Which Platform?”, and it’s corresponding ghost mesh in “Which Ghost?” (shown in the gif below). They have matching numbers, so platform 1’s ghost mesh also has number 1.
In addition, you can choose whether the platform should move or not by increasing "Timeline Length". The way I set it up, 9 makes the timeline go back and forth once, 4,5 makes it go only forth once. Clicking "Play from Start" allows it to move as soon as the player starts the level. If this is not checked, because you want the platform to move at a certain point, you instead use its “Move Trigger”, which triggers the platform’s movement when the player enters the trigger. Finally, you can choose if the platform should keep moving by checking “Is Timeline Looping”, and how fast it should go with “Platform Speed”.
Changing between platforms and ghost meshes
Jumping in this game is about 95% of the gameplay, which is why it needs to feel really smooth. There were a couple of things keeping my jump from feeling really great though:
Soft clouds with round edges.
No indicator of how many jumps the player has done so far when double or triple jumping.
A lot of playtesters felt as though it was hard to know exactly when to jump and they felt insecure whether they would actually make a jump or not. Something that caused this problem were my ”safe platforms”, aka platforms that can't be switched and that doesn't have spikes. In the early stages these just looked like any platform, just white instead of red/yellow, but when I started building with the platform pack, I switched them out for clouds. They don't have very defined edges and since you're playing in a first person perspective it makes it harder to know when to actually jump. I think this could have been solved by giving some extra jump forgiveness when jumping to and from them.
Another thing was that playtesters sometimes didn’t know how many times they had jumped. Some sort of sound when jumping or other visual indicators could have been nice, to let the player know how many jumps they have left when double or triple jumping.
Checkpoints & kill zones
To receive nice flow in every level I wanted a quick respawn if the player dies. Every level has one or more “kill zone”-boxes underneath them if the player should fall, and every platform with spikes has a kill zone built into them (with some forgiveness so that the player doesn’t die from just the tips of the spikes).
When the player dies they’ll respawn at the latest activated checkpoint. When the player goes through a checkpoint, the location of that checkpoint gets saved and when the player dies they'll respawn at a "Player Spawn Location" vector that I've placed.
I also added some post processing vignette effects (taken from the Chameleon Post Process from the Unreal Engine Marketplace) for some extra spice when it comes to the checkpoints and an indicator of exactly when the player dies when it comes to the kill zones. See all of this in the videos below!
Two layers of kill zones
Improvements that could be made
Had I had more time I would have fixed the timer so that it has hundreths of seconds on it as well. I feel like that would have added more urgency to the game, in a good way.
I also would have liked to add more levels and experiment more with platform movements and timing, which is something I feel like didn’t put enough time into, which in turn made it really difficult for the player if they didn’t complete some stages on their first try.
I wanted to add a high score board and different difficulties so that if you picked a harder difficulty, you’d get less time to beat the level.
There are a few places where I wanted to give the player a tiny heart attack, but I didn't want the player to ever stand still for too long and wonder what they're supposed to do. And yet, I kept the part shown here in the video.
It was supposed to be a panic filled moment with, what I thought would be, an obvious solution - turn around! But a lot of playtesters got stuck here, just standing at the top looking down, or dying several times without ever turning around.
It's a place where alternate paths could have worked, which is something I hadn't really thought about from the start. Alternate paths could also increase replayability and risk/reward scenarios for the player.
I am very excited about how the game turned out in the end and I am very proud of how much scripting I did and that I challenged myself. It was a lot of fun working on!