unity

Unity nullなのにnull判定に引っかからなくて躓いた

私がやりたかったこと

inspectorから受け取った画像リストからアニメーションを作成。 もし、リスト内に未設定項目(null)があった場合には、それを除外した配列を再生成し、関数に引き渡すようにするという流れです。

nullを除外した配列を再生成する方法については、以下の記事でもまとめたような方法をとりたいと考えています。 しかしながら、nullの判定が行えず、除外できずにいました。 例えば、以下のような形です。 

public Sprite[] images = new Sprite[5];
foreach(var image in images ?? Enumerable.Empty<Sprite>()){
    if(image != null){
        Debug.Log(image);
    }
}

この場合、images配列変数にセットされた画像名だけが出力され、nullは出力されないはずでした。 しかし、nullという文字が表示されます。 今の私の心境は、まるでメイちゃんです。

nullだけど、nullじゃなかった!!

判定部分を以下のように文字列にすれば、判定を行えますが、少しブサイクですね…。

if(image.ToString() != "null"){

解決法

こちらの記事が参考になりました。 http://nobollel-tech.hatenablog.com/entry/unity-fake-null 上記の記事で紹介されていた関数を利用することで解決しました。 引数部分は少し変更を加えています。

public static bool IsNull<T>(this T obj) where T : class {
    var unityObj = obj as UnityEngine.Object;
    if (!object.ReferenceEquals(unityObj, null)) {
        return unityObj == null;
    } else {
        return obj == null;
    }
}

また、別記事で紹介していたnullを除外した配列を再生成する関数は、以下のように変更し、利用しています。

public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T> source)
where T : class 
{
    if (source == null) 
    { 
        return Enumerable.Empty<T>(); 
    } 
    return source.Where(x => !x.IsNull());
}