(re)Starting development

Total Reset

Fresh beginnings

If you’ve been following me on twitter (and now mastodon) for a while, you’ve probably seen random posts from various attempts at making this project. Like many side-projects & indie game dev in general, these efforts haven’t been successful so far.

I’ve sort of flip-flopped between making an XCom style turn-based game and a coop game over the past year or two. Here’s an early prototype of an old version of the coop multiplayer game for example:

The turn-based one was actually starting to turn into something, but I decided to scrap it. I’ll come back to it eventually ;}

Here’s another short clip showing an early crowd test that I did a year or so ago – note: this was using the Built-In render pipeline, and had the old name (..wars instead of ….punk)

The TLDR of this all is that I’ve restarted development from scratch, fresh slate, and have been rebuilding the game in what I feel is a much more structured way that will (hopefully) lead to not only me being able to finish the game, but have it turn out better in the end than it ever could have been before.

Here’s a quick snapshot of where the game is / was at as of a few weeks ago – things have progressed since then, but it’s a solid foundation to start from – even thought it doesn’t look like much! Once I finish getting the player profiles and inventory integrated I’ll capture another video – it’ll start to look more like a game at that point ;}


What’s Changed?

1. Clean slate codebase (mostly)

Ok, so it’s not 100% new code – like most programmers, I’ve built up a library of useful code / utilities and libraries over the years – many of which are over on github and OpenUPM (search for PixelWizards) if you’re so inclined to check them out and/or use them for your own projects (maybe you’ll even find them useful?!)

With that said, the prior iteration of the project actually was going fairly well, and I made a ton of progress – integrating Playfab for the back-end, getting Photon and Steam integration working seamlessly and much more – so this basically means that even though I AM starting from scratch, there is a TON of useful ‘snippets’ that I can borrow (and lessons learned), if not wholesale code.

2. Getting organized

One big thing that changed is that I have embraced the fact that there is a good chunk of the code that I simply do not want to build out from scratch myself – and in fact, in order to actually be able to ship something as a single-person dev – it’s almost imperative that I do not.

This might feel counter-intuitive, but I’m not looking at this project necessarily the same way that many indie dev’s do – in that I feel the desire to create a masterpiece from scratch, blood sweat and tears writing the entire thing from scratch – I’m kind of explicitly doing the opposite.

Yes there is going to be a TON of custom code / content and overall ‘sweat and tears’ involved – but that’s just making games, period. For key systems within the project – wrappers for the back-end library, some core systems (like the starting point for the character controller), and more, I’m going to be leaning heavily on the work of others.

This is the main reason I feel strange calling what I’m doing a ‘one-person show’, simply because without the hard work of literally dozens of others, this project would never have gotten nearly as far as it already has.

3. FOCUS, FOCUS, FOCUS

This is something that kills more than a few side projects – what feels like a small, achievable project grows in complexity and ends up burning out the team and either not justifying the investment, or quite simply dying on the vine.

Don’t get me wrong, I feel the idea that I have come up with is still complicated ‘enough’, but I’m making very explicit design decisions that will allow me to grow into the game, get something shipped and then build on that core, without (hopefully) breaking me in the process. Fingers crossed ;P

Who What When Where Why, HOW?

With the above said, I guess I should probably introduce myself.

WHO – My name is Mike, you can find me on github, or linkedin (or any of the other things I’ve linked to from linktree) to see what I’ve done in the past. I’ve spent pretty much my entire career making games in some shape or form, have worked at many studios large & small and for the past 7+ years (wow) have had a variety of roles at Unity, where I’m currently the technical director of the film team in Unity’s Solutions group (pro services division). And yes, this image is me:

WHAT – Dystopia Punk will be a free 2 play co-op shooter set in a cyberpunk world. I’m imagining it as a pseudo cross between Payday and Hitman – where players work together to complete jobs that they get from various Fixers around the world in order to climb the ladder in the dystopian cyberpunk world.

Coop – because networking is something I’ve only done a bit of, but this keeps things fairly constrained. Also I have zero interest in paying for dedicated servers or anything like that – coop is light, and while I play a lot of PvP shooters still, I think coop is the most enjoyable.

WHEN – this one is of course next to impossible to answer – I mean if pressed I’ll use the old Valve trick of ‘When it’s done”, but my goal is to get something into Early Access (or the equivalent) before Summer 2023.

WHERE – right now I’m targeting Steam for the first release, for 2 reasons: 1) I’ve shipped games on Steam before and understand what’s involved, and 2) it’s easy, I’m already signed up as a developer and…well…that’s it basically. (Also I pretty much exclusively play games on Steam fwiw). Of course if you are a nice console / platform owner and want to throw me a bunch of money to ship on your platform / storefront, give me a ring and we’ll chat ;}

WHY – Honestly, the main reason is that my ‘day job’ at Unity doesn’t actually involved making games, and I’ve had an itch to ship a cyberpunk game like this for many years. Anyone that’s worked with me before will laugh at this – given half a chance, I’m going to try and make ‘any’ project cyberpunk in some shape or form. In every way, I feel that this game fits this description perfectly. Thanks to Jake for the perfect image to summarize why I’m building this game:

HOW – Something that I suspect most people (at least those who follow me on social media) are curious about is the various bits & pieces that I’m using to build the game (or maybe no). Well, either way, Let’s go through some of the main pieces of the puzzle.

Unity – Obviously (or maybe not?) I’m going to use Unity to make the game – I’ve been working in Unity as my primary tool for over a decade now, am pretty well versed at getting shit done with it. Specifically, I’m using Unity 2021 LTS with the High-def render pipeline (HDRP), so I can push the visuals. I’m focusing on desktop gamers on Steam so this feels like a pretty safe bet. Other standard Unity packages I’m using include TextMeshPro, Cinemachine, Timeline, etc. The usual suspects.

Other tools that I’m using?

Character Creator / iClone – the character pipeline that I have goes through Character Creator for the all of the characters, clothing and other elements, and iClone for the animations (for cutscenes / custom animations). On the Unity side, once the characters are exported, I’m using the awesome shaders & tools from Soupday to import the characters and set them up in HDRP. I also have a Rokoko suit and iPhone (literally just for face mocap & lidar – I’m an Android guy otherwise) that I can use to do mocap for characters as needed as well – and iClone makes it extremely easy to capture and cleanup mocap.

Marvelous Designer – Any custom clothing is built with Marvelous, I find it very fun to build clothing in Marvelous, honestly wish I had more time to ;}

Playfab – I’m using Playfab for the back-end for the game – managing player logins / inventory / items among other things. Playfab is great, and again I’ve shipped a couple of titles with it, so it’s ‘familiar territory’ for me

Steam – obviously I’m shipping on Steam, so incorporating their tools is kind of a default.

Unity Extensions

Now one of the main benefits of using Unity is the community – and I’m using a TON of 3rd party plugins for this project to speed things up. This is far from a comprehensive list, but here’s a snapshot of the ‘critical’ tools that I’m using in Unity so far:

CBS (Cross Platform Backend) – CBS is a wrapper for Playfab, and bundles a ton of functionality on top of the default Playfab API. It’s already sped up the development of the project a huge amount and as I add more features, I’m going to be using it even more.

Steamworks Complete – I was previously using the Facepunch steam library, which was nice and simple, however with Facepunch moving away from Unity development (and being, well….very vocal about it), I decided to investigate alternatives, and the Heathen Steamworks library (which in turn is built over top of Riley’s awesome C# warapper Steamworks.net) is very comprehensive, up to date and, well, they’re just super nice as well – oh and you can sponsor them on github to get the whole library if you don’t want to go the asset store route!

Photon – Exit Games Photon library was ‘the’ de facto networking library for Unity for YEARS, in fact if you played a game with Unity that had networking until pretty recently, there’s a pretty good chance that it used Photon. Where PUN’s main challenges (and complaints about it) came from was because of it’s Peer-to-Peer nature. It didn’t scale to larger games (ala counterstrike or battlefield), however what it is VERY good at is simple peer to peer (ie Coop) games! Also, there’s a ton of documentation, examples and just about every asset on the asset store that supports networking, supports PUN. Currently I’m using PUN for matchmaking as well as the actual networking library, though I may migrate matchmaking either to Playfab or Steam in the future (still TBD).

Opsive’s Ultimate Character Controller – After years of writing a dozen variations of character controllers, I finally decided that I wanted to spend my time ‘actually making the game’ instead of fighting building a character controller. I spent a ton of time evaluating the various systems, and finally decided to use Opsive’s Ultimate Character controller (plus a couple of their add-ons).

The main reason I chose the Opsive controller (on top of how feature-complete it is), is the fact that it does not pre-impose a specific game / logic flow onto the developer. You simply convert your character with their built in wizard and customize it from there. The new version (3.0) just came out, but I’m currently still using the 2.0 version (they haven’t updated all of the add-ons for 3.0 yet, I will evaluate it and upgrade next year possibly).

Due to the PUN usage (see above), I’m also using the Opsive ‘multiplayer’ add-on which provides PUN support out of the box – basically I get ‘most’ of the gameplay networking ‘for free’ with both of these (well the packages definitely weren’t free, but saved a ton of time nonetheless).

Amplify Shader Pack / Amplify Shaders – I’m using Amplify for any of the custom shaders that I need to wrote. Shaders definitely are NOT my strong point, but Amplify makes writing shaders even possible for me, which is great. Yes HDRP comes with Shadergraph, but quite a few of the content packages that I’m tapping into ship with Amplify shaders anyways, so I’ve decided to consolidate on this one for now. Technically I bought the whole bundle (Imposters etc) but I haven’t needed to look at imposters yet, so I’m mostly just using ASE and some of the custom shaders from their shader pack.

BG Database – something that I find many Unity tutorials (and examples / asset store templates) seriously screw up is the need to have a proper metadata pipeline for your project. If you have a billion variables in your game (weapon stats, player stats, inventory items, you name it), and have to open Unity and edit a billion components or scriptable objects, you are going to get into a world of hurt. A tool like BG Database lets you store ALL of that info in a google spreadsheet OR use their super slick UI, centralize the data and make your game TRULY data-driven. If you need to tune damage values for a dozen weapons, can you easily tweak a spreadsheet and push the changes into your game? If not, then you need to look at BGD. Seriously. Of all of the tools that I’m recommending in this thread, this one is probably the biggest time saver / value add – no matter what kind of game you are building.

I2 Localization – similar to BGD (above), the I2 Localization system is one of those ‘must use’ packages. Yes I know that Unity has a localization system now, it might even be good, but I2 Loc just makes managing your localization so easy that it is one of those ‘default’ packages that I use no matter what.

Rewired – another of my ‘default’ packages when working in Unity. Yes there is yet another input system in Unity, but I’ve heard horror stories about it so far, and you couldn’t pay me enough to use it. Rewired is one of those packages that ‘just works’ and you can’t go wrong. If you want to support different input devices (controllers etc) then you can’t go wrong with Rewired.

Mobile Traffic System – this game isn’t a big open world game, but I do want traffic / pedestrians and other ambience in the city where the missions are taking place. Gley’s Mobile Traffic System fits the bill nicely and I’ve done some tests with very large / complex road networks and it works very well. I’m very pleased with it so far. There is also a PUN networking addon by a different developer that I’ve been starting to play around with that syncs the vehicles across the network (very cool!)

Hmm…

Anyways, that’s a ton of information for now, I’ve probably forgotten a number of other useful tools that I’m using.

I think that’s all for this dev blog – I think the summary of all of this is that sometimes (often?) gamedev is far from a straight path from ‘idea’ to ‘completion’, but It’s a fun journey either way.

I’ll leave you with a funny video from a prototype I built to kick off this (re)Started development effort, where I managed to succesfully recreate LA traffic using a few of the tools listed above!

Until next time! Ping me on Mastodon (or elsewhere) if you thought this was worthwhile – I’m pseudo-terrible at blogging consistently, if you let me know that this was worth it, it will help motivate me to do it more regularly!

Oh, and of course ‘like and subscribe’ ;P

See you on the socials!