Hi,
We have a feature that if you do:
m_MyGUiLayer = GetComponent<GUILayer>();
if it turns out there was no GUILayer component, if you later use m_MyGUILayer, instead of getting a NullReferenceException (what you might expect as a c# dev), you get:
MissingComponentException: There is no 'GUILayer' attached to the "Directional Light" game object, but a script is trying to access it.
You probably need to add a GUILayer to the game object "Directional Light". Or your script needs to check if the component is attached before using it.
NewBehaviourScript.Start () (at Assets/NewBehaviourScript.cs:10)
We are able to give a much better error message that contains the type of the component that was requested, the gameobject name of the gameobject that apparently didn't have the component, and it also has "context" of that gameobject, so if you click this message in the console window, the editor will actually "ping" the gameobject in question. We do this only in the editor.
Awesome.
This feature comes at a (editor-only) cost of a c# allocation for that error message string (as well as the fake-null-object that holds the string). Every week, we get a bugreport about "GetComponent() is allocating, this is madness!" from folks that (probably) don't realise that this allocation only happens in the editor.
We're debating wether or not this error message provides enough value compared to cost it brings. (costs: apparently users getting confused about it a lot, us having to deal with a flow of bugreports about it, editor-allocation patterns being different from the player).
Options on the table are:
- Drop the feature, and make GetCompoment() return a normal null instead.
- add GetComponent(bool niceErrorMessageWhenNotFound = true), so that if you care about not having the allocation in the editor, you can tell us to not mak eit.
- not do anything about it.
- fake it, and internally mark this allocation as editor-only, and then have the profiler actually hide the allocation.
I'd love to hear from users if they have ever found the MissingComponentException to be especially helpful, and in which scenarios that was, and how one's workflow would be negatively affected by no longer having this detailed exception.
Thanks, Lucas (you can reply here, or on twitter @lucasmeijer)
Maybe if the allocation was clearly stated and explained here http://docs.unity3d.com/ScriptReference/Component.GetComponent.html people would complian less? At the very least you'd have an easy/quick way to explain them.
I don't see a real benefit in having the same memory allocation in editor VS build, so just faking it in the profiler would be enough IMO.
On the other hand I second @crygon, having the exception raised when you try to get it would be great.
Maybe couple it with a TryGetComponent (out T comp) for the cases where we want to add and init ourselves?