Sponsored By

Making of Good Cat Gone Bad

This is mainly a list of free tools and techniques that I’ve used in mobile endless runner Good Cat Gone Bad.

Andrey NULL, Blogger

April 27, 2016

7 Min Read
Game Developer logo in a gray background | Game Developer

Target audience: beginner indie developers.

Intro

ezgif.com-optimize (1).gif

This is mainly a list of free tools and techniques that I’ve used in mobile endless runner Good Cat Gone Bad, which will be available in Google Play on 4th May 2016.

The game was developed as a pet project, using Unity 5 and took 4 months on a full-time basis.

Design

After I came up with this crazy core game idea, I started to break it down into application components and describe them using short theses. For example:

Components:

  • game over menu

  • level

  • level area (highway, park, hood)

  • player

  • cop

  • score

  • health

Game over menu:

  • shown when player dies

  • has Restart item

  • has Resurrection item

  • has Exit item

Level:

  • can be completed

  • has completion score

  • the higher level, the higher completion score

  • procedurally generated

  • has a column layout

  • consists of an infinite list of areas

Player:

  • gigantic cat

  • always goes forward

  • can strafe left and right

  • destroys / kills everything that touches

  • has health

  • has score

Cop:

  • stays in place

  • shoots at the player

  • gives score when killed

I use Google Keep to store all these notes and other crap.

Basically, you saw the large part of the initial game design. This was enough to start development. Later I improved the design, by utilizing such things as Core Loop , Subversion , Bartle Test .

Architecture

The project consists of modules. The module is a group of components and assets, related to some feature or part of infrastructure.


Assets/Src/Catzilla

├── AppModule

├── CommonModule

├── GameOverMenuModule

├── LevelAreaModule

├── LevelModule

├── LevelObjectModule

├── MainMenuModule

├── MarketingModule

├── PlayerModule

└── SkillModule

Components and assets in the module are structured by type.


Assets/Src/Catzilla/LevelObjectModule

├── Animation

├── Config

├── Controller

├── Materials

├── Mesh

├── Model

├── Prefab

├── Sound

├── Texture

└── View

Every module (except asset-only modules, like Marketing) has a component that is responsible for initialization of module (binding of services, configuration values, event handlers, etc.).

There is a special module (App) that acts as an entry point of application. This is the place where all other modules are registered and initialized.

Modules are based on Zenject library, which also provides flexible Dependency Injection.

The project’s architecture is based on the event-driven approach. In my case, this means that the key components don’t know about each other, and they emit events, which are handled by mediators, which are responsible for interaction between components.

Graphics

During the level, each frame has < 5k vertices and < 20 draw calls.

All those hipster models I made in Blender. Each model has < 200 triangles. Most of them are made of separate meshes (e.g. legs, arms, body, head) so they could be destroyed.

Cop. Bunch of cubes.

 

Screen Shot 2016-04-20 at 21.39.41.png

Start of highway. Just a plane.

 

Screen Shot 2016-04-21 at 12.18.10.png

Some people don’t believe that this is Impala 64.

 

Screen Shot 2016-04-21 at 12.21.20.png

And some of them think that this is not Miami’s palm tree.

 

Texturing was made using Hyden’s technique and textures of all level objects were combined into a single big (256x256) texture, as an optimization.

Combined texture of all level objects.

 

For the level area (e.g. park, highway), I’ve used material with Mobile / Unlit (Supports Lightmap) shader, and for the level objects - Mobile / VertexLit (Only Directional Lights) shader.

There is only 1 directional light in the game and no shadows.

Reference Resolution of Canvas Scaler is 480x800, to cover more devices. By the way, how many of you are aware of this page?

The game’s color palette was generated using Paletton.

For the text, I’ve used Press Start 2P font, which can be found at Google Fonts.

For the floating text (e.g. score above object), I’ve used Text Mesh, instead of world space UI Text, as an optimization.

UI icons (e.g. health, skills) were taken from 64 Flat Game Icons package.

Animation

Animation was made in Unity’s Mecanim. Only 3 types of level objects are animated: player, civilian and bonus (e.g. that rotating shiny dollar thing).

Running civilian. 5 frames.

Audio

Sounds were generated in Sfxr, it seems to me that it produces better sounds, than Bfxr.

Audio sources use 2D mode (Spatial Blend = 0). Each level object has its own audio source, except player, which has 2, for more simultaneous sounds. But there is only 1 shared audio source for the whole UI.

Sounds are played through an audio manager component, which ensures that there are playing not too many sounds at the same time, and also merges (actually discards) identical sounds that are played within a very short interval, so there is no amplitude overflow in the output audio signal.

Marketing materials

Icon. A true masterpiece. Was made as a separate Unity scene, by placing one of the level areas + player and by adjusting the camera.

Screen Shot 2016-04-21 at 12.30.04.png

You know what it is. The icon.

 

I’ve used Icon Slayer to put some stunning effects on it (rounded corners) and get the needed sizes.

Another piece of… oh, I mean masterpiece, is a feature graphic (banner, promo, whatever), which was made in the same way as an icon, as a separate scene.

Screen Shot 2016-04-21 at 12.41.53.png

Maybe I should shoot those blockbuster movies instead of doing all these?

 

The trailer was made in iMovie, using its Blockbuster tempate.

Steven Spielberg would like it, for sure.

Website

The website’s frontend was made using Boostrap 3 framework. There is no server-side logic at the backend, just a Nginx HTTP server. It’s hosted at DigitalOcean. For the deployment, I’ve used Vagrant.

Misc

The project is using Smart Localization package (you’ve already guessed for what).

For the version control, I’ve used Git. Source code is hosted at Bitbucket.

 

Read more about:

Blogs
Daily news, dev blogs, and stories from Game Developer straight to your inbox

You May Also Like