EDGAR ALEXANDER KNAUER
Programmer & Designer

About Forest Paint
Platform: Mobile
Project Duration: 4 Months
Project Type: University/ Group
Engine: Unity
Team Size: 6
My Tasks
Forest Paint was the first project during which I took a lead role for the development overall. My tasks included the creation of C# code for gameplay purposes and the overall system regarding interactions of different game features; building and maintaining the game within the Unity Engine Editor by creating a folder structure, importing assets, creating prefabs, placing game objects, and keeping up order and naming conventions; supporting artists and designers; maintaining source control with GitHub; making builds and testing the game on android phones; optimization of builds; creation of flow charts and diagrams for the applications structure.
Additionally, I participated in the design process of the game by helping with narrative and level design decisions as well as creating examples and flow charts for the UI.
The Game
Forest Paint is a relaxing mobile puzzle experience, through which players can take a break from their daily routines and connect with nature. We specifically chose painting as a recreational form of art, as well as the forest, which is a natural mental stabilizer, to reach our goal of providing a peaceful experience that calms the mind. Gameplay wise, we were heavily inspired by House Paint, a mobile game on the android store. During the concepting phase, I focused on the games ability to let players experience novelty, competence, and aesthetics, by providing the them with multiple unique "magical" forests, including levels increasing in complexity, and a cartoonish art style. Although, we were only able to finish one of the planned forests, players enjoyed it a lot and we won two of a total of five awards, namely the "Eye-Candy Award" & "Hype-Machine Award", available during the student festival (A showcase of all student projects at the end of the semester).
Feature Example
This code snippet shows the GamePlayManager class for Forest Paint. It handles state switches via an event, other classes have subscribed to and change their behaviour based on. For the state to switch, the UpdateGameState function can be called the new state is passed through as an argument. The states itself are enum based.
using UnityEngine;
#region Script Explanation
// This is the Game Play Manager. It will keep track of the current game play state.
// It will regulate behaviour on objects subscribed to the "gamePlayStateChanged".
// It will also contain information different iterations of the game (Toggle on/off different functionality)
// The amount of states can be adapted any time
#endregion
public class GamePlayManager : MonoBehaviour
{
[Header("Manager References")]
[SerializeField] private SceneAndLevelTracker sceneTracker;
[Header("General SetUp")]
public GamePlayStates gamePlayState;
public delegate void StateSwitch();
public event StateSwitch gamePlayStateChanged;
public Camera cam;
private void Awake()
{
sceneTracker = FindObjectOfType<SceneAndLevelTracker>();
cam = FindObjectOfType<Camera>();
}
private void Start()
{
gamePlayState = GamePlayStates.idle;
}
public void UpdateGameState(GamePlayStates newState)
{
gamePlayState = newState;
switch (gamePlayState)
{
case GamePlayStates.idle:
break;
case GamePlayStates.loadingWorld:
break;
case GamePlayStates.initializeWorld:
break;
case GamePlayStates.gamePlayPlaying:
break;
}
if (gamePlayStateChanged != null)
{
gamePlayStateChanged();
}
}
public enum GamePlayStates
{
idle, //GamePlayManager is idle
loadingWorld, //Loads the new set of levels and activates required Level
//FIRST LEVEL on first time entering the level set, or LAST LEVEL form save file
initializeWorld, //Initializes the world and level with all necessary references (Classes and/ or objects)
levelFinished, //Game has met completion requirements and is (maybe) awaiting player decision
levelSelection, //Player can choose which level to play next
gamePlayPlaying, //Allows behaviour on objects during the actual game play session
gamePlayPaused, //Allows or stops behaviouir during a paused game
saveGame //Necessary information gets put into the save file
}
}