Game Development Fundamentals - 2D Platformer

Game Development Fundamentals

The Ancient



The goal of this project was to develop a simple 2D game applying the fundamental concepts learnt from the module.

Some of the mechanics required for the assignment were:

  • Use of game events
  • Use of Cinemachine camera system
  • Integration of UI and gameplay
  • Use of animations
  • Use of physics
  • Use of other game development techniques such as parallax and pooling

This project was developed using Unity.

Level design

For this project, a full game level was created using separated screens in order to introduce different mechanics to the player.

These levels and mechanics were designed as part of a different module: Game design. The level layout has been designed to introduce to the player the game mechanics progressively.


This is a general view of the game layout. In green, the gameplay area. In blue, the cinematic ending area.

Mechanics

The following mechanics were implemented for the project:

Levers: Allow the player to trigger different mechanisms: Door opening or spikes.
The player just has to overlap the lever to trigger it.


Pressable Slab: This allows the player to trigger different re-triggerable actions. Such as spawning crates.


Pickups: The player can collect these to increase his score.


Respawn Point: The player will reappear here once they die.


Spikes: These will kill the player on contact


Breakable Objects: These are purely artistic and will play an animation on entering in contact with the player.


Events

Three different types of game events have been implemented in the game

UnityEvents / Callbacks / Delegates: These are simple events defined in our components, easily assignable from the UI (although can be assigned from code too). Which allows the designer to easily define actions on the occurrence of a specific event.

These have been particularly useful for defining the behavior of triggers that only collide with the player.


Event buffer / Global events: These are events that are sent globally to the game to whatever is listening to it.

These were really useful to communicate game events to the UI without having to couple UI code with any other game code.



Design events / Asset events: These events are useful for designers since they can be created without using any code.

They are based on ScriptableObjects and are used as a handle. They can be created from the project view as a project asset. This way the designer can create whatever event he needs.

For example. We created the asset event StartEndSequenceEvent and fired that event at the end of the dialog. Another component DesignEventListener can use the same asset (or handle) to filter that event.

Cinemachine

For this project, a Camera Confiner has been used to allow the player to focus only on the current challenge.

A camera shake has also been used to make the player's death more impactful.

The camera also behaves as a free camera during some intervals of the level.


UI

Unity UI system has been used for the creation of the game UI.

The game shows the player's score at all times, which animates when increases.


A dialog system with appearing text has also been implemented, which uses ScriptableObjects for the dialog content.



Animations

Animations have been used for the UI, the player, and breakable objects.

Additionally, a component called AnimationEventHandler has been used to listen to animation events and trigger different effects such as footsteps




Also, a specific animation was created for the final cinematic sequence.


Additional Techniques

Parallax: It has been used in open spaces to give more depth to the background


Pooling: Used for reusing FXs and crates, reducing memory allocations.


This project can be found in the following GitHub repository