チーム開発で学ぶ!WinFormカードゲーム基盤構築チュートリアル(Step 10: Unity での再現例(応用編))

次のコースの続きになります

担当:メンバーD

このステップでは、WinForm で学んだカードゲーム基盤の設計思想を Unity に展開します。
Unity では、UI 部品として CanvasImageText などを利用します。
以下のコード例は、Unity 用に各クラス(Suit, Card, Deck, CardDisplay, GameController)を実装する例です。
各クラスには、XML ドキュメントコメントを用いて、各プロパティやメソッドの説明を記述しています。


1. Suit 列挙型 (Suit.cs)

/// <summary>
/// Unity 用のカードのスート(種類)を表す列挙型です。
/// </summary>
public enum Suit
{
    /// <summary>ハート</summary>
    Hearts,
    /// <summary>ダイヤ</summary>
    Diamonds,
    /// <summary>クラブ</summary>
    Clubs,
    /// <summary>スペード</summary>
    Spades
}

【解説】

  • WinForm の例では文字列でスートを管理していましたが、Unity では列挙型を使うことで型安全性とコードの可読性が向上します。

2. Card クラス (Card.cs)

using UnityEngine;

/// <summary>
/// Unity で使用する1枚のカードを表すクラスです。
/// カードはスート、数値、そして画像(Sprite)を保持します。
/// </summary>
public class Card
{
    /// <summary>
    /// カードのスートを取得します。
    /// </summary>
    public Suit Suit { get; private set; }

    /// <summary>
    /// カードの数値(1~13)を取得します。
    /// </summary>
    public int Value { get; private set; }

    /// <summary>
    /// カードの画像(Sprite)を取得します。
    /// </summary>
    public Sprite CardImage { get; private set; }

    /// <summary>
    /// 新しい Card インスタンスを初期化します。
    /// </summary>
    /// <param name="suit">カードのスート。</param>
    /// <param name="value">カードの数値。</param>
    /// <param name="cardImage">カードの画像(Sprite)。</param>
    public Card(Suit suit, int value, Sprite cardImage)
    {
        Suit = suit;
        Value = value;
        CardImage = cardImage;
    }

    /// <summary>
    /// カードの情報を文字列で返します。
    /// </summary>
    /// <returns>例:"Hearts の 5"</returns>
    public override string ToString()
    {
        return $"{Suit} の {Value}";
    }
}

【解説】

  • Unity では、画像は Sprite として管理します。
  • WinForm の設計思想を継承し、カードの基本情報を管理するシンプルなクラスとなっています。

3. Deck クラス (Deck.cs)

using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Unity でカードのデッキを管理するクラスです。
/// このクラスはカードの生成、シャッフル、カードのドロー機能を提供します。
/// </summary>
public class Deck
{
    private List<Card> cards;

    /// <summary>
    /// 新しい Deck インスタンスを初期化し、全カード(4スート × 13枚)を生成します。
    /// 画像は、Resources フォルダ内の "Images" サブフォルダに配置する必要があります。
    /// </summary>
    public Deck()
    {
        cards = new List<Card>();

        foreach (Suit suit in System.Enum.GetValues(typeof(Suit)))
        {
            for (int i = 1; i <= 13; i++)
            {
                // 画像ファイル名の例: "hearts_1", "diamonds_5" など
                string imagePath = $"Images/{suit.ToString().ToLower()}_{i}";
                Sprite cardImage = Resources.Load<Sprite>(imagePath);
                cards.Add(new Card(suit, i, cardImage));
            }
        }
    }

    /// <summary>
    /// Fisher–Yates アルゴリズムを使用してデッキのカードをシャッフルします。
    /// </summary>
    public void Shuffle()
    {
        for (int i = cards.Count - 1; i > 0; i--)
        {
            int j = Random.Range(0, i + 1);
            Card temp = cards[i];
            cards[i] = cards[j];
            cards[j] = temp;
        }
    }

    /// <summary>
    /// デッキから1枚カードを引き、そのカードをデッキから削除して返します。
    /// </summary>
    /// <returns>引かれたカード。デッキにカードがない場合は null を返します。</returns>
    public Card DrawCard()
    {
        if (cards.Count == 0)
            return null;

        Card card = cards[0];
        cards.RemoveAt(0);
        return card;
    }

    /// <summary>
    /// 現在のデッキに残っているカードの枚数を取得します。
    /// </summary>
    /// <returns>カードの枚数。</returns>
    public int CardsRemaining()
    {
        return cards.Count;
    }
}

【解説】

  • Unity では、画像の読み込みに Resources.Load<Sprite>() を使用します。
  • デッキ生成時に、Resources フォルダ内の画像ファイル名と一致するように配置してください。

4. CardDisplay クラス (CardDisplay.cs)

using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// カードの画像と情報を UI に表示するためのスクリプトです。
/// Canvas 上の Image と Text コンポーネントを利用してカード情報を表示します。
/// </summary>
public class CardDisplay : MonoBehaviour
{
    /// <summary>
    /// 表示するカードの画像を格納する Image コンポーネント。
    /// </summary>
    public Image cardImage;

    /// <summary>
    /// カードの情報(スートと数値)を表示する Text コンポーネント。
    /// </summary>
    public Text cardText;

    /// <summary>
    /// 指定されたカードの情報を UI に反映させます。
    /// </summary>
    /// <param name="card">表示するカード。null の場合は表示をクリアします。</param>
    public void SetCard(Card card)
    {
        if (card != null)
        {
            cardImage.sprite = card.CardImage;
            cardText.text = card.ToString();
        }
        else
        {
            cardImage.sprite = null;
            cardText.text = "";
        }
    }
}

【解説】

  • CardDisplay は Unity の UI コンポーネント(Image, Text)を利用して、カード情報を画面上に表示します。

5. GameController クラス (GameController.cs)

using UnityEngine;

/// <summary>
/// ゲームの進行を管理するためのコントローラーです。
/// このクラスは、Deck からカードを引き、CardDisplay を使って画面にカード情報を表示します。
/// </summary>
public class GameController : MonoBehaviour
{
    /// <summary>
    /// カード表示用の CardDisplay コンポーネントを参照します。
    /// </summary>
    public CardDisplay cardDisplay;

    private Deck deck;

    /// <summary>
    /// ゲーム開始時に呼ばれる Unity の Start メソッドです。
    /// </summary>
    void Start()
    {
        deck = new Deck();
        deck.Shuffle();
        DrawNextCard();
    }

    /// <summary>
    /// 次のカードをデッキから引き、CardDisplay にセットして表示します。
    /// </summary>
    public void DrawNextCard()
    {
        Card card = deck.DrawCard();
        cardDisplay.SetCard(card);
    }
}

【解説】

  • GameController は Unity のシーン上に配置され、ゲームの基本的な流れ(カードのドローと表示)を管理します。
  • CardDisplay コンポーネントと連携し、ユーザーにカード情報を提示します。

補足

  • プロジェクト構成
    Unity 用のコードは、通常 Unity プロジェクト内のスクリプトフォルダに配置し、Resources フォルダ内にカード画像(例:"hearts_1.png", “diamonds_5.png" など)を置いてください。
  • 管理方法
    Unity 用コード例は、必要に応じた別資料または専用ブランチ(例:feature/unity-example)で管理するとよいでしょう。

まとめ

この Step 10 では、WinForm で学んだ設計思想を Unity に展開するための各クラス(Suit, Card, Deck, CardDisplay, GameController)のコード例を示しました。
これにより、Unity 環境でもカードゲーム基盤を再現することが可能となり、さらに応用的な開発にも挑戦できます。

担当メンバーD は、これらのコード例をベースに Unity プロジェクトを構築し、動作確認と必要な調整を行ってください。また、チーム内でこの応用編の内容を共有し、他メンバーの参考にもなるようにドキュメントを整備してください。