Developed by: Eric Algelius, Hampus Norén, Raimon Johvallius, Jeff Persson, Oskar Kylvåg, Richard Ahl.
Music by: Alexander Westlund, Elvin Matz, Aramis Silvereke.

ANTI is a couch co-op tower defense game where you take on hordes of computer viruses that are trying to reach the CPU. Up to 4 players can choose their roles, weapons, and towers to build, and defend the CPU together.

For this project, I was in charge of UI, player input, project architecture, music and sound integration, camera, the ability system, scene management, and system connectivity/interactivity. I also worked on concept/concept art, gameplay design, and animation.

This game was developed for a half semester (15 credits) course at Malmö University’s Game Development bachelor’s program. Due to the pandemic and quarantine, we had do develop it remotely. It was created in Unity, and we used FMOD for implementing sound and music.

As the dev team did not include any visual artists outside of myself, and me being in charge of so many fields already, form was sacrificed for function in most areas. I would like to continue by highlighting a few of my contributions that I am happy with.

Menus and Scenes

Below is a brief video going through the different menus I created for the game. All GUI elements seen were created by me, with the exception of the text fonts, the logo, and the graphics on the help menu. Outside of what can be seen in the video below, the icons used for abilities were courtesy of username Office57, and their asset package ’64 Flat Game Icons’.

The Ability System

In order for our players to be able to choose different abilities to use, and for the devs to be able to create and test out new abilities easily, I came up with a way to do this using Unity’s ScriptableObject. The ScriptableObjects allows the developer to create an instance of the class within the project files, which retains the values of any adjustable variables. The end result allows the developer to create a new file (Ability) in the project, and simply change the values to match the behavior of the ability they wish to create. By having the abilities use the same structure, we can simply pass the ability along to a class that interprets what happens, whenever we want to activate the ability.

Global Events

To allow for easy communication between classes, I wrote one class that uses Unity’s UnityAction class in order to create events for any major situation that several classes might need to react to. Since we did not need too many events, I could simply create them as needed (for a project with many events, I would create a function for creating new UnityActions instead). A UnityAction can be subscribed to by a function, which will be executed whenever the UnityAction is invoked.

In order to subscribe to, for example, the UnityAction ‘onGameOver’, you simply call ‘GlobalEvents.instance.onGameOver += FunctionName;’ where FunctionName is the name of the function you wish to execute whenever onGameOver is invoked. Invoking it is simply done by calling ‘GlobalEvents.instance.onGameOver?.Invoke();’.


Here are a few other things I added in order to make the game feel and read better:

Pause menu’s control legend.
Floating damage numbers, enemy health bars, and player indicator.
Screen shake.
Announcement messages.