Moose Lost in the Woods (2023)
About
Moose Lost in the Woods is a cozy 3D platformer without a language barrier. Explore by running, leaping, bouncing and splashing around in Swedish forest environments.
This project was an assignment at Södertörns University. I wanted to work with people that had the same goal as me which was to be nominated for Swedish Game Awards. Luckily I found the perfect match and we made our goal come true!
Project info
Teamsize: 8
Duration: 12 Weeks
Engine: Unity
Role: Programmer, Level Designer and Game Designer
Genre: Adventure
Platform: PC / Mac
Introduction
I contributed to several key systems, including the game design, dialogue system, interaction system, inventory system, cosmetic system, and save system. Additionally, I collaborated with the artist on level design.
​
The dialogue system I developed supports icon-based dialogues, with the flexibility to be adapted for a texture-based approach, as I manage both speakers and dialogues using scriptable objects.
​
The interaction system was designed to provide varied functions depending on the context, enabling actions such as picking up hats or initiating conversations.
​
For the inventory system, I ensured that the number of inventory slots can be easily modified. I utilized scriptable objects for the items, allowing for straightforward additions of new items with diverse functionalities.
​
The cosmetic system was built in conjunction with the inventory system, allowing players to equip hats discovered during their journey. This simple system changes the active hat on the character based on the player's selection from the inventory.
​
I collaborated with another programmer to create the save system. We opted for PlayerPrefs to implement a quick solution, but this system would benefit from further refinement if the project were to continue.
Dialogue System
I began by developing a simple dialogue system utilizing scriptable objects for the speakers and conversations.​
The initial step involved implementing button functionality within the system.
Given that our game features an icon-based dialogue approach, my next focus was to integrate that functionality.
I initially implemented a single dialogue bubble for both speakers to ensure that the dialogue sprites functioned correctly.
My next task was to add a second speech bubble and ensure that the correct sprite was displayed in the appropriate bubble. I encountered some challenges in getting the correct sprite to appear, but ultimately, it turned out to be a minor rendering issue that was easily resolved.
Given the small scale of the game, the dialogues are not structured with a state machine. This is something I would revise if I continued working on the project or decided to rebuild it.
​
We realized that it wasn't clear enough for players, particularly children, to determine whether they had the correct item or items that a character was requesting. To address this, I created a script for a thought bubble that indicates whether the player possesses the required quantity of the specified items.
Inventory System
I created the items using scriptable objects to ensure that the system could be easily expanded if we decided to add more items.
​
For the inventory and item system, I utilized Unity events. Although I had only limited experience with Unity events before, I embraced this as a challenge and a valuable learning opportunity.
​
I encountered some difficulties in getting the system to function as intended, but once I learned how to create my own events and subscribe to them from other scripts, it was a significant breakthrough that has proven beneficial for both this project and future ones.
​
To ensure that the pinecones were attracted to the player, I developed a script that allows for easy adjustments to the magnetization speed. Additionally, we designed the planks and hats to be collected through interactions, so I integrated those items into the interaction system.
To demonstrate how the moose appears with different hats, I created a rendering of the player within the inventory.
​
The slider showcases the initial mockup alongside the final design, which includes the player's rendering.
Interact System
I developed the interaction system using an interface to facilitate the integration of various types of interactions in the game, such as initiating conversations and picking up hats.
​
I began by creating an interface to define the desired functions. Next, I implemented a script for the player that searches for interactable objects, returning the object type and the corresponding sprite on the HUD. The specific events triggered during interactions are managed within the scripts of the objects that inherit from the interface.
​
For the interactable objects, I utilized Unity Events to handle different functionalities, enabling the HUD and inventory to be updated simultaneously.
Save and Load System
The save system was somewhat outside my comfort zone, as I had not implemented one before. I accepted the challenge, believing I could handle it. After several days of trial and error using JSON, I realized I needed assistance and decided to collaborate with another programmer in our group, given the tight timeframe.
​
Although it wasn’t ideal for larger projects, we opted to use PlayerPrefs, which both of us were already familiar with. Our goal was to save the number of pinecones collected, the number of planks, and the hats the player had acquired, including the currently equipped hat.
​
Saving the pinecones was straightforward, and I was able to implement that with JSON since we only needed to store an integer. However, managing the hats proved more complicated. I struggled with the JSON implementation, so we decided to save the inventory data as a string in PlayerPrefs, containing the names of the hats. When loading the game, we retrieved the hat resources and populated a list with their names. We then iterated through the list, and if a matching PlayerPrefs key existed, we loaded that resource and added it to the inventory.
​
This approach required the hat names to match exactly in both the scene and the folder, which is not ideal for a stable save system or performance.
​
Through collaboration with the other programmer, we encountered similar challenges with the save system. I later realized the issue stemmed from how we were saving and managing scriptable objects. I learned that a better approach would be to assign an ID to each hat, save the ID as an integer, and load the hats using the corresponding ID. This is how I would approach saving scriptable objects in the future.
Other Work
The first week of the project was dedicated to extensive planning. As a group, we gathered to discuss and define all the key elements of the game, including the story, gameplay, core mechanics, and more.
​
We collaborated on the design of the levels, discussing what unique features each area should have. I took the initiative to create the blockouts for levels 2 and 3, as I had completed my assigned tasks for the week. After sketching out the levels, I consulted with the team to ensure my designs aligned with their vision before proceeding with the blockout in Unity.
What I learned
This project has been the most educational experience for me.
​
I learned the importance of discussing and considering every detail, big or small, which significantly improved both implementation and gameplay.
​
I realized how crucial it is to ask for help when needed, as it can accelerate the process and ensure systems function correctly.
​
I gained experience in blocking out levels and facilitating playtesting to identify necessary changes and clarify any ambiguities. This was my first time involving our target audience for game testing, which proved invaluable. Their feedback was instrumental in shaping our game and played a key role in our success at the Swedish Game Awards 2023, where we won two categories.
​
I also learned how to work effectively with scriptable objects, becoming more efficient in their use and understanding common pitfalls. Additionally, I gained insight into saving data with JSON, even though we ultimately chose not to implement it.