チーム開発で学ぶ!WinFormカードゲーム基盤構築チュートリアル(Step 10: Unity での再現例(応用編))
次のコースの続きになります
担当:メンバーD
このステップでは、WinForm で学んだカードゲーム基盤の設計思想を Unity に展開します。
Unity では、UI 部品として Canvas、Image、Text などを利用します。
以下のコード例は、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 プロジェクトを構築し、動作確認と必要な調整を行ってください。また、チーム内でこの応用編の内容を共有し、他メンバーの参考にもなるようにドキュメントを整備してください。
ディスカッション
コメント一覧
まだ、コメントがありません