Early Bird

A game about a seagull who overslept on the day of migration.

2024 • 12 people
UnityGameplayEvent SystemLevel LoadingUIGame Juice

Key Contributions

  • Player movement
  • Scoring system
    • Leaderboards system
  • Level loading/transition system
  • Game juice

Jump to Conclusion

Overview

This was the first game I worked on at The Game Assembly. It was my first time working with YouTrack, Perforce, and sprints. It felt like such a professional environment, which was a nice change of pace from my previous experiences. We had to pick a game to use as reference, and we settled on Race The Sun, a simple game where you avoid obstacles while collecting pickups to survive.

Player Movement

This is the core of the game. Without it, there would be no game! I really didn’t want to mess this up, so I did my best to make it feel good. I really didn’t want the movement to be instant, or else it’d be too snappy. But I also didn’t want it to feel too floaty, or else it’d feel more like suggesting where to go rather than actually controlling it.

In order to make our movement as easy as possible to tweak, I used animation curves for basically everything. I think at this point, animation curves were my favorite Unity feature. This let us easily adjust values while we were playing, as well as giving us a visual hint of how movement behaves.

Screenshot of the bird movement script in the inspector
Safe to say our movement has been tuned extensively

Scoring System

Gaining score is simple. The main way is by distance traveled, but there are also pickups that give you score, as well as increasing multipliers. For distance traveled, I just added +10 points every second the player is alive. However, I felt that the score display was a bit too rigid. It was always an increment of 10, which felt very cheap. My solution was to add a random value between 1 and 7 to each score increment.

For the pickups, I used my expertise from Car Game to make them easy to define by using ScriptableObjects. This made it easy to create new berries with different score values and multipliers.

The score multiplier system was also very simple. Every five blueberries collected increases the multiplier! Colliding with an obstacle resets the multiplier back to 1.

Level Loading/Transition System

Another thing I was obsessed with was the level loading and transition system. I didn’t want any interruptions. I wanted a near-seamless experience, and I think I pulled it off pretty neatly!

I experimented a bit with additive scene loading, and it was just what I wanted. The main idea was to have a main scene which holds all the core systems then load and unload levels into it!

To mask the level switching, I animated a quick camera swoosh which changes the perspective to look at the player from below, then back to the normal perspective as the new level loads. One problem I encountered with this was that there was still a slight stutter when the new level loaded. I started looking into the Unity Profiler to see what was causing the stutter, and sure enough, it was the scene loading itself. I kept overthinking it, and eventually came to the conclusion that there wasn’t much I could do with the time that was left, so I opted for the simplest solution I could think of: simply load every level before the game starts!

It’s definitely a hack, but with some optimizations like disabling unused scenes, it worked well enough to feel seamless.

Game juice

This project was so extremely well-scoped, that during the last week of the project we didn’t really have anything to do. I decided to add score popups when collecting berries, which made the experience feel less cheap. Then, I felt a bit adventurous and decided to make a stupid little animation for when the player collects a berry, and oh man did it make the game feel so much better!

Bonus: Leaderboards System

During one of our stand-ups, somebody joked about adding leaderboards to the game. Well, one thing led to another, and suddenly I was halfway through implementing it. It took me far less than I expected, and in the end we had a simple leaderboards system which used PlayerPrefs to store the top 5 scores locally.


Conclusion

Fantastic project to start off my time at The Game Assembly! It taught me a lot about how it is to really work on a game project with a team. I’m really satisfied with the systems I built. The bird movement feels good and the level transition system is fantastic.

I think my favorite contribution was the little berry animation. It really shows how big of a difference small details make.

One thing which made me really reflect on my work, happened in the last couple of hours before submission. We held a little competition within our group, and whoever got the highest score would become the default #1 player to beat. However, due to the random score increments I spontaneously added, the highest score was highly affected by luck.

I no longer make significant gameplay changes without checking with others.

Overall, I’m very happy with how this project turned out. I feel very lucky to have had such a fantastic team to work with!

Denis
Codreanu