How Unity3D Sucks?
"You'd have been a millionaire ages ago, if you had written a game with me using Unity3D!" - The mantra repeated by a friend.
Last January I decided to work on a game with my friend, with Unity3D. I wanted to teach him some programming so he could write a game himself. Thought we could publish in SteamOS once we've got something to show.
The friend, studying in North Karelian vocational school, wanted to write a winter survival game. I wrote code to get the player move and handle items, throw boxes, fire emergency rockets and freeze dead. Wrote code for everything. While doing it, I explained everything to him. He thought the game required too much graphics so we switched to writing a grid-floored factory simulator. I've gotten to know Unity3D better and my friend has learned some programming.
Although working on games has been fun. But during the last weeks I've learned why Unity3D, version 3.4, is disgusting. Now you're going to hear about several gimmicks and stupid practices I wouldn't want to see anywhere again from now on.
In the knees of the Windows&Mac
Although Unity3D can publish to any platform, it's editor only works in Windows and Mac. I hate using Windows and I don't own a Mac, so I used teamviewer to connect to my friend's machine. He was watching on his seat while I were writing. This removed the need for version control and made it otherwise easier to explain things to my friend.
To be fair, they are the two major platforms even today. But I would rather bite my leg than use anything else than Linux for developing any kind of software.
Update: As of 2015, Unity3D editor is available for Linux as well. You can fetch it from unity3d blog & forums.
Collaboration has been improved as well. Unity3D teams provide collaboration tools for small teams, and if you don't like that offering, you can use external version control.
Wants to clutter your mind with useless crap
Unity's editor opens full of small buttons and widgets like a jetliner cockpit. When you create a new project, it asks you which modules you want as if it mattered before the project was created. When presented to such environment, it's easy to lose the direction.
I prefer clean, minimal interfaces for everything. Having too many controls irrelevant to what I am doing at the moment will just slow me down and reduces my feeling of being in control. The first time I ran the Unity3D, I just added a box, ran the thing, saw the box falling, then quit the editor as I was clueless from where to continue.
Inside the Golden jail
After you've started a new project, it pounds up with an empty scene graph open in an editor. It's common for the developers to write their own editors. When they do so, the editor the Unity3D provides seem to become entirely useless. You simply do not seem to have control to which pieces of Unity3D you choose to use.
It's a similar problem what modern javascript developers meet with HTML today. The problem is that Unity3D is a framework. Instead of a blank page you could write commands to, you're getting some marvellous small universe where you can put your stuff into. Even if it works, some of that framework below always ends up being an useless appendix.
Scene-Object-Component -hierarchy
Unity3D insists that scripts you write are components. Components attach to objects, and the objects belong to a scene or prefab. Aside being useless and inefficient for many games, it doesn't make much sense to me.
Scripts about never affect just one object. Sometimes they do not affect an object at all. It's very common to have a GameMaster in your Unity3D scene - an empty object that does serve none other purpose than hold the major scripts in the game.
To make it worse, Unity3D bolts the script component, name of the script and the class in the script together. The script must have the same name as the class, and you refer to a script in each component. It reinforces the beginning programmer misconception that an instance or object in programming means for the object in the scene. More useful abstract meanings behind objects may end up unused. Besides, the code doesn't end up into files reasonably, but by the subject they inhabit.
Lack of OpenGL API
OpenGL is the true industry standard for real time rasterizing, because it's available to any vendor and not for just those who Windows everything. Sony, Valve, and even that astray Nintendo all use some version of OpenGL in their platforms. It's not always working to the spec, but it's there.
Because OpenGL is everywhere, it is one of those things that are portable. You could always have it included. For example we have WebGL in browsers because it can be supported anywhere.
Unity3D does not provide portable OpenGL API of any kind. If you want to provide graphics to several platforms at once, you're either using default, limited Unity3D, or you are on your own.
Static typing and C sharp
C# is Microsoft's answer to java, and java itself is an awful language. I have a fresh post where I reason why static typing is stupid.
It's not entirely bad though
I used to think that Unity3D sucks. Well it turns out I was right all along! There are things that I can stick to.
There's something nice about Unity3D I like. It lets people with no programming experience to start with game development. It's easy to learn how to script up simple behaviours. There are lot of pre-written behaviors that are easy to reuse. That allows people to learn programming while they're writing their game. Anything that does such thing, can't be entirely bad.