プログラミング初心者です。unityとC#を使ってブラックジャックゲームを作るサイトを参考に開発しているのですが、サイトと全く同じコードでもなぜかDeck.CSのforeach文でNull?エラーが出てしまいます。
foreach (int i in cards)//cardsの中の要素それぞれについて { yield return i; //要素を戻り値に返します }
unityのバージョンは「2020.3.23f1」です。必要な情報が載せられているかわかりませんが、どなたかなぜエラーがでているのか教えてくださるとありがたいです。
error
1NullReferenceException: Object reference not set to an instance of an object 2Deck+<GetCards>d__1.MoveNext () (at Assets/Scripts/Deck.cs:14) 3DeckView.ShowCards () (at Assets/Scripts/DeckView.cs:24) 4DeckView.Start () (at Assets/Scripts/DeckView.cs:17)
Deck.cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Deck : MonoBehaviour 6{ 7 8 List<int> cards; 9 10 11 12 public IEnumerable<int> GetCards() //戻り値に列挙可能なリストを持つメソッド 13 { 14 foreach (int i in cards)//cardsの中の要素それぞれについて 15 { 16 yield return i; 17 //要素を戻り値に返します 18 } 19 } 20 21 22 23 public void Shuffle() // デッキをシャッフルする 24 { 25 26 if (cards == null) 27 { 28 cards = new List<int>(); 29 } 30 else 31 { 32 cards.Clear(); 33 } 34 35 for(int i = 0; i < 75; i++) 36 { 37 cards.Add(i); 38 } 39 40 41 42 // 整数 n の初期値はデッキの枚数 43 int n = cards.Count; 44 45 // nが1より小さくなるまで繰り返す 46 while (n > 1) 47 { 48 n--; 49 50 // kは 0 ~ n+1 の間のランダムな値 51 int k = UnityEngine.Random.Range(0, n + 1); 52 53 // k番目のカードをtempに代入 54 int temp = cards[k]; 55 cards[k] = cards[n]; 56 cards[n] = temp; 57 } 58 59 } 60 61 // Start is called before the first frame update 62 void Start() 63 { 64 Shuffle(); 65 } 66 67}
DeckView.cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[RequireComponent(typeof(Deck))] 6public class DeckView : MonoBehaviour 7{ 8 Deck deck; 9 10 public Vector3 start; 11 public float cardOffset; 12 public GameObject cardPrefab; 13 14 void Start() 15 { 16 deck = GetComponent<Deck>();//Deck.csの取得 17 ShowCards();//下記メソッドの実行 18 } 19 20 void ShowCards()//メソッド本体 21 { 22 int cardCount = 0;//内部で使う値cardCountの宣言 23 24 foreach (int i in deck.GetCards()) 25 { 26 float co = cardOffset * cardCount; //オフセット幅の計算 27 28 GameObject cardCopy = (GameObject)Instantiate(cardPrefab); 29 //カードプレファブのコピー 30 Vector3 temp = start + new Vector3(co, 0f); 31 //tempというオフセットした位置の計算 32 cardCopy.transform.position = temp; 33 //現在の位置にtempを代入 34 35 CardModel cardModel = cardCopy.GetComponent<CardModel>(); 36 // //コピーしたカードプレファブのCardModelクラスを取得 37 cardModel.cardIndex = i; 38 // //インデックスにiを代入 39 cardModel.ToggleFace(true); 40 // //表面をレンダー(カードゲームを作りたい第2回目で作成したスクリプトを使用) 41 cardCount++;//cardCountをインクリメント 42 } 43 } 44 45}
補足:Cardsリストのシャッフル処理はunity上のdebug表示でインスペクターをみたところうまくいっており、問題はforeachの時点でcardsの中身がNullになっていることだとわかりました。しかし、なぜforeachの時点でNullなのか、調べても自分では理解できませんでした。
回答2件
あなたの回答
tips
プレビュー