Project type: Commercial game

Made: January 2020

My fields: Producer & Programmer

Time spent on this project: 4 years

Tools used: Unity 2019

DOWNLOAD: Lightmatter

About this project:

First-person puzzle game where shadows kill you!

Game Overview

Lightmatter is an atmospheric first-person puzzle game where shadows kill you. It’s a game that requires lateral thinking to solve mind-bending puzzles using lights and shadows. Think of it as “the floor is lava” but with shadows instead. It was released as “free to try” on Steam January 15th, 2020. It has ~600 user reviews with a positive rating of about 90%.

Development History

Lightmatter started out as a university project back in 2013. We were a group of friends who met at the Medialogy education and decided that we wanted to create a game where the main mechanics would revolve around lights and shadows. Taking inspiration from titles such as The Talos Principle, Portal and Closure, we founded Tunnel Vision Games in 2016 and worked full-time on the game until its release in early 2020.

My Roles and Responsibilities

Being a co-founder of a small indie game company, all of us had to wear many different hats. My primary roles were as Programmer and Producer, which included many different aspects about both the game production, project planning, promotion and marketing. Below are descriptions of all the aspects I worked on during the project.


I was responsible for many of the underlying systems in the game, as well as gameplay features and puzzle design. Below I will describe the most important aspects and illustrate them with appropriate GIFs, screenshots and videos.

Shadow detection
Together with the other programmers, we implemented a system to dynamically detect whether the player is in shadow or not. We used a mixture of raycasting and vector math to determine if the player was inside the cone of a light source. This system underwent many changes during the project (for performance and gameplay reasons), but in the end we found a relatively simple and robust system that relied on pruning the light sources based on distance and then using raycasting towards a set of points in a radius around the player. If all points are in shadows, the player enters a shadow-sinking state with custom animations and effects to give the feeling of being absorbed by the shadows.

Optimization with shadowmap caching
Since each of the levels has a lot of dynamic lights and shadow-casters, we needed a way to ensure good performance. In collaboration with Alexandra Instituttet, we implemented a system that utilizes Unity’s dynamic shadowmaps, but instead of re-calculating them every frame, we store the shadowmaps into render textures and keep them until something has moved. Since many of the non-interactive light sources in the game rarely move, we found that this approach saved a lot of performance, because it reduces the amount of shadowcasters that need to be calculated.

Level loading
We wanted to create a seamless experience without any loading screens, so I created a system that uses asynchronous scene loading. All puzzles in the game are made in individual scenes (this made the workflow easier for the designers), so in order for the player to go from one puzzle to the next, we use “connection halls” that the player enters at the end of each puzzle. When inside these halls, the new scene is loaded and the hall snaps to the entrance of the scene. This hides the transition with minimal loading stutter.

Overall scene performance
Due to the way the 3D models and materials were built, we had a lot of submeshes, which made it difficult to use static batching. In order to reduce the number of draw calls, we collaborated with Pierre-Henri Barralis, who helped us profile and find the biggest performance bottlenecks in the game. He developed a custom system that at build-time automatically merges submeshes and bakes diffuse/specular parameters to reduce the number of materials in a scene. This process saves performance on the CPU due to less objects and less SetPass calls. The system also uses a custom component to enforce static flags on most objects in order to help static batching and occlusion culling (increasing performance both on the CPU and GPU). Additionally, we also used MeshBaker to optimize some of the dynamic objects in the game. Pierre-Henri Barralis was responsible for the majority of the implementation of these systems, while my responsibility was to determine what approaches made most sense for the project, as well as general communication/coordination to make sure that everything integrated well with the game.

Checkpoint/saving system
Using reflection at build-time, each level creates their own save manager that contains a list of all savable objects. The game uses a checkpoint system where each dynamic object can save its own position, rotation and state. When the player dies, all objects with a special ISavable interface (including the player) resets to their last checkpoint. In order to create a new checkpoint, certain conditions have to be met to ensure that the player won’t get stuck when reloading. Some of these conditions are based on the player’s current state (e.g., currently grounded and not in shadows), whereas others are based around specific objects and trigger behaviour (e.g., a platform should currently not be moving, or a lamp needs to be placed inside a specific boundary box).

Voice-over & subtitle system
The game’s story contains a 64-page script of about 10,000 words, divided into 236 lines. Each of these lines were recorded in a professional sound studio with David Bateson and Lars Mikkelsen. There are two types of VO lines: 1) mandatory VOs that trigger at specific places in the game, and 2) “in-betweener” VOs that play if a player spends a certain amount of time in a puzzle. I developed a system that can handle the VOs and play the correct audio file via FMOD, as well as display subtitles accordingly. The subtitles are loaded via an XML file that contains each line and its duration. I also created a custom tool that was used to tweak and test the subtitles, so it was possible to make the timing match the spoken words. Furthermore, the subtitles were translated into 10 different languages (including German, Spanish, Japanese and Danish), which can be changed dynamically in-game. In order to increase performance, I baked characters for Chinese, Japanese and Cyrillic into their individual font atlasses using TextMeshPro. I also spent a significant amount of time making sure that the subtitles were clear and easy to read (taking inspiration from the BBC Subtitle Guidelines) and also implemented the OpenDyslexic font.

Additionally, I developed an audio player system in the Extras menu where players can re-listen to all voice-overs and music that have been unlocked.

UI and localization
In collaboration with our artist, I designed and implemented all of the UI and menus for the game. The menu has multiple layers and can be controlled via mouse/keyboard and gamepads. It has been designed to be simple, responsive and non-intrusive. The Settings menu provides a wide range of options for both the graphics, audio, controls and language. All of the menu items have been localized into 10 different languages, so I implemented a system that automatically changes all text items when switching to a different language. All text is loaded via a json file, which made it easy to collaborate with an external localization company.

Trigger and condition systems
Together with the other programmers, we developed a custom trigger system that enables non-programmers to make functionality in an easy and modular way. This was used to give functionality to buttons, doors, moving platforms, animations, sounds and other dynamic elements. Using an abstract trigger class, it was easy to extend this with new behaviours when needed. The condition system was also used to trigger “in-betweener” voice-overs that were based on the player’s behaviour, such as time spent in level, interactions with buttons and where the player was looking.

Gameplay prototyping
In the early phases of the project, I made several prototypes for potential game mechanics. These included a shadow-stealing ability; a camera blitz; a photon gun; and a special lamp with dark matter. Even though most of the mechanics didn’t make it into the final game, they were a source of inspiration for puzzles and other game mechanics.

I also made several prototypes that changed the way the shadows work. This included the ability to jump through shadows on walls, as well as a shadows behaving like quicksand.

Controls implementation and tweaking
In collaboration with the other programmers, I implemented and tweaked the player controls using the plugin Rewired. I also implemented things like gamepad vibrations.

Dynamic debug/menu system
During the development, we needed a way to quickly change settings in a build. So I created a dynamic menu system with reflection to automatically expose public fields and methods in any given class, as well as graphics settings from the post-processing stack in Unity.

Unity editor tools
To enhance the workflow during development, I made a few small editor tools. One of them was a “scene-changer” tool to quickly navigate between the 40+ scenes in Lightmatter.

Trailer tools
I implemented a set of tools that allow for more dynamic camera angles when creating trailers and GIFs. These include a box that can be moved around freely and used as a pivot point; the ability to activate any of the trigger functionality from a distance; the ability to enable/disable geometry in a build; as well as dutch camera angles.

Creating and distributing game builds for testing
We had an alpha test with about 400 participants who I organized via Discord. Initially, we used to upload builds. Later, we moved to Steam and used their uploading tools. I was responsible for everything related to the build process. Near the launch, I made multiple builds a week for the QA team. Additionally, I was also responsible for version control via Git and other software-related issues during the production.

Steamworks integration & “free to try” demo
I used Facepunch.Steamworks to implement Steam-specific features in the game, such as owner authorization, achievements and Steam Cloud support. Additionally, I implemented the “free to try” element in the game to seamlessly transition from the free version to the paid version by purchasing a DLC via the Steam Overlay browser when reaching a special in-game toll booth.

Initial porting implementations
I’ve been responsible for the initial work of porting the game to various platforms, including Nintendo Switch, Xbox One and iPhone. I managed to make the game run on all platforms and played around with different methods of controls.

Developer Commentary
The game consists of 4+ hours of developer commentary. I spearheaded the coordination and implementation of these recordings.

Achievements design and implementation
I designed and implemented a system that extended our trigger system to allow for achievements. I designed the majority of the 23 Steam achievements, including their names and descriptions. Players on the Steam forums and Discord seem to enjoy the achievements and have even written a guide that describe how to find all of them.

Speedrun mode
In collaboration with the speedrunning community on our Discord server, I implemented speedrun mode that shows stats about how fast and efficient players are. The Lightmatter speedrunning community use these stats as a way to proof an official speedrunning recording.

Communication with QA and bug-fixing
I had the primary responsibility for communication and coordination with the QA team at Aspyr. We used Jira and Trello to create and prioritize tasks of bugs. We held weekly conference meetings where we would discuss the most important tasks at hand.

Game design and puzzle design
All of the team has worked on the design aspect of the game. Me specifically, I worked on prototyping, testing and tweaking of both game mechanics and puzzles. Many of the puzzles I designed were made using Lego bricks, which allowed for rapid prototyping. These puzzles were then implemented and polished in Unity. I have also been part of hosting/organizing playtest sessions to adjust the flow, difficulty and structure of the levels. Lastly, I have written and maintained several game design documents, which we have used both internally and externally.


As the game’s producer, I was responsible for communication with partners, platform holders, the player community and more.

Initiating contact with publishers
During the project, we were looking for a publisher who could help boost the game and increase its sales. We wanted a publisher who didn’t just want to publish FOR us, but wanted to work WITH us and be as passionate about game development as ourselves. Together with our CEO, we were in contact with a wide range of publishers, both via e-mail, Skype calls and meetings at various game conferences (such as Nordic Game, Gamescom, EGX, Casual Connect and IndieCade). We have reached out to 50+ publishers, including Devolver Digital, No More Robots, Raw Fury, Coffee Stain Studios, Daedalic, Team 17, ChuckleFish and Humble Bundle. I have created pitching materials in the form of text, video and GIFs.

Communication with Aspyr Media
We decided to partner up with Aspyr as the publisher of Lightmatter. I have been one of the primary points of contact in regards to marketing materials, partnership opportunities, press releases, contact with youtubers and streamers, quality assurance, trailer editing and more

Communication with platform holders
I’ve been in contact with both Nintendo, Microsoft, Sony and Valve in regards to development kits and publishing deals.

Community management
Drawing inspiration from Mike Rose from No More Robots and his way of using Discord to build up a community, I created the Lightmatter Discord server in 2019. We used the server to build awareness and community around the game pre-launch. In the summer of 2019, we had about 400 alpha playtesters, which I was the main coordinator for. As of February 2020, the server has almost 1000 members. I have been responsible for most of the developer communication. My approach is to be open and transparent and share as much of the development process as possible (e.g., via behind-the-scenes GIFs and videos).

We have used the Discord to communicate with the player community, reporting bugs and overall improvements of the game. We also used the Discord to involve the community. One example is the creation of the cat Lux, which started out as a small idea. When we saw the positive reception in the Discord (players making fan-art, etc.), I decided to take the concept further and asked the community to record their own cats. These cat sounds were implemented in the game to great success. Another example of how the community was involved is the speedrun mode, which was suggested by a Discord user. I implemented a simple speedrunning mode, which people seemed to enjoy. The game now has an active speedrunning community.

PR, marketing and social media
I have handled every part of the promotion behind Lightmatter. I have been responsible for writing press releases, creating videos and GIFs. These have been shared on places such as Twitter, Reddit (r/unity3d, r/indiegaming,r/pcgaming,r/gamedev, r/puzzlevideogames), Facebook, Imgur, TigSource, IndieDB, NeoGAF, Resetera, etc. I have also reached out to several youtubers during the project, as well as handling hosting an AMA on r/pcmasterrace.

Trailer editing and GIFs
During the project, I have created more than 10 different trailers for the game, as well as various video snippets used to showcase the game. These trailers have been used to create awareness around the game, get people to wishlist it on Steam, as well as for pitching material when talking to potential partners. With our June 2019 trailer, we collaborated with freelance trailer editor Derek Lieu, who has worked on trailers for games such as Firewatch, Subnautica and Manifold Garden. I have also created many GIFs for the game, which we have been using to share on social media during #screenshotsaturday (this was actually how our publisher Aspyr found us).

Writing applications and fund-seeking
I have written several applications to seek funding options from places such as The Danish Film Institute, Iværksætterpilotordningen, InnoBooster and more. I also made pitching materials for our investor CAPNOVA A/S.

Showcasing the game
Together with our CEO, I have travelled around Europe to showcase the game at various game conferences and conventions, including IndieCade, EGX, Nordic Game and Casual Connect.

Project management
I have been responsible for planning and scheduling the production of the game. This includes planning both shorter sprints as well as big milestones and deadlines. When we had external deadlines, it was my responsibility to make sure that we met those deadlines in proper time.

Website design
I created and managed the official website using WordPress.

E-mail contact
I was responsible for most e-mail communication with partners, publishers, press and job candidates. When we hired our 3D artist, I wrote the job application and uploaded it to multiple artist forums, such as Polycount. We received 50+ applications, which I coordinated and interviewed.


Lightmatter is a breath of fresh air to the easily forgettable puzzle genre. The game is an impressive package of well-crafted puzzles, gorgeous art style, and incredible sound design. Lightmatter requires players to forge their paths by illuminating dark areas using strategic use of lights and avoiding the deadly shadows.
9 / 10 – Player.One

What makes Lightmatter work isn’t the puzzles or the story but how well the two fit together.
4 / 5 – Hardcore Gamer

Lightmatter’s puzzles are shockingly smart, and getting that “Aha!” moment is brilliant. A little more refining and this may be a true first-person puzzle classic.
8 / 10 – TechRaptor

Lightmatter is a great way to kick off a new year of puzzles and adventure gaming. It is really a lot of fun with a great story and brainteasing puzzles that will keep you engaged from start to finish.
4.5 / 5 – Game Chronicles

If you want a challenging brain teaser with simple controls, this game will cook your noodle.
The Escapist

Those who enjoy puzzle games will find plenty to enjoy here. With well-crafted mechanics and a care for everything from art design through to the balance of overall game length, Lightmatter shines.
Screen Rant

Lightmatter is a slam dunk. It’s been so long since I have felt quite as satisfied as this game has left me.

Lightmatter is a generally well-crafted experience which gently eases you into more difficult challenges and switches up the puzzles just when you’re getting irritable. Tunnel Vision Games have created a finessed puzzler with superb pacing.
7 / 10 – The Indie Game Website

YouTube Videos

Twitch Streams

Danish coverage

Philip H. Nymann
Gustav Dahl
Benjamin N. Overgaard
Lasse v. F. Sostack
Ulrik S. Christensen
Austeja M. Vaicyte