I’ve been using Unity3D a lot lately and naturally have developed a list of gripes. Let me clear my throat…
The GUI.
Having fluid 3D graphics in a Unity3D game isn’t a major accomplishment. It’s when a game has a great GUI that Unity developers crowd around and wonder how it was done. The fact is, Unity3D’s GUI system is absolutely atrocious. Getting anything decent out of it is worthy of a Congressional Medal of Honor. I shudder to think how much work it took to craft Battleheart’s amazing GUI in Unity3D.
Back in 2005 when Unity3D was preparing for its first release, Immediate Mode GUIs were a hot new trend. However, game interfaces can be complex beasts. Especially on iOS platforms, there’s a certain level of polish expected that Unity’s IMGUI implementation can’t come close to. Also, Unity3D’s GUI has weird performance issues on mobile devices that makes it pretty much useless on iPhone.
Unity3D 3.5 supposedly has an all-new GUI system that I’m eager to see. Unity hasn’t uttered a word about it. Instead they have been going on about AAA console game features such as light probes that are largely irrelevant to anyone doing mobile games.
AnimationEvents can only be called on the first script.
Adding and manipulating animations in Unity3D can’t be much easier. Just drag and drop animations on to a prefab. Blending between animations is just a simple API call. You can even point and click to add AnimationEvents on any animation’s timeline. These are function calls that are made on the timeline, usually to trigger sounds, particle effects, etc.
The problem is, the AnimationEvent system can only call functions on the first script component attached to the object. This wouldn’t be a big deal if you could re-order the scripts in the Inspector. Instead, the only way to change the script order is to remove all script components and re-add them with the one containing AnimationEvent code first.
Asset Server should merge binary objects.
Before Unity3D supported source control in the Pro version, your only option was the $500 a seat Asset Server. This is a no frills source control system that allows multiple users to collaborate on scenes together. Unity should be able to craft a source control system that knows its own object format. If you could merge changes of binary objects down to the component level, Asset Server would be invaluable. Otherwise, Perforce is a better alternative. Even with Perforce, scaling a Unity3D development team beyond 10 or so people can be a nightmare.
Why are you using Unity3D at all?
Here’s the thing. Why are you even using Unity3D? Is it for 3D graphics? Who cares? There might be one or two 3D games in the top 50 iPhone apps sorted by revenue. On Facebook, nobody cares about 3D either.
The fact is, Unity3D is busy trying to attack the collapsing AAA game market with high end features such as multi-core renderers and light probes while ignoring what the vast majority of their users need–mobile friendly features such as GUI and 2D support.
My interest in Unity3D stems from its multi-platform features. The ability to effortlessly spit out web, iOS and Android builds from the same code is attractive. Still, when %80 of your revenue comes from iOS, do you really think it’s worth the hassle of dealing with Unity’s shortcomings just to scrape up a few extra dollars?
The amount of time I’ve spent searching for the ultimate cross-platform solution would probably have been better spent nailing an excellent iOS version and dealing with other platforms later. Still, in the past I’ve been bitten by tying a codebase closely to a single platform when the market shifts. This is an open question, but 3.5’s new GUI may be the make or break moment for my Unity support.