My current project is called Jayu, a transformational game aiming to raise awareness of average life in North Korea. The game is presented as an isometric RPG, with a lot of dialogue and branching story elements, and challenges the player (who plays as a mother) to survive (with her family) amidst the harshness of the regime.
Jayu is being developed by Team Fear & Freedom, comprised of 4 people; I am the sole programmer of the team.
LITTLE BIG TEAM
For all of us, this was our first time tackling such an ambitious project, since most of our past projects were based on building prototypes rather than a shippable complete experience. It was a particularly trying experience for me, since our ambitious scope hinged on my ability to manage and distribute work evenly among our small team.
A plugin that I chose to use for the project, NodeCanvas, proved to be indispensable for us, and I was able to leverage it to effectively split logic implementation with my designer. NodeCanvas provided us visual editors for managing:
- State Machines (game logic/flow)
- Behavior Trees (npc AI)
- Dialogue Trees
Some examples of our FSMs:
FSMs turned out to be extremely useful for us, since it was easily understood by our designer, and it was very easy for me to expose new features to him by extending the system.
We also had big ideas for NPC AI in our game, like NPCs who wandered around the town based on their own schedules, but we had to scrap these early on due to time constraints. Due to this, behaviour trees saw little use in our game.
LPT : DO NOT RELY ON UNITY'S DEFAULT SERIALIZATION
Another really painful point in development was our save/load system. Unity's serialization feature is seriously lacking, and after spending days painfully getting it to work, I gave up and opted to use a JSON serializer from the asset store, which got our save/load feature working in about 5 minutes.
LPT: If you rely a lot on spreadsheets for data, C# Reflection is awesome!
Being a bit of an RPG, we have lots of data that needs to be retrieved from spreadsheets. They all feed into different classes, and parsing and assigning the data manually can be a chore. Thankfully, Reflection (in
System.Reflection) is a godsend for these kinds of tasks. Now my designer only has to ensure the column names mirror the variable names of members in the class, and my code simply iterates through all members of the class looking for matching variable names, and assigns the data to them. I was unable to get this working for
enums, but I'm sure with a bit more time someone can figure it out.
We still have quite a ways to go, but many people who play tested our game enjoyed it so far, even those who already were fairly knowledgeable about North Korea.
Here's Anthony Daniels (C-3PO) sharing his insights and experiences of life under the Vader regime (and also playtesting our game).