top of page

MOOSE LOST IN THE WOODS

ROLE

Programmer, Level Designer and Game Designer

DESCRIPTION

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!

YEAR

2023

TEAM

8 people

GENRE

Adventure

PLATFORM

PC & MAC

TIME

3 Months

ENGINE

Unity

LANGUAGE

C#

MY WORK

I worked on the dialogue system, interaction system, inventory system, cosmetic system and save system. I also worked together with the artist on the level design.

I built the dialogue system to handle icon-based dialogues but it can easily be modified to a texture based system since iam handeling it with scriptable objects for both the speakers and the dialogues.

 

I built the interaction system to be able to have different functions depending on the interaction for example be able to pick up hats or start a conversation.

I built the inventory system so the number of inventory slots easily can be modified. I made the items with scriptable objects to make it easy for me to add new items with different functions.  

I built the cosmetic system together with the inventory system to be able to put on hats that the player finds on their journey. It is a simple system that changes the active hat on the player character depending on which hat the player chooses in the inventory. 

I built the save system toghether with the other programmer on this project. We used player prefs since we had to get a simple system built fast. The save system is something that would need some love i if the project would continue. 

DIALOGUE SYSTEM

I started by doing a simple dialogue system which is built with scriptable objects for the speakers and the conversations.



The first step for me was to make the system work with buttons

Since our game is a icon-based dialogue system my next step was to add that functionality.


I first made it work with one bubble for both of the speakers to make sure that the dialogue sprites worked correctly. 

My next mission was to add the second speechbubble and add the correct sprite to the correct bubble. I had some problems to get the correct sprite to show up in the correct bubble but in the end it was only a rendering issue that was easily fixed. 

Since the game is small the dialogues are not built with a state machine, this is something I would change if I would keep working onthe game or redo the project. 

We did not think it was clear enought for the kids to understand if they had the correct item/items a character was asking for. To solve this problem I made a script for a thoughtbubble that would show if the player has the correct amount of that item/items.

Code snippets - Scriptable Objects

SCR_Conversation.png
SCR_Speaker.png

Code snippets - Dialogue Manager

Moose_DialogWIX_01.png
Moose_DialogWIX_02.png

Code snippets - Thoughtbubble

THOUGHTBUBBLE_03.png
THOUGHTBUBBLE_04.png

INVENTORY SYSTEM

I made the items out of scriptable objects to make the system expandable if we wanted to add many new items.

 I built the inventory and item system using Unity events. I had only touched upon Unity events before but I saw it as a challenge and a learning experience. 


I had some problems to get it to work as I wanted but when I figured it out how to make my own events and subscribe to them from the other scripts this was a remarkabel moment that has proven very useful both to this project and afterwards.

Since we wanted the pinecones to be magnetized towards the player I made a script were I could easily change the speed the pinecone is magnetized. We wanted the planks and the hats to be picked up by an interaction so I made those items drive from the interaction system.

To show the player how the moose looks with the different hats I made a rendering of the player inside the inventory.

The slider shows the first mock up vs the final design including the rendering of the player. 

Code snippets - Inventory

inventory_02.png

INTERACT SYSTEM

I built the interaction system with an interface to easy adapt the system with different type of interactions in game for example to be able to start a conversation and to pick up a hat.

I started by doing an interface to add the functions that I wanted. I then did a script to sit on the player that searches for an interactable object and then returns what type of object and the correct sprite on the HUD. The functionality regarding the events that occur when interacted is handled on the objects script that inherits from the interface.

On the interactable objects I used Unity Events to be able to handle different functionality for example to be able to update the HUD and the inventory simultaneously.

SAVE AND LOAD SYSTEM

The save system was a bit outside my comfort zone and I had not done one before. I took on the task believing I could do it. After a few days of trial and error using JSON, I did not manage to do it on my own. I decided to ask the other programmer in our group to do it together since the timeframe was very small.

Even though it is not ideal for bigger projects we ended up using player prefs which both of us was familiar with since before. We needed to save the number of pinecones the player has collected, the number of planks and which hats the player has collected and which hat the player is wearing.

Saving the pinecones was easy and something I got to work with JSON as well since we only needed to save an integer. The hats were a bit more complicated and the task that I could not get to work with JSON. We saved all the hats data from the inventory and made a string player prefs with what hats name. When we then load up the game, we load the hat resources to add their names to a list. We then loop through all the hats names in the list and if there is a player prefs key with the same name we load that resource and add it to the inventory.

Since the hats must have the exact same name in the scene and in the folder, this is not a great approach to a stabile save system.

After I worked together with the other programmer, and we were having the same problem as I did in the beginning of our save system, I later understood that the problem was how to save and manage scriptable objects. I learned that a better way to do this would be to have an ID for each hat then save the ID number as an integer and then load up the hats with the corresponding ID. This is how I would do it in the future regarding saving scriptable objects.

OTHER WORK

For the first week of the project was the big planning week for the game. We sat down together as a whole group and decided on all the important parts of the game as the story, the gameplay, the core mechanic and so on.

We all worked together on how we wanted the levels to look and what should be special in the different areas. I worked on the block out for level 2 and 3 since I was done with my tasks for the week and that needed to be done. I drew up the level and then ask the group of this was how they had imagined the area as well before I started with the block out in Unity.

WHAT I LEARNED

This project is the one that has thought me the most.

I learned the importance to discuss and think about every big or small detail of the game. This made the implementation and the gameplay so much better.

I learned the importance of asking for help when needed to speed up the process and to make the system work.

I learned how to block out a level and let game tester test it to see what needed to change and what was unclear. That brings me to game testers, this was the first time we used the target group to test the game. This was so imported, and this is really one of the biggest things that made our game to what it is today, and it had a key role on why we won 2 categories at Swedish Game Awards 2023.

I learned how to work with scriptable objects and how to make it more efficient in the future, and what not to do when using them. I learned how to save using JSON even though we ended up not using it.

bottom of page