Quite a few aspects of our game have changed over the past couple months, one thing stayed consistent though, the cheap bally visuals of our crawlers that had been untouched since the very first networking setup. After having rearranged our feature priorities, basically aiming for a well polished low target, having placeholder models for the crawlers didn't seem acceptable for our final release.
Since we are going for a simplistic "lowest poly" kind of art style, we had decided to use a rigged, low-poly humanoid that has been lying around in our assets for a couple of weeks now. Replacing the particle system, the entire model is now dyed in the player colour.
Left: First working locomotion blend tree - Middle: First attack animation test with additive full body layer - Right: Final override upper body layer
Using an amazing set of free axe animations from the assets store, the first step was to create a locomotion blend tree using Unity's built-in mechanim animator. This way, the crawler can smoothly transition and interpolate between 9 different animations representing different walking/running directions and speeds. Adding an additive upper body animation layer, I enabled the crawler to perform a melee attack, weapon drawing and hit animations without interfering with walking. With a network animator, I made sure that the animations are just as pretty for everyone else on the server.
While using different animations for attacks might be a convincing solution for melee crawlers, this doesn't quite work for the gun-wielding ones. While it would be possible to handle everything with animations, we would need a set of animations for every single gun, for every posture and we would need to carefully tweak the animations to make sure the gun still points straight at the end of the day. So to solve this problem, I decided to integrate IK to the Crawlers' animator. While this also enables us to do fun stuff like having the model look at specific positions, we can now basically just leave the gun as it was, control it via script completely separated from the player model, while the player model can basically do whatever it wants while making sure to grab onto the gun.
The cool thing about rigged humanoid meshes in Unity is that you can easily generate ragdolls for them. Since all our crawlers did after dying was just standing around so far, I decided to use this chance to create a more dramatic death effect. On death, every crawler can now instantiate a ragdoll prefab, that can also be equipped with weapons and other physics objects.
The first Crawler to receive an overhaul was the Soldier, as a gun-wielding medium-long range class, the first step was to make him hold the gun using inverse kinematics. To make the gun look a bit less like a magically floating anchor that the Soldier holds onto, it now smoothly moves with the motion of the shoulder bone.
To polish the soldier gameplay even more, he now rocks a cool low poly rifle instead of a cylinder, and with the help of versatile new classes for recoil, muzzle flashes and shell ejection, shooting now feels much more rewarding. Even though the plan was to have the soldier draw and fire two pistols for his burst ability instead of just having a burst of bullets randomly leaving the barrel at an angle, this just seems like a lot of extra work and points of failure given the remaining time. In addition, the recoil and muzzle flashes mask this problem quite well now.
One issue with the new Soldier is that due to his new size, the gun is too high up now to hit scorpion enemies when shooting straight but the team is working on a solution right now.
Even though our animation system would be capable of chaining different attack animations to a combo by holding down a button, our current attack systems sadly don't work that way. Since we only allow a single attack after a click I had to think about how to integrate the animation system without being too invasive on the existing code base. The two possible solutions were to IK the crawlers hand to existing sword or to use an animation and sync it with the actual attack logic. Since the IK solution just looked horrible, I had to overcome the funny property of Unity that any transform attached to a skeleton will be viewed as an augmentation of the latter and thus be animated as if it was bone. The animator now has one triggered attack animation that is synced with the underlying sword logic. In addition, various script references were adjusted so that the new model still supports all the special infiltrator abilities like invisibility.
Throughout the week, Paul and I also had some more networking playtesting sessions, some of which included an external playtester. In addition to verifying the functionality of the crawler's networking we spotted, located and fixed quite a few more or less game breaking bugs.
We now have about a week to finish up the project for our final release and the demo day. For me, this means to finish the remaining two Crawler classes, which shouldn't really be too big of a deal, since both Berserk and Sumo are basically linear combinations of the two finished classes from a technical standpoint. Then I also need to finish all the master stuff, that has been idle over the last week. Luckily Paul came to help out on a few features like the Crawler-Master pinging and the VR menu but I still got plenty of things on my list to finish, test and debug.
The last two weeks, the crunch time, yielded another selection of changes to the main menu and in-game UI. Among the most important, the main menu was ported to VR so a Rift/Vive player could actually join a game, start a server, view controls and more inside the headset, instead of having to keep switching between headset and the normal screen. To facilitate this, the menu needed to be adapted to the VR laser pointer input method. The menu dynamically detects VR user presence to automatically switch between normal screen and headset use.
Scaling modes for all UI elements were tweaked to work reasonably well on all common screen formats.
A low HP screen overlay was added so players would have a more immediate indicator of critical health status.
CRITICAL UPDATE: For the time being, this sadly has to be disabled. It turns out that whenever the server's UI is in VR mode, players can't interact with the lobby anymore. The cause is entirely unknown and the behavior does not make sense.
What we kept noticing while playing was that it seemed a little off when entities walked through lights but did not reflect any lighting changes. So a light probe network spanning the whole scene was added, which
fakes approximates lighting changes from static lights on dynamic objects.
Emissive lights were slightly increased in intensity while post FX bloom was slightly reduced in hopes of achieving stronger lighting contrast in some rooms.
At Jonas's request, the main scene now also has a weak magenta sheen from below to fake stronger neon reflections.
My biggest addition to gameplay was a crawler ping. Upon a button press, a crawler sends a ping signal to the master, giving them a clear audiovisual indicator that this crawler wants attention. Both the crawler and the master get a yellow particle effect and looping notification sound, very light for the crawler of course to only serve as feedback that the ping is active. The master sees a tall and bright effect and a louder sound to be able to locate the pinger. Other crawlers cannot see someone else's ping. To avoid spamming, the ping is tied to a sizable cooldown. Whether the master acts on the request or not is of course still fully in their power, and there is no penalty or reward in store. Loop 3/10
The ever-increasing number of testing matches gave us ever more statistics about how fair and difficult the game is. The scorpions' fire attack was slightly tweaked to deal less individual but more continuous damage, the boss was buffed to take and deal more damage. Crawlers were balanced so they fit their roles better. The infiltrator is now a viable stealth option and when in the hands of a skilled player, can resolve many encounters before danger even arises. The soldier now has reasonable ranged capability without being able to just mow down entire groups at once, but at the same time without feeling like a pea shooter. The berserker is now a danger up close and can use his special attack to flurry out of a hairy situation. The sumo has good crowd control but is still a less popular choice as it doesn't feel like a particularly versatile class. It often seems like just a tank and just that.
A lot of time was simply spent tracking down more and more bugs, fixing them when possible, testing over and over, retesting after changes or additions. As expected, but still unfortunate, there is a number of remaining bugs, such as a curious crash that only happens when a user plays a game as a crawler on a machine with an Oculus Rift connected and detected, or the bug that if a user tries to connect to a lobby mid-match and is rejected by the matchmaker - which is expected, as a user is not allowed to join mid-match - this interaction is detected as a player disconnect by the server and triggers a message for the players in the match that someone abandoned their match and only allows them to leave the ongoing game. Along with a heap of small issues with decreasing priority.
Both the final presentation and the demo day are rapidly approaching. Both commanded a whole range of preparation and last touches. Final milestone report, presentation slides, a madness slide, a booth poster - screenshots for the slide and poster included some excessive screenshot manufacture by Jonas - testing setups for the demos, etc. The same crux as with playtesting applies for the demo day as well: we need a more sophisticated setup with multiple computers, a local network and a VR setup. The university could unfortunately not provide any suitable machines for us, for one because they couldn't give us multiple and also because they couldn't give us one powerful enough for VR. So we decided to organize some machines of our own. Among other things, this meant actually assembling a third computer for demo use.
It still remains to be seen how well the demo day and final presentation will roll over, though.
Well, the last days for us were relatively boring. My teammates don't even allow me to break things before the demo day. So... Just testing and tweaking so the demo day will be smooth!
Indeed, "smooth" is a good word to describe our changes these days. We made a lot of effort to make our game smoother. Previously we had a problem, for instance, that our camera was shivering (and even jumping sometimes) when crawlers got close to the walls and other obstacles from behind. At the moment it is resolved carefully: now camera reacts with obstacles in a very gentle way, approaching closer to the player if there is an obstacle behind. If the player leans against the wall we still can see everything, since its body turns transparent. It is the camera, suitable for AAA-game!
Oh yes! I almost forgot to mention that we have an exclusive gift for the demo day: new enemy type! It is a drone that shoots deadly lasers! Now our robotic hordes are more than complete with a new range-based enemy and can frighten any hardcore gamer.
I wish everyone to enjoy the demo day! =)
In the final days of getting our game demo-ready, we are working hard to address issues and improve the look of the game. From my end, improvements to the crawler UI were made and some bugs were fixed. I shall go over them below!
What's up with my team?
Walking alone in the dungeon can feel so lonely. Until you find your teammates, you have no idea what has happened to them or who they're even playing as! If you weren't paying attention in the lobby then don't worry. This UI update allows players to know the classes of other crawlers and a vague estimate of their health. Of course, you still need the lovable master to guide you to where they are, but at least you'll know how many have died to that FREAKIN' SCORPION THAT TRAPS YOU IN THE CORNER AND BURNS YOU TO DEATH.
That's where I was aiming!
Next up, the crosshair has been updated so players know exactly where that bullet is going to go when they shoot. Before the crosshair was static and you had to learn the trajectory of the gun to learn where the bullet was going to land. Now, the crosshair updates its position and nicely places itself on the chest of the robot that's going to get gunned down, removing the guesswork from shooting and allowing for a more, if I may borrow Artem's terminology, "smoother" gun fight. Just remember to keep calm when you shoot else those shots are still not going to hit anything.
That went over his head * badum tss *
With the recent model changes, the gun was slightly lifted on each character to go along with the humanoid characters. However, this made it so the scorpions no longer got hit by player bullets. Forcing some food into those metallic bones and letting them rest made them grow bigger. Now, they once again get hit by bullets fired at them and die. VENGEANCE FOR THE CORNER DEATHS!
Let the flames envelop you...
Finally, an optimization was made for the flame effects of the scorpions. There were too many particles on-screen and similarly, a lot of (useless) colliders. The numbers of both were reduced without any sacrifice to the visuals.
Preparations are ongoing as we wait eagerly to present our game in front of a live audience and have people play our game. Slides, posters, and final bug fixes are all part of the norm.
I finished the mehsed Sumo, and he is T H I C C.
The sumo was a bit different than the other classes, all of his attacks have big area effects and are thus basically just big colliders that pop in for some time. This for one gives me the freedom of not having to worry too much about the functionality of the attacks (unlike with the infiltrator or even soldier class). In return, i had to add in two different animations and add a delay to the attacks to match the animations. For one, i found a sloppy slap animation and i also chopped up a jump attack animation to fit our needs. With reworked and correctly timed sounds and particle effects this gives the Sumo quite a punchy feeling. But one thing was still missing: the sumo was just as much of a skinny monkey as all the other crawlers and it just couldn't stay that way. So i fired up blender and about an hour of horrible controls later this lovely tub of lard entered the battle field.
Since the berserker is basically just a combination of the soldier and the infiltrator, adjusting the mesh, gun and the katana went quite easily. Instead of an assault rifle, he carries an automatic shotgun that i remodeled from another low poly assault rifle model. Instead of the weird lightsaber katana thingy, he carries a normal katana that only happened to glow, because his entire body glows in rage mode. When switching to rage mode, the berserker throws out his shot gun and pulls a katana from his back. When he's done, so is the katana and he just pulls a new shotgun from... somewhere, there is no real transition but given that we only had a couple of days to go till demo day, there just seemed to be higher priorities on my list than coming up with some weird smooth IK + gun animation solution. Still looks pretty nice though.
After having spent way too much time with the new crawlers (and taking epic screenshots of them lol), it was time to tick off an item that had been on my list for quite a while already: Master Sounds.The master now has ping sounds for the hand arrows, charge and discharge sounds for the abilities, and impact sound effects for the throwable abilities.
For one, the master's interactions are now more immersive, you can hear the flames sizzling on fire balls, heal orbs make weird healy noises, buffs and debuffs now have sick beam noises that change their pitch depending on the resource levels and some cracking sparks and much more. Also, now the buff arrows make a nice "ping" bell noise that will actually help the master to grab the crawlers attention.
Again, there was heaps that broke again last week or stuff that just was broken all along. Apart from the good old nullreference exception that we seem to get for every single light hearted change to base classes without generally checking the new variable for null there were quite a few more curiosities in our code base, here two examples:
In the last week of the project, I tweaked and updated a few small things. For one, the icons in the class selection screens have been updated to reflect the final sprites. The ping received an icon as well. I also went on the hunt for sounds for Jonas to use for the master. The ping master effect got a stronger glowing pillar in its center. The VR master now actually sees the information screen about a player leaving the match. Enemy bullets do not remain with nullpointers after the corresponding enemy died.
In this week I actually created the final madness slide and poster, had it printed and did the last preparations to our demo PCs (including filling one of them with coolant, because obviously it had to be a custom water-cooled machine) and testing them for stability so we could avoid hardware issues during the demo.
Now that we had the final game build, we also collected footage for our final gameplay video. Ironically enough, video publication would eventually be late because the PC used to cut the video ended up as the only VR-capable presentation machine at the demo day, and cutting and rendering out the video before was prevented by slow internet upload speeds. Once again we were hindered by the networking aspect of our game and had viable footage distributed across the PCs of several members - especially since only one member still had a VR headset at home - and had to wait for all the footage to be uploaded to a central collection first. Naturally, upload speeds of common home broadband connections mean that several gigabytes of footage take several hours to be ready.