カードゲームをunityとc#で作りたい:カードシャッフルを表示編(4.5)

Githubソースコード公開&まとめ

今回はシャッフルしたカードを表示するプログラムを下記のチュートリアルを参考にしながら書きます。シャッフル自体は前回の投稿で出来ていますので、ただ表示させるだけです。スクリプトの完成品は下記の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回目で作成したスクリプトを使用)

シャッフルしたカードが表示されました。これで、カードのシャッフルと、カードの表示の仕方を理解することが出来ました。これを応用して(もしかしたらそのまま使用して(笑))カードゲームを作っていきたいと思います。

おすすめの記事