I often check in Start()-method, if all needed references are set in inspector. So i wrote a utility method, for this like this:
public static void WarnIfNull(object o, string name) {
if (o == null) {
Debug.LogWarning(name + " is NULL");
...
so i can use it in component init code like this:
public class MyComponent : MonoBehavior {
public AudioClip sound;
void Start() {
MyLogUtils.WarnIfNull(sound, "sound");
...
Nothing special, interesting so far… But it does not work. Assuming i forgot to assign reference in inspector. If i null-check inside of MyComponent.Start(), null check works correct. But if doing exact same null-check inside of MyLogUtils.WarnIfNull(), null check is FALSE. I can not explain this, it is really weird.
So i tryied to debug it, if object is not null, then what is it? (it was never assigned). I can cast it to AudioClip like this
if (o is AudioClip) {
AudioClip a = (AudioClip) o; // this works
}
but if i call any method/property from this object like this:
var a_name = a.name;
a_name.ToString();
i am getting UnassignedReferenceException.
I know, it sounds strange, that null-check of same object in call-stack behaves not same. But is looks like this. I do not really understand what is the reason for that. Docs for UnassignedReferenceException somehow do not explain it.
So my missing-reference method looks like this now:
public static void WarnIfNull(object o, string name) {
bool unassigned = false;
if (o is AudioClip) {
try {
AudioClip a = (AudioClip) o;
var a_name = a.name;
a_name.ToString();
} catch (UnassignedReferenceException e) {
unassigned = true;
}
}
if (o == null || unassigned) {
Warn(name + " is NULL (unassigned in inspector, but somehow can be not null)");
}
}
Any suggestions explanations are welcome. So, my question:
Why the same reference is null in one methode and not null in another. I just pass it by reference but, null-check result ist different. Is this some special UnityEditor stuff i should know?