Skip to content
Antonia Kiili

Game Designer & Gameplay Programmer

Engine: Unity     Language: C#
Duration: 7 weeks     Team size: 10

Jump from painting to painting to unravel the dark story of a family. Remove the smudges to relive the memories and uncover the painting’s true state.

Nominated for Best Narrative in Swedish Game Awards 2019

My Role: Gameplay Programming, Audio- & Music Design

I started with prototyping the camera system and worked closely with the 3D artists to finalize the technical execution to get the “painting look”. I built the system for removing smudges and triggering environmental events, as well as some of the actual events. I built a custom sound manager system, along with creating all the sounds and music in the game and menus. In addition I built a custom platform script that is used in every level. Apart from that I was also the scrum master.

WHat I Learnt

Overall it was a great learning experience. Being the scrum master gave me more insight into the other disciplines and a good perspective of how much time things take vs how much you think it’s going to take. Working with the camera system furthered my understanding of how cameras work in engines, their variables and how they are used. I also got a better understanding of how shaders and textures work since I was working so close with the 3D artists. 

Reflections

I realize that I tend to put my heart and soul into my work, which makes me push myself to work hard and always do my best. But I know now that I need to plan better and not take on too much even if it’s fun, because I was very tired after this project. Needless to say, I am really happy with how it turned out.

The Camera- & Level System

The technical execution of this system is complex compared to the functionality. We had a very specific idea that required us to stretch the possibilities of the engine. I worked closely with the 3D artists to find the solution that matched our vision.

The camera follows the character both vertically and horizontally with a smooth lerp, including when the player moves on to the next painting (level). It also zooms out when a painting is completed to show the player its final state.

Painting Camera & Frame

Every level has a camera positioned to see the whole level from a side view. Each camera projects their view onto a Target Texture. That texture is then placed on a plane as a Render Texture and the plane is placed inside a frame – like a canvas of a painting.

Used to keep track of the size and world position of the painting canvas.
Player Camera & Player
All the levels are built with 3D assets and the character is a 2D-animated sprite. The player character is placed directly in the level, while the player camera is placed in the painting room following the players position on the canvas plane.
By getting the Player Depth ( relative to the Painting Camera ) I calculate the frustum size. With the Camera to Player Vector I find the height and width position of the player( again relative to the Painting Camera ). With that information I calculate the player’s exact position in the frustum, which in turn makes it possible to find the player’s position on the Canvas Plane( relative to its size ).
This script calculates the character’s position on the canvas and updates the camera’s position accordingly.
The camera zoom is triggered when a painting is cleared, to show the player their progression.
Level Areas

To make sure the script of the follow player camera uses the right painting camera and frame(canvas plane) in the calculations, I worked with level areas. This was also used for the audio, making sure the right sounds are actively playing.

It detects when the player enters and sets the camera and frame used for calculations in the follow player camera-script.

Sounds & Sound System

Each painting contains a part of the story with their unique sounds. Since this game is very focused on narrative, I wanted to help convey the story and emphasize the feelings through sounds and music. 

I wanted easy access to change the sounds as a whole, so I built a system for handling all the sounds in the game using different channels. This ended up being very helpful.

The sound system also uses the Level Areas, to fade in and out the painting’s sound channels when entering and exiting an area. 

This manager contains information about all audio channels initial output volume, to make sure the audio area can set the correct value when the player enters and exits the level area.

This script detects when the player enters and exits a painting, and sets the output volume accordingly.

Remove smudge & Environmental events system

When you remove the smudge, you uncover parts of the story. The idea is that you make the painting “come alive” and relive the memories of each painting by doing so. A lot of the events are enabling sounds, which are part of the narrative.

First the smudge fades out, then it triggers an event. When the whole painting is cleared, the camera zooms out and the painting “shifts” to its final state. You can then move on to the next painting.

To give the level designers the ability to add or remove events themselves, I chose to use Unitys event system.

This script contains functionality for fading out the smudge and triggering the environmental events that’s connected to it.
This script pretty much only holds references to the events that should be triggered.
This is a just few of the events that I made.
This script is placed once in each level and keeps track of when the entire painting is cleared, it triggers the completed painting event. I wrote the base functionality of this system, then another programmer expanded it.