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)
I'd say remove it.
I think the intention is primarily to help new developers make sense of what's gone wrong with their scripts, but my feeling is that this is hand-holding them too excessively. For the sake of consistency I'd rather teach a beginner about how to handle a NRE than how to handle both this special exception and a NRE.
Moreover, the wording of the exception seems unhelpful or misleading. That is, if I as a neophyte Unity user see that message in the console, how am I to take it? The "You probably need to add a..." portion seems clear enough that it might be a compelling option for a beginner to pursue, but there's no way of knowing without understanding the context of the exception whether that is the right course of action. In other words, I feel like the message might encourage "try this fix without understanding the problem" behaviour.