I know, I know! I am so incredibly late with that. I think I said it was going to be "this week" like 3 weeks ago, wasn't it?
I've been really twitchy about showing this for some reason, partly because I just want to have it be really perfect (relatively speaking) and not have any overt funkiness in there. At my wife's urging, I've been maintaining a bloopers reel of hilarious things that have gone wrong at various points with physics and animation.
The thing that really takes the longest with this is the non-humanoid shape of the raptor, and making that feel as natural as possible in 3D space. To really make things feel as natural as possible, it's taking a lot of mecanim animation blending as well as various other components to help with collisions of the head and tail instead of having them cheaply clip through geometry.
I've had a variety of approaches that have worked, using CCD inverse kinematics on the one hand, and ragdoll mapping on the other with puppet master, but both have been very finnicky and have other side effects. I'm now looking at doing some FABRIK inverse kinematics for the tail in particular.
The camera was also a bugbear for a while, and getting that to work in both small and large spaces in a way that would feel good on both controllers and keyboard+mouse. I went through about five different camera solutions, customizing each one, before landing on one that works the way I want.
Getting the ability to model outside of unity and then do uv mapping to unity materials in a sensible fashion also was a lot harder than we expected. Maya LT had a lot of trouble, and blender of all things eventually worked for it. We are using various assets from the asset store, but Blue is modeling walls and whatnot fresh (and with more dimensions), and so the ability to do complex uv mapping on her models was a big thing. So that was mainly a matter of finding the ideal toolchain and workflow.
Having an ideal toolchain for animation of the raptor itself was also a problem. Animation in Maya and blender was surprisingly problematic, and so we've wound up using Skele directly inside unity. That has its own limitations and is less polished overall, but I've done some custom fixes and additions to that to make it a bit better. And it was already the best solution in terms of being able to really see exactly what we were getting and have that immediately testable and integrated well. The fact that it works with both FK and IK modes (for editing) is nice, though we've mostly stuck with FK because the IK feature is a bit wonky.
Really focusing on the visual quality and upping that so that I know fully what my CPU/GPU "budget" is in terms of ms/frame has been a big deal for me, too. I'm using SSRR for reflections, and have gone through a number of different tools for that to find the one with the best performance and end result in my opinion. Really working with a variety of things to get PBR materials showing up in an ideal fashion has also been a focus. Having the most efficient and best-looking pipeline for LUT (color grading) and bloom also was a big deal to me.
A lot of bloom effects look way over the top, and while I do like the dramatic effect it needed to be a bit more complex in its calculations than just using straight luminosity as a base with no other considerations. Then really hand-tuning that was a bit time consuming. Tonemapping and other camera effects, which often play into depth of field to some extent, was also a bit of a bugbear. I wasn't very happy with tonemapping in general, because I can get similar effects with color grading and maintain more control that way. I looked at a variety of solutions for depth of field, but most of them were not adaptive in quite the way I wanted, or had problems with the near field plane that I couldn't reconcile in a third person game. The over-simplicity of those algorithms really frustrated me, but the best algorithm was a bit heavy and also tied into some tonemapping in a way I didn't like. So lots of diving into that to really rip and adjust things, and now it does just what I want (and looks awesome).
Occlusion culling for performance purposes was the biggest bugbear of all. There are so many different solutions on the asset store, and unity has their own built-in version of umbra as well. I've gotten them all, and customized many of them. They all have their merits, but also some severe limitations. After learning a ton from all of them, I coded my own from scratch for my own purposes, and it's way better performance than any of the others in my sort of scenario -- in terms of being realtime-calculated, I mean. Some of them do perform better than mine IF they go through a length (7+ minutes in some cases) baking process for the occlusion data. Since I'm working on dynamic levels, having in-the-moment occlusion culling that was realtime calculated without requiring insane numbers of raycasts was a big deal. Took me a while, but I figured out a good solution to that.
Figuring out a nonstandard way to do some complex physics stuff with collisions between "attack zones" of the raptor (a claw that is swiping, etc) during animations has also been an interesting thing, although that went fast. That plus using mecanim layers and some related tricks to have multiple attack animations possible for the same attack were fun things that were comparably easy, and that I'm pleased with in particular because various people state "oh that's not something you can do" with the animations in particular. My answer to that is: haha, yes you can do that. (And I think a variety of more experienced developers have also clearly figured that out).
Hmm, what else? Oh, working with SSAO solutions for either ambient occlusion or ambient obscurance (I wound up going with the former) was a bit of experimenting to find the ideal quality vs performance solution, and to make it play nicely with the LUTs and bloom and so forth (just really a lot of hand-tuning again). It's kind of shocking how much these sorts of things add, though. Oh, and then working with lights and getting all the various assets set up for the deferred lighting pipeline and linear color space rather than gamma. And then going full HDR -- of course.
A variety of things for exterior skies and related lighting effects took a while, because I set myself a very specific ms budget on that. Got that working well, with both options for interior and exterior.
Oh, and a custom third-person-controller for the raptor itself, if that wasn't obvious already. Really focusing on making it feel like a marionette that you can control yourself in a strong way, and not just some stiff like dinosaur-shaped-brick that you move around the environment.
Then beyond all that, lots of planning and prepping with other environments beyond the first one I'm working on, sound effects planning, AI and enemy design planning, etc. A lot of that work is still ahead of me. I've been focused chiefly on making the raptor feel awesome to play with, and to be a joy just to run around with. And on making the environment and graphics look as stunning as possible while also letting things get turned down as needed, and keeping a sharp eye on the performance impact of things like shadows. For people on lower graphics cards, they can turn shadows completely off and the SSAO still makes it look pretty darn awesome. Or that can be turned off as well for really old machines.
Anyway, focusing on you and the camera and your environment before getting into enemy design too much has been my goal, because the enemy design and certain other related pieces comes down a lot to playing off those other bits. Adding in environmental object destruction is my next thing after this current round of fighting with the tail of the raptor. You can already kick over boxes and barrels and so forth, or bite at them to knock them, but next up comes actually shattering them and smacking computer screens off the wall and things of that nature. Those same pieces of code then get forward-applied into the larger enemies, where you'll be able to take out things like a specific arm or whatever.
So... yeah. Been super busy with all that. My goals for the video have been: 1) show some actual dynamic levels, rather than the prefab one I'm mostly testing in or the barebones dynamic ones that I have right now that are not done up with real graphics yet; 2) have all the camera effects and other graphical quality things maximized -- which is done; 3) show some cool environmental interaction -- about halfway done; 4) have the raptor itself feel fully physically present and natural in the environment -- about 90% done.
I thought that a lot of those things would go quicker than they have, but it's been a bit of a crash course learning process. I have a lot of background in mostly raytraced 3D graphics, and so moving back into the land of raster graphics has had some learning to it. I'm super proud of how it's shaping up, though. And that blooper reel will be hilarious when it's ready.