28/10/21
Today I wanted to talk a little bit about what’s been going on behind the scenes at Unicube. Obviously we’re still hard at work fixing bugs and balancing – and we’ll continue to do so until we think the game is in a good enough state to continue forward with content.
As the artist on the team, other than small tweaks and changes I make myself, I’m not a programmer so it leaves me with time to work on things we’ll be adding in the future. One of these things is improved characters. Though we’ve had plenty of feedback about them being “Okay,” I know myself as the artist they’re not. Given the time constraints of the project, I had to come up with a way to introduce customisable characters with a workflow that was quick, and inevitably it lead to a lot of cut corners. The characters were never really given the attention they required. One particular aspect to the current characters I’m not happy with is they don’t have a lot of customisation options, generally have poor face presets (something we’re hoping to change with adjustable sliders,) and most importantly don’t really have a ‘lived in’ vibe about them. This is supposed to be an apocalypse, and for the most part except for some blurry and lacklustre muddied clothing, they don’t really feel like they’re part of the world they inhabit.
So I’m rebuilding the characters from the ground up. It’s a huge undertaking, and I can’t promise they’ll be making it into the game anytime soon – most likely before the middle of next year. However, whilst I’m doing this I thought I’d expose a little bit of the workflow of what’s involved. A lot of it has been trial and error, but I’m happy with the increase in quality, and I’m excited to share the progress with everyone.
Firstly, a look at the old model compared with the new model in-engine:
The first step was to sculpt the character. For this I use Zbrush. I’d been stuck in this method of modelling everything in blender for a while, and eventually branched out to sculpting in Zbrush for anything organic. For hard surface work I still prefer to use Blender. Sculpting allows me to bake the high poly details down to the low poly later on. In the current character models, there isn’t even a normal map. It’s a texture and a toon shader – that’s it.
The first step is to create the basic shape of the skull and face. I keep the subdivisions as low as possible during this stage, as all I’m trying to do is get a basic outline of the proportions I’m after without getting bogged down in detail. Good reference material is absolutely key here, and up until about 6 months ago, I’d have google open with a copious amount of tabs using Google images to get my reference material. That’s until I found PureRef, which is probably my favourite piece of software ever. Seriously, I can’t recommend it enough.
Once I’m done with the basic shapes, I add some simple spheres to the eye sockets and I subdivide until I’ve got enough quads to start adding detail. At this stage I probably went too far with the detailing, especially when the majority of the time the camera distance in the shelter isn’t anywhere near enough to reveal these details. Though it does compliment the characters on the customisation screen as they’re shown fairly close up. Later I realised adding a lot of the skin detail was a waste of time, as adding this into the texture later on was a faster process.
After I’m happy with the sculpt, I move on to the retopology. I have a love hate relationship with this process. There’s something to be said for the zen state you can achieve whilst doing it, and it gives you a closer relation to your model. I also get particularly jealous of artists that are mostly working towards a nice render, as it’s not a step they have to consider quite as much. Usually, a simple Zremesh to do the retopology would yield good enough results for something to be used for good texturing and a render, but for game development I need the character to deform nicely once I attach it to the armature for animation. I bring my model into blender (at this stage it’s about 6 million polys, and Blender doesn’t like it. It doesn’t like it at all. I use the decimation master in Zbrush and bring it down to a comfortable 600,000 polys. I lose a little detail, but nothing I can’t fix at the texture stage. For the retopology I use Retopoflow, which has sped up the process significantly. It’s brilliant, and I just wish I started using it about two years ago.
The topology around the face was particularly important, as a new addition when the new characters make it into the game is the ability to morph their faces with sliders so the player can adjust their appearance as they like.
I had to be conservative with the polys, as there can be a lot of characters on-screen in the shelter, and they’re generally quite far from the camera, but had to keep them high enough that they’d look good on the customisation screen, which was a tough balance. I haven’t looked into different LOD settings, and I’m not sure if Unity handles LOD out of the box – I’ll have to look into it, or if there’s anyone out there that can give me any tips about it, that would be most welcome.
For now, I’m happy with my character and it stands at just over 10,000 verts. For reference, the older characters were about 15k, so the new models are more economical. This is why retopology by hand can go a long way. The next step is to UV unwrap the character. I won’t go into specifics with this, suffice to say I create as few seams as possible and use as much space on the UV sheet as I can, whilst generally you want to keep the scaling uniform, I do often give a little more space to areas of interest (primarily the head.)
The next step was the texturing in substance painter. I keep the eyes separated at this stage, as I just want a clean bake of the details from the high, and I don’t want substance adding ambient occlusion information to the eye sockets. My workflow for this is simple: I paint all my height information first (wrinkles, freckles, moles, pores.) without any colour information, and without roughness information. I build up colours slowly, working from a base colour, and gradually add in the detail bit by bit with layers using a brush with low opacity, using one of the dirt alphas that comes with substance as default to break it up. At the end of the process I create a roughness layer and begin adjusting areas that I want more specularity (the nose, the lips, fingernails etc)
When I’m happy with the texturing, I move on to the clothes. This is a new process for me, as I’ve previously only modelled clothing in Blender. I’ve toyed with the cloth simulation using Blender before, and it’s great for simple things – curtains, or the tarp that hangs over the second tier storage in the shelter for instance, but for clothing I wanted something more robust. I could have sculpted the clothing, but I wanted to make this workflow as efficient as possible, and sculpting realistic clothing is time consuming. For this, I use Marvelous designer, which is mindblowing.
Once I’m happy with the pattern in Marvelous, I bring the model into Zbrush for some detail touches – things like stitching wrinkles and some extra folds, buttons. Importing the object into Zbrush brings some undesirable defects, like gaps and tiny holes – particularly where the seams meet, but it’s not too difficult to work around them with some quick and dirty Dynameshing.
The texturing process is much the same as the character, so my workflow doesn’t change too much there. I take advantage of the baked curvature map to draw attention to the folds and creases to add aging and wear. Again, good reference is absolutely crucial with this. I’ve added a small tear in the fabric, and I’ll be adding more of those in the future with different styles of trousers.
Finally, I bring everything together in blender and begin the process of weight painting everything to my armature. I’ve made almost 200 unique animations for this armature, and although scrapping the old one and starting from scratch would be ideal, I’ve had to try and fit the new model to the armature and get it working again. It’ll require some tweaks to some of the animations (they need a polish anyway).
For the longest time, I wasn’t aware of the transfer weights feature in Blender’s weight painting mode – something that could have saved me some serious headaches in the past, but it generally has excellent results. I find that no matter how carefully you weight paint though, there’s still the issue of clipping when working with clothing on the character. For the current characters we occlude parts of the body underneath the clothing as they’re wearing them using blend shapes, but for the new model I’ll be using opacity maps to hide the skin.
Currently, I’m working on the hair (very WIP) – the main roadblock being keeping the polys low for performance, but high enough that it doesn’t look terrible Also, the way Unity handles transparency in the Universal Render Pipeline on our current version has its own set of problems that I won’t go into here, but suffice to say it’s a headache.
I use baked texture sheets of individual strands simulated in Blender for the texture, normal and opacity maps.
For the hair I hand place ‘hair cards’ to create the style I’m after. It’s a very tedious process, but generally I’ve found it’s the best way to make sure the style conforms to what you like. Also, to keep the polys low, using an automated method really doesn’t cut it. I’ve used Blender’s particle generation for hair, and unless you crank it up to really high amounts, it’s generally patchy and it takes a lot of hand adjustments anyway. I’m still not entirely happy with the results of this, so it still needs work.
That’s all for today. I hope you’ve found this peek behind the scenes interesting. There’s a lot more to come, and I’m really looking forward to the future content we have planned for you all and sharing more behind-the-scenes looks at what’s in the works
-Sonny.
P.S: A sneak peek at a very good boi in the works: