Unity sometimes makes me a little bit sad.

So Unity is a top-notch development environment. I would describe myself as an advocate of it. It makes easy things easy and hard things possible. The free version isn't unduly crippled - you can create perfectly functional games, and release them and generate money for yourself. But there's one feature in particular that I wish it had - it's called "External Version Control". This isn't just because I'm (thank you Elliot Games) a Pro user and I rely upon this feature (I turn it on with everything I develop on, and usually use Git/Github to manage my projects). If that were all, I could live with the inconvenience of not being able to branch nicely and get on with it, grumbling a little under my breath. No, the real shame is the ecosystem this choice creates.

A Unity which doesn't normally do version control is one where you don't whack that useful little script up on Github. That script that smooths out that common niggle? That port of that handy library? Maybe someone will have written them up. Go look on the forum. Or on the scripts wiki. Copy and paste the code into the right four files, and it'll work (hopefully). But if you find a bug, or extend it usefully, or touch up the interface, you're not likely to share it back. Not if it means copying and pasting five times, or contacting the author with an updated version, and hoping he bothers to update his post. Maybe you will, but neither of these mechanisms can be said to scale. They lead to the problems that version control, and bug trackers were designed to fix. This isn't even touching on documentation. Let's not touch on documentation.

(A slightly tangential point: Unity provides a mechanism for packaging up a library/utility/subsystem for reuse. You can export a set of objects as a .unitypackage, and easily reimport them. But these import/exports happen statically - if you fix a bug in a system reused in multiple places, you'll have to go replacing it in all of those places. Control over your updates is a great thing of course - but speaking as somone who tries to make as many assets in a reusable form as possible, it makes me sad to have to do this administrative bullshit before I can actually use it. And it slows iteration down to a crawl. And bloats repositiory sizes to have things in mulitple places. *sigh* (yes, I have tried symlinks))

So the lack of version control makes me sad. It means I work in an ecosystem that is a pain to navigate, and not as rich as it might be. Luckily, Unity saw that this lack of sharing hurt people. If your editors shining feature is to let you drag and drop objects, it shines best when there's a ready supply of objects to be dragged and dropped. So they created the Unity Asset Store. It's a wonderful land, full of excellent tools (ones I've eyed up: Pixexix, UniSky) - but most of them require you to pay. Now, I have no objection to people profiting from their work - I make things in Unity and recieve a wage for doing so, and long may that continue - but making things paid for leads to other consequences. It leads to sources being wrapped up, and hidden from prying eyes. It leads to excellent code being in fewer hands. It leads to duplication of effort. It adds a hidden cost to being productive in Unity, to hidden secrets that an eager teenager will blame their failures upon not having access to. It makes me a little sad, when most of the other things I code in give me these things for free, and reward me for looking at them, and improving them. If I use Path, and get curious as to how it works, and fire up ILSpy, I'm in breach of contract. If I make a website in Django, and get curious as to how the urlresolver works... well, there's this. Oh, and what's worse - if I work in Unity, and I use UniSky (for example!) - I can't opensource that game (in it's entirety). It's contaminated, and any contributor will have to buy a license of UniSky. GPL is infectious, but so is closed-source.

But then - maybe this is game-dev specific. I know most of these criticisms are irrelevant for the majority of things in the Asset Store. Only code gets put in version control, typically. There's no good merge tools for .psds, more's the shame. Before there was an Asset store, common utilities were owned by particular people. It's AngryAnt's Path, it's Stramit and Texel's Strumpy Shader Editor. They were free, and freely shared, but only in the sense of beer. Strumpy Shader Editor comes compiled[factcheck] - if you want to peer under the hood you have to use a Reflection tool. And not much was in Github, even then. Sure, there are others fighting the good fight, but I don't feel they're winning. I saw Rob Fearon give a talk where he begged developers to put their assets out there. To let others reuse them, to make our tools easy for complete beginners to use, to point them at ways that let them get a toehold into The Making Of Games. I know increpare/Stephen Lavelle provides source code with his games.

But maybe all this is balanced out by the amount of code and tools and assets which are now sold due to the profit motive. There was a lack, and Unity moved to fill it. I'm not going to accuse them of taking a worse course purely for the profit (they get 30% of revenues for things sold in the Asset Store) - I think they made these choices honestly, and to supplant the sharing of necessary libraries in old forum posts. Which just sucked. It's a bit more of a tricky issue when it comes to version control - they sell a Asset Server themselves, which by some accounts is the way to go for team collaboration in Unity, though I've not tried it. The motivation for adding External Version Control was enterprise - huge shops hesitating over buying thousands of seats because they all use Perforce. With that context, Pro only makes sense.

And it's maybe unfair to blame this on technical reasons. Ultimately, this is a social problem. Other areas of programming are far more open - open source gaming does not have a long and glorious history. FreeCiv, Teeworlds and Nethack are the only ones that come to mind (although for libraries - Box2D is bloody amazing and everyone uses it, there's Flixel, Flex is open even if Flash Player ain't. etc. etc.). Projects are structured differently - people play games for limited periods of time before moving on, and that does not for good OSS development make (look at the exceptions I listed again - all games people get fixated on for long periods of time.) Maybe it could never have taken off, and the Asset Store is just an acceptance of this fact.

Anyway. I'm not going to change things. I'm okay going with the flow on this one. After all, if I'm so shit hot, why can't I be the one profiting? I'm going to launch my own handy editor utility soon[1], and I'm going to put it on the Asset Store and I'm going to charge money for it. And I'm going to have a big long think, and maybe I'll also put it on Github, and accept patches. I hope I do.

[1] Terrible marketing to bury this in a footnote, but it's an awesome tool. Add a [Bang] attribute to a method on an object, and it provides a button to call that method. Testing a spawning function? Not quite sure how you'll trigger it, and just want to get it working first? Just add [Bang] and you can test to your heart's content. At the moment I'm working on letting you specify parameters, which is a huge pain in the arse. But it'll come, and your life will be better for it.

18 May 2011