Skip to Content

3D Unnamed Platformer


Itch.io: https://matchagatcha.itch.io/3d-unnamed-platformer

This game is slightly more of a prototype in nature. It was the final project of 7 week course GAME452, Advanced Game Development, and was built by me and a partner over last 6 weeks of the course.


Pre-Development

There wasn’t much of a pre-development brainstorm actually. The first assignment for this course simply needed us to implement things with certain technical skills such as lambda expressions and delegates, and we thought a platformer would allow us to easily use it. It came as a surprise when we found out we were expanding this into a playable game over the course of the class hence, 3D Unnamed Platformer was born and aptly named.


Development

At first it was the usual, a simple establishment of the core mechanics and simple structures. I set up the scoring system with the coins using delegates in a publisher-subscriber pattern to avoid any tightly coupled systems. This allows for the sound sfx, textures, prefabs, and anything else involved to be missing without crashing the game on start-up.

Something much more interesting, is the making of the different platform behaviors. In the finalized project, there are 4 various behaviors for platforms; bouncy ones, moving ones, rotating ones, and disappearing ones. Where it goes a bit further however, is that I made a custom editor window using UXML and USS for Unity that spawns and generates them with ease.

The image on the right showcases how the window looks when accessed in the UI Toolkit tab in Unity. The window provides a quick and simple way to make a square platform with the following steps.

  • PlatformName will name the created GameObject
  • SpawnPosition set its coordinates on creation
  • PlatformScale affects the dimensions
  • PlatformBehavior determines in-game physics, needs a scriptable object to be put in.
  • The Spawn Platform button finalizes it and creates a new game object, but won’t work without a name and scale
  • Without a set position behavior and position, it will spawn a square at 0,0,0.

Platforms are able to be more complex by manually going in the inspector and adding more behaviors, but the window serves as a quality of life tool in mass creating platforms. I developed this tool before we created the level, and it made the scene creation feel seamless.

Actually creating the window itself was quite demanding however, and put me through quite the ordeal to get it running. But eventually I decided to use scriptable objects in order to hold the behavior data. All behaviors are extensions off the abstract class PlatformBehavior which has no functions except for initializing, but serves as a wrapper for me to define what they are.

Each behavior then has a scriptable object that derives from PlatformBehavior, and is a holder for all the necessary variables for functions. For example, scriptable object disappearingBehaviorVars holds disappearingDelay, reappearDelay, and fadeDuration variables that are all settable by the user. All these

Then I made a script that contains all of the behaviors functions. Disappearing platforms have disappearingObject.cs. This script would uses variables from disappearingBehaviorVars and so needs to have one assigned. The reason I needed to separate variables and functions is that the functions weren’t able to reference some key gameObject data they needed in a scriptableObject script.

So in order to fill out the Platform Behavior field in the editor window, a user would first need to create a varsObject for their according behavior. I made default behaviors, but this made it easier for creating a field of similar platforms that needed different variables i.e bouncy vs super bouncy platforms.

Afterwards, you would insert the variable scriptable object into the editor window, where the initialize function would attach the appropriate script, and would insert the variables into that script.

The other significant system I worked on in this project was purely visual. I worked on creating shaders for the various objects and characters using ShaderLab and HLSL. I used these to define texture, color, shine and such for almost everything in the game. The below image was the ShaderGraph I made in order to create the fire geysers.

Some textures I coded included the coin, the fire elementals skin, and the ghost-like look of the disappearing platforms. Additionally, I also used the particle system to create a flame aura on the flame elementals.

With the graphics, sound and visuals implemented, the only thing left we had to do was make the beginning cutscene. We both works on the intro movie together using the Unity animation tools, and used a signal to trigger it on game start.


Post-Development

This project was extremely fun and challenging to me. It was rather unexpected for us to develop that into the finalized build, but the technical exploration of each system helped me a ton. I got to experiment with UI Toolkit, Shaders, and the Unity animation, and I am quite satisfied with how each of the things came out.

I think that the custom editor window could be a bit more polished, it currently doesn’t support multi-behavior platforms so you would have to go in the inspector and manually add the second script. Additionally, the warning signs could be made to only appear on attempting to make the platform without the proper parameters.


Jungle Escape
Jungle Escape
BitterSweet
BitterSweet
Vampire’s Demise
Vampire’s Demise
Execute Operation Execute
Execute Operation Execute