After completing about four or five of Unity’s project-based tutorials in 2016, I wanted to try making my own very simple 3rd-person branching narrative game. I had a couple of goals for this project:
- Learn to use Probuilder (which at the time was still a paid addon and not part of Unity)
- Create a simple UI
- Integrate Yarnspinner and learn to use it for the basic Twine-style branching narrative of the game.
That was it, that was the MVP. I did my best to scope down but even then it turned out that that was a lot to bite off for my first tutorial-free solo flight.
Probuilder and progrids turned out to be super easy to figure out, especially if you have any prior familiarity with 3d modeling applications. Learning a new one is like cooking in someone else’s kitchen: you don’t need to learn how to cook all over again, you just need to figure out which drawer the spatulas are in.
Next I needed some NPC’s. I started calling the game Pillbox because I wasn’t going to attempt any kind of polished 3d assets, just the Unity capsule primitive. I gave each of them different colors and stuck some simple animations on each of them so they’d each feel like they had a different personality.
Then I needed the player. Another capsule, with a player movement function.
So – at the time I’d gotten really into Unity’s animation features, how you can animate literally any parameter of a gameobject, and decided that the player capsule should have a walk animation, and the walk animation should have particles, because I think I saw a Mark Brown GMTK video about game feel and decided that I should just have all kinds of it.
The dust cloud particles were configured to only activate while the player capsule was at the lowest point of the bounce animation. So it wasn’t just spraying dust clouds constantly, only when the pill hit the ground. I was really, really proud of this. (I still am.)
Next step was UI. I needed to signal to the player that the NPC’s could be interacted with, and also give the player a way to interact with them. To do this I created collision zones for each of them that would trigger a dialogue balloon the appear over each of them. I also looked up a chase camera tutorial that Brackeys did because needs more game feel.
Please take a moment to appreciate that not only does the dialogue balloon icon have a fun bounce animation to draw your attention but also? Also? The icon, is, itself, animated.
At the time I was working from the unity 5 animation cookbook and I think I was determined to apply every possible animation recipe in the book. I do not regret the effort spent. Animate everything, it rules.
Next step was adding the dialogue UI. This took wrestling with the UI canvas to make dialogue windows that pop up and could be interacted with, and would then close when dismissed.
This function was pretty straightforward, building it out so that each of the characters had distinct greetings and had character portrait icons took a bit more work. Please note: the NPC icons also wiggle. As does the ‘dismiss’ X in the bottom right corner.
At this point I was ready to add Yarn. And it turned out: adding Yarn was well beyond my ability as a programmer at the time. I think it would have made more sense to start with one of the Yarn sample projects and modifying it by adding my work to it, rather than trying to add it to my work. And the documentation at the time assumed a level of familiarity with c# that I did not have, so this is where I flamed out. Still, I learned a lot up to that point. Yarnspinner’s come quite a ways, I’m curious to discover if it plays nice with VRChat. Interactable NPCs in a VRC world that have branching dialogue and pull variables from world state would be interesting to see.
So, lately I’ve been getting really into VRChat as a creative platform, because of how quickly and (relatively) easy it is to get worlds and models into a game space that is shared by and used by a lot of other people. I used to fool with Unity a lot, but making game prototypes didn’t quite have the same immediate feedback dopamine loop that furry art does (and, it turns out, that my pre-diagnosis ADHD brain needs), but VRChat’s creator tools do a great job of closing that gap: you can build a level, get it into labs, and invite friends to try it out with the same speed and ease of posting an image to an online gallery.
While I’m working on my first world, though, I wanted to dust off some of my older projects to show what I’ve already done with Unity.
I used to do a lot of watercolor painting and worked out a technique where I’d do the preliminary sketch digitally, usually in Clip Studio Paint, and then print it in pale cyan directly onto watercolor paper, then ink over the pale blue with a waterproof india ink. Then I’d stretch the paper as normal for watercolor: soak the paper til it’s saturated, then staple it to a piece of MDF to let it dry. This prevents the paper from warping too much when you get it wet, making the watercolor easier to control.
Once that was done, I’d finish the piece in watercolor and send it off to the client. Most of the watercolor work on this site was done this way. I have a pretty nice fine art scanner that does a decent job of capturing color fidelity.
I used this technique to do a webcomic for several years, and when I started playing with Unity, I got it into my head to try to paint textures for 3d objects in watercolor using the same method: printing the unwrapped UV layouts of objects onto watercolor paper, painting them by hand, and then scanning them back in, compositing the scans into a texture map and applying them to the models. I also painted several quick tufts of grass to apply to grass cards, modeled after the fact.
So far so good! Then I got them into Unity:
This was about as far as I got before I needed to put the project aside for paying work, but I’m looking forward to building out this idea further in a VRChat world as soon as I clear my plate of my current work. The idea of having friends walk around in a watercolor illustration is very exciting to me.
The third solo Unity project started as a commission for my friend Morgan, of her fursona (also named Morgan). My goals for the project were these:
- 3d model a character and keep it under 100 triangles, for a mobile/retro spec style.
- Model with Maya’s modeling tools – I’d been using Silo for years and it was starting to show its age, and I wanted to get used to something more current.
- Use a very small texture map with no mipmapping or texture filtering, to keep the chunky hard pixelated edges on the textures.
- Learn to rig and animate with Akeytsu, which was a new tool at the time that was aimed at indie game studios.
- Get it into Unity, and get it playable
Started with in Clip Studio, drew a concept front/side view:
I box modeled the character and the final tally came in at around 800 quads.
Initially I did the UVs in Maya and then started painting the diffuse map in Photoshop but the further along I got, the less and less satisfied I was with the way it was looking. I did discover that it made more sense to paint portions of the diffuse map first, to get it pixel perfect, and then drag the UVs into place with pixel snapping turned on, rather than try to solve the UV layout blind, though.
So about halfway into painstakingly pixelating the diffuse map in Photoshop, I decided you know what, actually fuck this and then brought it into Silo to rejigger the UV’s for handpainting in CSP, which is much more fun. You can also see that I ditched the armor. Usually the way it goes is the more work I put into a project, the more work I look to eliminate.
Once the diffuse map was done, I was ready to start rigging. Akeytsu is a very interesting little application that is to rigging and animating what Silo is to modeling – it’s not trying to be a fully featured software suite, it’s trying to do one specific thing very well, and to do it in a way that is painless and intuitive. I’d already had some prior experience with rigging and weight painting in Maya, and Akeytsu didn’t make me waste a lot of time looking for where they keep the spatulas, letting me get to cooking right away.
And, similarly, once the character was rigged in Akeytsu, the animation functions are also very streamlined while also being very similar to Maya, so I was able to create a couple of idle animations, and a walk and a run cycle in a couple of weeks. Looking at it now, I could have spent a bit more time tightening up the walk and the run cycles because they both look kinda swimmy, but still. Character animation is a discipline I’ve got the least amount of experience doing.
With idle, walk, and run animations done, the last thing to do was import it into Unity. I’d done enough of the project-based tutorials and had been working out of the Unity 5 Animation Cookbook that I was confident I could dummy up a functional character. Importing from Akeytsu to Unity was painless, though it did take some googling to figure out how to stick the diffuse map into the shader, because that was new. But all of the animations showed up where they should be.
From there it was pretty easy to create a player gameobject with some simple player controller movement and oh wait whoops lol it needs an animator controller too doesn’t it
Once it had an animator controller, the state machine needed a bit of script to tell it which animations to play for which state and all the transitions had to be set up – rather than having a separate ‘run’ button I just had her build speed the longer she stayed in motion, so in the course of a couple of seconds she’d gradually transition from ‘walk’ to ‘run’.
I exported the project as a web-playable demo and put it up on itch, if you’d like to try it yourself.
Morgan passed in 2020, and she was a tremendous person and a bright point of light in the lives of everyone who knew her. I’m very grateful to her for the support she showed my work and for her friendship. I learned a lot from this project and I was very fortunate to have a client who was willing to throw money at me to do something so personally enriching.