[Rant] 10 Reasons Why I Dislike Unity (as a Developer) (locked)

84 posts

Flag Post

1) Monodevelop, the default code editor, hates javascript. No, really. It’s not even classified as a bug.

2) 2D interface elements are a b*tch to create.
(Primary reason? They use screen coordinates from the bottom left, on a scale of 0 to 1…and using pixel offsets. Secondary reason? You can’t get an accurate view of what will be rendered at your target resolution, as the camera’s aperture width/hight ratio is set to whatever viewable area your window has, not the target resolution’s! There is no way to preview the screen at the target resolution without compiling a full build!).

3) All Function Names are in Leading Caps All the Time. Why?
(javascript DOM: Mathf.max() Unity javascript: Mathf.Max() for no explainable reason; I spent a half hour trying to figure out why the function onTriggerEnter() wasn’t calling)

4) No way to directly access a script attached to an object. You have to call a function in order to get to it. (No, really. someObject.GetComponent(ScriptName) oh, and this is “this script” not “this object,” you want the object the script is attached to? gameObject)
(Bonus points: of what type object does someObject.GetComponent(ScriptName) return?)

5) No Array.IndexOf() function. Secondarily, Array.Remove(obj) does not appear to work, nor does not appear in the Unity3D scripting reference, but DOES appear in Monodevelop’s code hinting. WTF?

6) Monodevelop is a piece of shit. It can’t code-hint properly half the time (it knows what GameObject is, but not gameObject but it does know what type of object gameObject is! Not to mention half the time not being able to code hint my own variables. I have yet to figure out what the trigger conditions are).
(Yes, I realize that Monodevelop is actually a 3rd party program, but it comes with Unity’s installer and is automatically set as the default code editor)

7) Script defined public variables don’t update when you change the code file! That is, if you have an object already spawned (by hand) and it has public variables, those variables will not update when you change the script: the unity interface for accessing those variables has precedence!
(I realize why, due to the need to define some of them in the interface, and saving the file would break that definition, but it’s a real pain when it’s an int! If it wasn’t changed in the interface, when it changes in the script, it should update, automatically.)

8) Asset creation. F*ck 3D modeling. I was terrible at it in college and now I get to do more of it.

Followed by…
9) UV unwrapping.

and…
10) Texture creation.

 
Flag Post

I must agree with most of the complaints based on Monodevelop.

 
Flag Post

I use MonoDevelop for C# and find it works reasonably well. It’s not as good as Unity for Java, but it’s a little better than FlashDevelop for haXe (which I’m still pretty happy with).

My experience with 3D modeling consists of the following:
• Someone else doing it in Maya.
• Someone else importing it to Unity.
• Applying transformations and running animations via code.

I don’t have many complaints, but then I don’t have that much experience (~1.5 semesters, for the record).

 
Flag Post

The 3D modeling gets to me, but what can we do? It’s a 3D program. Don’t you have to 3D model for Flash 3D?

 
Flag Post
Originally posted by player_03:

I use MonoDevelop for C# and find it works reasonably well.

That’s because they implemented automatic code indentation for C#.

Originally posted by lSWATLLAMA:

The 3D modeling gets to me, but what can we do? It’s a 3D program. Don’t you have to 3D model for Flash 3D?

Do I use Flash 3D? No.
Can I make simple 2D graphical elements as I need a placeholder (such as a blank square, circle, etc. with or without text), and do it quickly? In Flash: Yes. In Unity: No.

 
Flag Post

Yeah, I used Unity but stopped since I can’t 3D model and have no friends that could.

Before someone says “Cause you have no friends”, that’s not true. I’ve got the rabbits outside that keep the grass from overrunning my rasberries. And the squirrels that pee on me.

 
Flag Post

Post by Draco18s

  1. because they’re idiots and don’t understand that the supported languages all use the same style, excepting C# and it’s UpperCaseOnEverythingStandard
  2. what the fuck. the bottom-left thing you can get used to (potentially because some math-major had a bright idea and went against something that’s been used since… well, GUIs), but the others?
  3. see end of #1
  4. … ’kay. not using unity.
  5. i don’t think AS2 has indexOf either, and some JS in older browsers lack indexOf
  6. commonly seen in editors maintained by ulrtacrappy/lazy programmers
  7. see #6
  8. eh. what can you do? you don’t have it easy for placeholders like with flash, but main content in either will require 3D models. there’s never anything not-tedious about them; most of the time not difficult (since 3D is what we deal with just by walking across a room), but very tedious and time consuming and repetitive and annoying
  9. [This space was intentionally left blank.]
  10. this is easy in minecraft! cubes. cubes everywhere!
 
Flag Post

i don’t think AS2 has indexOf either, and some JS in older browsers lack indexOf

I can live without indexOf(), it’s just annoying.

but main content in either will require 3D models

Yeah, ones I don’t have to make. :P That’s why my boss hired a 3D animator.

 
Flag Post

11) Class constructors all have the same name. Start(). Which means that a subclass automatically overrides a base class’s constructor, necessitating a super.Start() call. Ditto for any other “common” function name (Update(), OnMouseDown(), etc.)

 
Flag Post

Use UDK.

 
Flag Post
Originally posted by GameBuilder15:

Use UDK.

Or I could, you know, not seeing as I have no choice in the matter.

12) When opening a script from Unity into MonoDevelop, MonoDevelop acts as if it was closed and reopened (briefly flashing the welcome screen before re-displaying previously open documents), which has the effect of nuking the undo stack.

13) No ability to create a dynamic array of basic types (float, int, etc.) and have them function in anything resembling expected function.
(myArray[index] returns an object of type Object, which does not respond to the as keyword, nor can I parseFloat() or ParseInt() on it)

Edit: no, I can. I had to really dig around and locate the List type (equivalent to AS3’s Vector). Although for some reason Micro$oft didn’t give it a length property. They gave it a Count property. 9..9

 
Flag Post

My school has organized their own Ludum Dare Jam using Unity and will start in September. Problem?

 
Flag Post
Originally posted by DraygonRida:

My school has organized their own Ludum Dare Jam using Unity and will start in September. Problem?

Have them do a warmup exercise over the summer. Unity Free is…free, and having them smash stuff together to learn the language and the interface will prepare them for the Jam so they have a good idea of the kinds of things they know they can do, which will enable them to decide if some functionality will take too long to implement.

I’d say something like “make a tower defense.” There’s parts of a nice tutorial here. The guy is still working on making it, but he does have a rather ingenious solution to the targeting problem (i.e. how does the tower know what’s in range?)

 
Flag Post
Originally posted by Draco18s:

11) Class constructors all have the same name. Start(). Which means that a subclass automatically overrides a base class’s constructor, necessitating a super.Start() call. Ditto for any other “common” function name (Update(), OnMouseDown(), etc.)

Actually, that’s true only for MonoBehaviour.

 
Flag Post
Originally posted by Attila0413:
Originally posted by Draco18s:

11) Class constructors all have the same name. Start(). Which means that a subclass automatically overrides a base class’s constructor, necessitating a super.Start() call. Ditto for any other “common” function name (Update(), OnMouseDown(), etc.)

Actually, that’s true only for MonoBehaviour.

And because documentation is a bitch to locate alternative methods…
What else can you extend a class from in order to be able to attach the script to a game object and end up with desired behavior?

 
Flag Post
Originally posted by Draco18s:
Originally posted by Attila0413:
Originally posted by Draco18s:

11) Class constructors all have the same name. Start(). Which means that a subclass automatically overrides a base class’s constructor, necessitating a super.Start() call. Ditto for any other “common” function name (Update(), OnMouseDown(), etc.)

Actually, that’s true only for MonoBehaviour.

And because documentation is a bitch to locate alternative methods…
What else can you extend a class from in order to be able to attach the script to a game object and end up with desired behavior?

Since you cannot extend Component or Behaviour, I think MonoBehaviour is the only choice currently.

 
Flag Post
Originally posted by Attila0413:

Since you cannot extend Component or Behaviour, I think MonoBehaviour is the only choice currently.

So in other words, my statement is still correct. :D

 
Flag Post
Originally posted by Draco18s:
Originally posted by Attila0413:

Since you cannot extend Component or Behaviour, I think MonoBehaviour is the only choice currently.

So in other words, my statement is still correct. :D

You said class, not script lol

 
Flag Post

Reason #12 (I think that’s what we’re on)
No easy way to make dynamic text without using OnGUI(). Because OnGUI objects are sized in pixels and do not scale between platforms with different screen resolutions (say…the iPad 2 vs. the iPad 3).

TextMesh does exist, but it’s a fucking pain in the arse to get it to the proper size and not look either block, blurred, or aliased to hell and back because Unity forces a bi-linear filter on the texture! And then the default size is (about) four screen-pixels per one texture-pixel! ARGH!

And that’s before even trying to deal with building the project. Targeting the wrong platform? Whoops, “YourFont.TTF cannot be supported as a dynamic font” (which means you can no longer bold or italicize it in the font settings. Not that you could do mixed formatting anyway!).

(From This page )
Hints

When entering text into the Text property, you can create a line break by holding Alt and pressing Return.

Blatant lie.

Oh, and forget trying to swap from one font to another. You can’t without deleting the game object holding the TextMesh component. It doesn’t update it’s character sprite mapping!

 
Flag Post
Originally posted by Draco18s:

9) UV unwrapping.

The fun never ends with UVMapping.
 
Flag Post
Originally posted by Draco18s:
The guy is still working on making it, but he does have a rather ingenious solution to the targeting problem (i.e. how does the tower know what’s in range?)

Ingenious? Is it good or bad? I claim bad, as he retargets at anything that’s entered a sphere around a turret, regardless of any other conditions, and if a teaser enemy enters that range and leaves, the turret stops firing completely.

 
Flag Post
Originally posted by vesperbot:
Originally posted by Draco18s:
The guy is still working on making it, but he does have a rather ingenious solution to the targeting problem (i.e. how does the tower know what’s in range?)

Ingenious? Is it good or bad? I claim bad, as he retargets at anything that’s entered a sphere around a turret, regardless of any other conditions, and if a teaser enemy enters that range and leaves, the turret stops firing completely.

Well, his script isn’t complex, but easily adaptable. My point was that it avoids needing to constantly check an array of objects for their distance from the tower, and instead uses the event system. Sure, once an object throws the event, you need to decide if it’s an object worth tracking or not, but that’s easily doable. Hell, I took his design and was able to keep track of ALL enemies in range and then wrote a function that determines which one to aim and fire at.

 
Flag Post

In this case, yes, he used that tool the right way.

Actually, I did something like this too (2D tho), but thanks to my fixed path system I have even easier time to maintain target lists, while there is nothing yet done about retargetting, but it will be very easy to add. I’ve run my path and placed marks over it signalling a tower that a monster enters or leaves range, so it’ll start/stop firing.

 
Flag Post

3) because it’s .net standard?
4) how could you possibly access a component otherwise? and why would the this reference point to anything but the class instance? how could it? that’s just the way it is in any language.
5) there can’t be an Array.remove method, because arrays in mono/.net have a fixed size. and that’s good, because arrays have very little overhead because of that. that’s why there is this thing called list.
8) then you should use this engine where you just have to wish your creations into existence.
11) Start is not the constructor!!! and if you override a method, of course you have to call your parents method yourself if you want to. the compiler can’t guess what you want, you have to tell him.
13) nice job, you found the list type. i thought everyone using mono/.net would know it.

i wonder what kind of developer you are… not a software developer for sure, you obviously don’t even know the basics of oop.

 
Flag Post
Originally posted by jheiling:

3) because it’s .net standard?

Meh. .NET isn’t a standard. It can’t be, if it’s the only language using it.

4) how could you possibly access a component otherwise? and why would the this reference point to anything but the class instance? how could it? that’s just the way it is in any language.

public class BulletObject extends GameObject ?

OH WAIT, I CAN’T. GameObject is STATICALLY TYPED.

5) there can’t be an Array.remove method, because arrays in mono/.net have a fixed size. and that’s good, because arrays have very little overhead because of that. that’s why there is this thing called list.

Addressed only half the issue. What about indexOf()?

8) then you should use this engine where you just have to wish your creations into existence.

HA HA.

11) Start is not the constructor!!! and if you override a method, of course you have to call your parents method yourself if you want to. the compiler can’t guess what you want, you have to tell him.

function Start() does not say that it is an override. The override is implied and not noted in the documentation. Whoops.

13) nice job, you found the list type. i thought everyone using mono/.net would know it.

Because everyone who starts on a new language instantly becomes aware of all of its little intricacies. (Also read as, “You have assumed that I have programmed in .NET before. Congratulations on making an ass of yourself.”)

i wonder what kind of developer you are… not a software developer for sure, you obviously don’t even know the basics of oop.

See above comment in parenthesis. Also, you appear to have suddenly forgotten where your Shift Key is.