今回はシャッフルしたカードを表示するプログラムを下記のチュートリアルを参考にしながら書きます。シャッフル自体は前回の投稿で出来ていますので、ただ表示させるだけです。スクリプトの完成品は下記のYOUTUBEテキスト欄からアセットにてダウンロードできます。それでは以下のチュートリアル動画の補足解説です。
やり方としては、前々回作成したカードをプレファブ化して、それをカード枚数分instantiateしてあげます。そして、オフセット分横にずらして表示したのちに、前回作成したカードのリストを渡してあげて、表面をレンダーさせるという流れになるようです。
カードのリストの取得ですが、前回作成したスクリプトではリスト自体にはpublicがついていないので外部からアクセスできません。よってカードの配列をリストとして取得するpublicメソッドGetCardsを追記します。
public IEnumerable<int> GetCards() //戻り値に列挙可能なリストを持つメソッド { foreach (int i in cards) //cardsの中の要素それぞれについて { yield return i; //要素を戻り値に返します
これををDeckクラスに書き加えておくことで、これから作るDeckView.csからリストにアクセスできるようにしています。
DeckView.csには、以下のように記述します。
Deck deck; //Deckクラスを参照します public Vector3 start; //最初のカードの位置 public float cardOffset; //カードをずらす幅 public GameObject cardPrefab; //instantiateするプレファブ private void Start() { deck = GetComponent<Deck>(); //Deck.csの取得 ShowCards(); //下記メソッドの実行 } void ShowCards() //メソッド本体 { int cardCount = 0; //内部で使う値cardCountの宣言 foreach(int i in deck.GetCards()) { float co = cardOffset * cardCount; //オフセット幅の計算 GameObject cardCopy = (GameObject)Instantiate(cardPrefab); //カードプレファブのコピー Vector3 temp = start + new Vector3(co, 0f); //tempというオフセットした位置の計算 cardCopy.transform.position = temp; //現在の位置にtempを代入 cardCount++; //cardCountをインクリメント } }
そして、publicになっている初期位置のvector3のx成分に-4をインスペクター上で代入し、offset値に0.2を代入します。そして、cardをresourceフォルダにヒエラルキービューからドラッグアンドドロップし、プレファブ化した後、そのプレファブをインスペクター上のgameobjectの所にドラッグアンドドロップします。
そして実行すると、カードが裏面のまま52枚横にダーッと重なって並ぶはずです。
次に、カードインデックスを渡してあげるスクリプトと、表面をレンダーするスクリプトをDeckView.csに足してあげます。
CardModel cardModel = cardCopy.GetComponent<CardModel>(); //コピーしたカードプレファブのCardModelクラスを取得 cardModel.cardIndex = i; //インデックスにiを代入 cardModel.ToggleFace(true); //表面をレンダー(カードゲームを作りたい第2回目で作成したスクリプトを使用)
シャッフルしたカードが表示されました。これで、カードのシャッフルと、カードの表示の仕方を理解することが出来ました。これを応用して(もしかしたらそのまま使用して(笑))カードゲームを作っていきたいと思います。