Introducing... Dancy Ghosts!
Wow, a lot of time has passed and a lot has happened since my last post! As some of you know, I've settled on what my first published game will be and also a name for it. I wanted to sit with it and do a thorough job of prototyping it before writing a post about it first though, and I'm happy to say I've done that. I also had to pretty much drop development for the month leading up to my wedding in mid-September and a few weeks after while I was on my honeymoon. Now that Kayla and I are married, I suddenly have free time again!
For a long time I struggled with what the gameplay mechanic would be for my game. I tried lots of different experiments, but ultimately decided to draw inspiration from a game that has stood the test of time: Pac-Man. The objective of my game is to light a set of lanterns spread throughout a level while avoiding ghosts that are trying to put out your candle. While I'm still working on the exact details of how the player can fight back against the ghosts, I know that it will involve turning on music that the ghosts will dance to. Hence the current name, Dancy Ghosts.
Gameplay interactions are designed to be as intuitive as possible. The player holds a candle which can be lit by touching the wick to any other flame. Then, that candle can ignite lanterns in the level. Ghosts will fly at the candle if they see it and attempt to extinguish it. Teleportation is used for movement because I want to avoid making people sick. Every other locomotion method I've seen/tried gives people nausea and I want everyone to be able to play my game comfortably. I've written a lot of code in the past few months. A while back I even had a playable demo with lanterns, ghosts, music, and dancing that I let several people try before moving forward and allowing it to get less playable as I updated and added parts.
A lesson I keep learning is not to get distracted by creating 3d assets too soon. If a prototype can be made with primitive objects (cubes, spheres, etc.) then modeling is just going to slow things down. I've already wasted hours modeling things for a prototype that ended up not feeling right and getting scrapped. I love creating 3d models, but the scripted interactions must be tackled first.
I think it's best not to go too deep into any one part in this post, but I want to give a peek at some of the more interesting parts of my progress.
Candle/Lantern Flame Logic
Flames consist of a wick and potentially a lit flame. When an unlit wick passes through a lit flame, it will ignite. If that flame passes through any other object, it will extinguish. While I can't prevent the player from putting his/her candle through other objects, extinguishing the flame feels natural and prevents the player from cheating.
Enemy Logic
I'm not satisfied with the quality of my enemy logic yet, but I have ghosts that patrol on a NavMesh, keeping an eye out for a lit candle in the player's hand. If they see it, they'll attack and try to extinguish it. The Unity NavMesh behavior can be a bit wonky at times, so I'm still working through that. For example the ghosts will take illogical paths under certain conditions, breaking the believability of the characters (assuming people believe in cartoon ghosts). I have some crude dancing logic, but I'm not very happy with it, and the placeholder electronic dance music I've been using feels out of place. Still need to experiment with other types of music until I get it right.
Level/Scene Management Logic
The scene management code I've written is rather elegant and I'm quite proud of it. The Vive camera rig is actually in its own scene so that I can swap out other scenes without disturbing the player. Level management code keeps track of enemies and lanterns, triggering scene changes as necessary.
Speech Bubble Logic
Speech bubbles were a pretty recent decision and I'm quite proud of what I've come up with so far. Most flat games use some sort of speech bubble system, even if they have voice actors. A great example that many people will be familiar with is Zelda Ocarina of Time. That game runs on speech bubbles, but they're just overlaid on the bottom of the screen. That doesn't work in VR, so I had to come up with an alternative solution. I've also been pretty dissatisfied with the built in text option in Unity, so I've created my own method for creating dynamic 3d text. It looks amazing and really brings the game to life.
I'd like to go more in depth on these pieces in future blog posts so I think this is a good place to wrap up. I'm excited to see where this project goes and I can't wait to get something up on Steam for people to try out. Let me know what you think so far. Thanks for reading!