It's Coder-Art O'Clock! A visual postmort of my jam game

So, I'm a pretty jack-of-all-trades game dev by trade, which makes jams right up my alley. But let's face it, I don't have the budget in my home life to spend on the kind of art tools I got taught in school. So when I decided to build what seemed like it might be a fairly art-intensive game for LD, I had a choice: download free tools I'm not familiar with, and try to learn them in the jam, or improvise and maybe think back to my maths background for some ideas.

My game's an apocalyptic rhythmic survival game about defending a fleeing escape pod by moving its shields around. That gave me a vague list of things I needed to make: - Some kind of acceptable-looking human spaceship - Ineffable alien enemies and their ineffable alien bullets - Moody space backdrop - Even moodier lighting effects - UI

And the constraints: - No model assets - No texture assets - I've got less than 48 hours oh my god

Surprisingly, the spaceship turned out to be the easiest part. The whole thing's just a bunch of cubes and spheres scaled. It's simple, but it only has to be small onscreen and IMO the clunky-looking design makes you feel really sorry for the human survivors onboard!

lowpolyship.png

The enemies were a little trickier. I wanted to sell the idea of them feeling out of place, so didn't want to rely on familiar primitives like cubes. I ended up spending half an hour mixing notepad sketches and basically trial and error to code a more unusual shape - the octahedron. It's easy to forget that you need to duplicate each vertex once for each surface it touches if you want the right normals for that sweet, sweet crisp shading:

(You can see from the array indexing order that I rendered it back-to-front on my first attempt haha)

octahackdron.png

It's remarkable what Unity's default particle material (with no textures!) can get you. I'm sure I'm not the only one who's been making awesome starfields with extremely long-lifetime particles for years, but I was surprised how effective the clouds were too. Let's take a moment to praise the Unity lords for providing us with the blessed Pre-Warm checkbox!

For the moody lighting, it's just more particle systems - one attached to the player's shuttle, as well as every projectile and enemy. All of those just fire a single particle hooked up to the game's internal rhythm clock through a super simpler listener interface, so they can fire on the beat. The timing part is subtle but I think it was worth it.

Projectiles have addition particle systems to provide a little feedback when they spawn in, start moving, collide with a shield, or collide with the vessel itself - each set up with the right colour and brightness to communicate whether it's a good or bad game event, and how important it is. Even with all those states there's only a couple dozen on screen at any one time, excluding the starfield & clouds.

Put together, it looks like this, which I think is pretty moody indeed:

ezgif.com-optimize (9).gif

For the UI, I needed some more mesh generation! Turns out that with a little modulo magic it's super easy to turn a basic donut mesh generator into a dotted line donut mesh generator:

ringmeshfun.png

One final touch that I think really brought it all together was some vibration! A whole bunch of things in the game, from the camera to the player's vessel itself, randomly pick an offset a random number of times per second to emulate that stressful shaky-cam feeling.

Maybe the most noticeable use of this trick in the game is when enemies are charging up their powerful dash attacks. In this case, I set the blend curve between the random offsets to jump instantly to the new offset instead of smoothly vibrating around, which adds to the jarring feel of the enemies and hopefully is more eye catching as a gameplay telegraph than a smooth animation would be. AnimationCurves are one of my favourite tools to use in Unity. They're a great way to get some control and add polish to quick codey solutions, without going to the effort of making everything animate through more conventional and (for me, at least) slower to use tools.

ezgif.com-optimize (10).gif

So yeah. Nothing super crazy, but I hope there might've been an interesting detail or two in there for someone to pick up on!

If you want to check any of this out, both the source code and game itself can be found right over here.