Weaggles – The fancy graphics update

Last week (or two) I’ve been working on various aspects of the tank game. There have been quite a few changes and here’s a quick run down:

Awesome graphics

Unity 5 came with loads of goodies I didn’t have back when I started the project. One of them is the improvement of the graphics engine and the addition of physically based shading (and global illumination). Others are the availability of image effects and reflection probes in the free edition of the engine.

An image showing the differences between the legacy shaders and the new physically based shaders and image effects in Unity.

After tweaking materials, sky-boxes and lighting settings a little the effect was mind blowing. The second image is a bit of an oversell as Unity 4 did have reflective shaders (but it wasn’t that easy to set up, and also they didn’t blend reflections from different cube maps).

Among everything else I made the water look nice. By using both the main and secondary normal maps on the standard shader and animating the two offsets to go in different directions you can achieve this effect:

Animated water

…which is pretty much what the legacy “basic water” does, but better as it works with the standard shader instead (C# code here).

I wanted to keep the toony look so I went ahead and added a few fake image effects on top of everything :

  • an exaggerated ambient occlusion to increase the presence of blackness (and the contrast a bit).
  • a bloom effect that makes bright areas look even brighter;
  • anti-aliasing; and
  • a bunch of different blurs… just because

Exploding Weaggles

With the new terrain and revamped physics movement it becomes easy to get stuck in a hole (which is far worse than getting destroyed). To fix that weaggles can now get angry and explode in rage, destroying everything nearby… just like bombs (they even get the same red coloring). The explosion doesn’t happen instantaneously, you have to charge it for 3 seconds by holding a button, and you can cancel it at any time by releasing the button. You can’t take the enemy with you on reflex right before they shoot you, but you also won’t explode by accident. Despite the charging time, it’s a great utility that’s always available when you want to blow things up.

A Short animation of a weaggle getting angry and expliding.

Bullets

Another gameplay change is with the bullets. They are now truly physical (and along with them pick-ups became rigid bodies as well). What this means is that bullets are controlled by forces and also upon collision apply force to other rigid bodies they come in contact with.

Pushing a cog by firing bullets

This new mechanic allows you to push object from distance, ones you cannot reach otherwise or ones you don’t want to approach (such as bombs). When first shot bullets are unaffected by gravity (and behave like they used to), when they hit something they apply damage, ricochet in a random direction, fall to the ground, and remain as harmless rigid bodies for a while. This is interesting because for example you wouldn’t be able to push a crate by shooting directly at it (as that would break it), but if there’s a convenient wall next to it you can bounce bullets off it to make the crate move.

Did I mention that bullets now have a new model, leave a trail and create sparks when they hit something?

Screenshot showing the new bullet model and the trails they leave

Mobile

Last but not least I managed to get it running on Android. I tried building the game on Android right after I applied all the fancy graphics… big mistake. It was running with a frame rate of about 3 FPS. After reverting all that and reducing the terrain quality (as its resolution is pretty high) it was still performing poorly. Profiling showed that physics was eating the CPU, after reducing the quality of the physics simulation it now runs at 20 FPS and it looks something like this:

Mobile mock screenshots of landscape and portrait

At first neither portrait nor landscape looked right on my device, the camera was positioned wrongly. As a generic solution I animated the camera with the aspect ratio as a control variable so it should now look right on any aspect ratio (regardless of the device).

Another thing I did in relation to mobile was to atlas the textures and start putting everything into a single material for which the new rendering engine proved again ingenious. Just by using the new standard shader and a single material you can render all diversely shaded objects in the scene which was not possible with the many families of shaders in Unity 4. When switching to mobile you can now simply change the shader of a single material, which is amazing.

Coming up

I plan to dig into multiplayer again sometime soon, the new networking API solves a lot of obstacles I had stumble the last time I tried it. It is now quite easy to make mixed local-network multiplayer and also quite easy to allow players to join at any time.

A gameplay screenshot from untitled tank game v0.0.3

Six weeks in the making (v0.0.3) …

I was supposed to release a version last week (I’m really sorry to those who’ve been awaiting it). Instead I’m releasing it today, and I promise I’ll try to release something every 2 weeks (1 week is way too short to achieve something of reasonable size given the amount of spare time I have).

Now lets get to the point – version 0.0.3. Unfortunately the web player won’t work anymore. I upgraded to Unity 4.6 beta version which is not yet officially supported, instead here are binaries downloads:

So, what has changed since the last release? Oh boy, where do I begin…

Bombs!

An animation of a bomb that explodes

We had exploding tanks last time, it was only logical to add even more explosions this release (and keep the trend in future until the game can’t possibly handle any more explosions). Bombs are great, they are physics controlled rigid bodies, which wobble around and eventually detonate and go BOOOM, causing massive amounts of damage to anything that’s close to them. Bombs can destroys tanks and other bricks, but what they are really good for is damaging bases. The reason why they are so great (especially in PvP) is because, once someone plots a bomb the other players will see it and try to push it away from its target, before it goes off, but the player who put it there is not going to be standing still either.

Power-ups & Items

the 5 power ups in line

Three  more power-ups and new graphics. From left to right the current power ups are:

  • Speed-boost – on pick-up doubles the tank speed
  • Bomb – Adds 3 bombs to the player’s item slot (which can later be dropped with the “use item” button)
  • Two types of shields – the good old blue shield which protects against a single bullet but last forever and a new yellow shield which blocks every bullet, but has expiration time. When a tank spawns it get a short duration yellow shield this is to prevent spawn camping and give players the chance to react to the spawn. The pickup grants more time.
  • Last but not least – the gear. Gears “heal” the player’s base when picked up, but since they are the only way to increase it’s health they turn out quite valuable, especially that’s the only resource at the moment. They are dropped every now and then from the sky and there is 1 in 4 chance that a normal crate (but not a [?] crate) will drop a gear. Later on, I’ll make gears even more useful, collecting a number of them (5 or 10) and not dying will grant an upgrade… but that’s for later.

Since the addition of bombs it is now possible for tanks to hold items (one of a type, but they can stack) and if it’s a player it will appear as an icon with a number in one of the 4 corners.

Bomb item icon in the lower left corner of the screen

Allies

Yey! Friends!!! Never gonna be lonely again. You can now spawn up to 2 AI controlled ally units using the “unit” button. They can do pretty much everything the enemies units can, except they are on your team and are just slightly smarter. You should use them with care though as they cost resource to spawn.

An ally unit surrounded by enemies

One thing interesting thing that’s worth mentioning is – since the allies are on your team the game does not end if you are unable to spawn as long as at least one ally unit is on the map. This could be a little frustrating as you have to rely on that unit to win… but there is always the “Pause Menu -> Retry” option.

Other mechanics

No grid, more physics. I completely removed the grid mechanics and made the movement completely free and physics based. As a consequence there is no more snapping to angles or positions which not only looks and feels more natural, but also requires more skillz (I find it more engaging this way :3). Another interesting side effect is that tanks can rotate and push other tanks by bumping into them.

Water collider fixed. The water used to be an invisible box with a square in the middle. Then things (especially crates) could fall on top of it and look as if they are floating in the air. That has been fixed – the water is no longer a true collider in the physics sense, and everything could fall into it. Tanks will refuse to fall, but not because they collide with something, instead their motor will “break” just as the tanks start entering an empty cell with water underneath. The resulting behavior is pretty much the same except for a two things:

  •  it is possible to fall into the water if forces other than the motor push you there (say gravity makes you fall from a height, or a tank pushes you), and that’s causing a few bugs at the moment, which should be fixed next time (you can get stuck)
  • The other more interesting thing is – if you push something that can be stepped on (e.g. a crate), into the water, you can make a bridge and use it to cross over to the other side, here’s a short animation that illustrates it:

A short animation illustrating the bridge mechanic

GUI

I spent a lot of time working on the game ui, using the new GUI system in Unity 4.6 beta (which is the reason I upgraded and consequently broke the web-player). Personally, I find the new GUI system the most intuitive and well design framework for game UI I have ever used. It has many features but here are the ones I find most relevant:

  • Keyboard/Joystick navigation – you can go to and click any button without having to use a mouse. Since my goal is to make a console-like game that can be played in Big Picture mode that’s a major plus that really saved me a lot of effort.
  • Fluid(-ish) layout – the GUI can be designed to scale and adjust according to the screen size, which makes supporting different resolutions, aspect ratios and what not so much easier for me
  • Graphics design and animation – so much easier with the new GUI. And who doesn’t like animated windows and dialog boxes :)

In short summary, I remade the old GUI stuff (main menu and win/lose dialogs) and added a level selection screen and a pause menu (which, imagine that, pauses the game).

While on the subject of better usability – I realized that it very easy to get killed, simply because enemy tanks and bullets are somewhat hard to notice and keep track of, when they should really stand out more because they signify danger. So now tanks now have team circles which apart from indicating their team allegiance also improve the visual size and contrast of each tank. Bullets are also slightly larger and brighter.

Aesthetics

First and foremost sound effects – loads of them. Most actions and interactions produce sound effects which make the game sound interesting and cartoony. Although that’s not a purely aesthetic change as sound is a very powerful feedback tool (back to the subject of usability :D).

I also added two more audio tracks. All the game music so far has been generated with  cgMusic – a ingenious tool by Maciej Biedrzycki. I haven’t given it the proper credits in the game yet, so I should mention it here, at least :)

And one last point, I optimized the level rendering by combining all similar static meshes into a bigger one (kudos to Alex for this script). This in turn sped up the dynamic shadow rendering, which make the game look so much nicer, so shadows are now on by default. One other optimization I could do (later on, when the time comes) is to combine all textures into a single texture atlas and render all blocks with a single material as described here.

That is it for now.

WIP tank game screenshot

3 days in…

Well technically 3 and a half. I started this project on Sunday (15th of September). Lest see if we can finish it in one month :) I’ve been wanting to learn Unity for quite a while now, especially because every client seems to demand it nowadays (so many people develop games for the Android). Usually I would go around and try to get inspiration from a number of games, movies, books or plain concepts, then try to blend them and try to get something original. This time around though I decided simply to make a clone of an old Nintendo classic (clones are something I generally despise). No, it’s not Mario.

It’s BattleCity

BattleCity screenshot One of the greatest things about NES games is that they are inherently simple (due to hardware limitations), a tiny set of rules with small number of objects and simple interactions between them. With such constraints it is hard to make something monstrous which goes out of control and never sees the light of day.

Lets see if we can pull this off with Unity.

Up until now I had only launched Unity a couple of times, just to test the waters, but never done anything serious with it.

Mind you, I have been crating games since I was 15, every experienced software developer would say, once you’ve learned a couple of languages it no longer matters what you write code in, C# is no exception (it’s essentially “C++ meets Java”). The user interface and Unity’s API and features was something I had to get more familiar with, so half of the time I spent in tutorials. My impression of Unity is that it’s one of the most powerful RAD tools for game development. Seriously, for a person who’s never used a professional editor with a powerful engine it’s just mind-blowing, and that wasn’t one of the things they thought at my uni.

What used to baffle me about it was the component based architecture, normally I would wrinkle and try to figure out how to make best use of a tool, so that my code can be reused later on (I tend to over-think software design and obsess with quality), this time I decided to just go with it and optimize, redesign and generalize later. After all the generally accepted right way to get things done is the lazy way – YAGNI and “don’t fix it if it ain’t broken”.

Mah game

Surprisingly I was able to prototype a somewhat complete 3D clone in those three days (in terms of mechanics anyways). But why not, if I can make a Ludum Dare game in a weekend using Game Maker Studio, why should I not be able to create a complete game in the same amount of time with Unity.WIP tank game screenshotI decided not to deviate from the original game too much, at least at first with an imposed constraint that I can remove features, but not add new ones, so that I can keep the number under control while learning. That turned out to be a little harder than I though (and my game is already starting to differ from its ancestor), but I’m trying to tame my imagination and get to a finish point this week. The current feature set includes:

  • Indestructible blocks (steel) and destructible blocks (brick blocks made out of 8 bricks)
  • Bush blocks – hide tanks
  • Holes – tanks cannot pass through them (like the water in the original)
  • Enemy and Player tank spawners (each being able to spawn and upkeep a limited amount of tanks)
  • Simple enemy AI – enemy tanks just go around and shoot randomly… like cockroaches with shotguns

Additionally

  • Tanks are able to move and shoot in 8 directions
  • Provisions have been made for multiple teams (can you feel the PvP :))
  • Some work has been made to support Z layers (Y in unity), so that the gameplay is actually 3D (and not just the graphics)

Besides this I have a growing number of features I want to add, but I’m cautious not to start on them too early. There are no power-ups yet and I may or may not add them in the first version.