良く理解せずにコピペで使ってたので返り値が null になって困った。
ここを見てちゃんと理解していく。
問題のコード
1 |
GameObject go = Resources.Load("b001") as GameObject; //nullが返る |
最初から
まず最初に Resources.Load() は Object を返す。
また第2引数で取得するファイルの種類を指定できる。
同名のSpriteとMaterialを入れておくとこうなる。
1 2 3 4 5 6 |
Object o0 = Resources.Load("b001"); Object o1 = Resources.Load("b001",typeof(Sprite)); Object o2 = Resources.Load("b001",typeof(Material)); Debug.Log(o0);//b001 (UnityEngine.Texture2D) Debug.Log(o1);//b001 (UnityEngine.Sprite) Debug.Log(o2);//b001 (UnityEngine.Material) |
次にように型変換を行う。
1 2 3 4 5 6 7 8 |
Texture2D o0 = Resources.Load("b001") as Texture2D; Sprite o1 = Resources.Load("b001",typeof(Sprite)) as Sprite; Material o2 = Resources.Load("b001",typeof(Material)) as Material; Sprite o3 = Resources.Load("b001") as Sprite; Debug.Log(o0);//b001 (UnityEngine.Texture2D) Debug.Log(o1);//b001 (UnityEngine.Sprite) Debug.Log(o2);//b001 (UnityEngine.Material) Debug.Log(o3);//Null |
なんでスプライトの基本型が Texture2D なのかはわからないけど、取ってきたオブジェクトと変換後の型が異なると Null になる。
as演算子は変換できないときにnullを返す。
最初のコードはこのせいでnullになっていた。
ちゃんと第2引数と型変換を正しくすれば問題ない。
キャスト演算子なら例外を吐くので、ミスを見逃さないためにはコッチのほうが良い気がする。多分デメリットは処理速度だけだと思う。
ただ Resources.Load() でキャストしている例は見たことがないので他の理由もあるかもしれない。