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"){
解決法
こちらの記事が参考になりました。
上記の記事で紹介されていた関数を利用することで解決しました。
引数部分は少し変更を加えています。
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());
}