カードバトルは、戦略性と運のバランスが重要です。
カードデータとターン制を実装すれば、基本的なゲームが作れます。
この記事では、実装方法を詳しく解説します。
✨ この記事でわかること
- カードデータ構造の実装
- デッキシステムの実装
- ターン制システムの実装
- 効果処理システムの実装
- 実装例とコード

カードバトルは、カードデータ構造から始めましょう。カードの基本情報を定義すれば、システムが構築できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
TCGの基礎ロジックとは?

TCGバトルの基礎ロジックとは、カードゲームを成立させるための共通ルールと構造の組み合わせを指します。
カードの種類や世界観が変わっても、この土台となる考え方はほとんど変わりません。
多くのTCGは、次のような仕組みを前提に設計されています。
- カードは「処理」ではなく「情報のまとまり」として扱われる
- カードはデッキ・手札・捨て札といった状態を行き来する
- ゲームはターンとフェーズによって進行が管理される
- カードの効果は、種類ごとに共通のルールで処理される
これらは特定のゲーム固有のルールではなく、ほぼすべてのTCGに共通する最低限の構造です。
この基礎ロジックを押さえておくことで、新しいカードやルールを追加しても、全体の仕組みを崩さずに拡張できます。

本記事では、こうしたTCG共通の基礎ロジックを分解し、各要素がどのような役割を持っているのかを順番に解説していきます。
カードデータ構造の実装

カードデータ構造は、TCGバトルの土台となる重要な要素です。
ここで「カード1枚をどのような情報のまとまりとして扱うか」を決めておくことで、後からカードの種類や効果を増やしても、全体の仕組みを崩さずに拡張できます。
このセクションでは、カードを処理の集合ではなく、情報の集合(データ)として定義する基本的な考え方をもとに、カードデータ構造を実装します。
カードデータ構造
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using UnityEngine; using System.Collections.Generic; // カードの種類を表す enum // この情報は、カードの使い方や扱い方を分けるために使われます public enum CardType { Creature, // 場に出て戦うカード Spell, // 使ったら効果を発動して消えるカード Equipment // キャラクターに装備するカード } [System.Serializable] // カード1枚分の「情報」をまとめたクラス // ここには処理を書かず、データだけを持たせます public class CardData { public string cardID; // カードを一意に識別するID public string cardName; // 表示名 public string description; // 効果説明文 public CardType type; // カードの種類 public int cost; // 使用コスト public int attack; // 攻撃力 public int defense; // 防御力 // カードが持つ効果の一覧 // 効果の内容は、後で共通処理として実行されます public List<CardEffect> effects = new List<CardEffect>(); } [System.Serializable] // カード効果を表すクラス // 効果の種類と数値だけを持たせています public class CardEffect { public string effectType; // 効果の種類(例:Damage, Heal, Draw) public int value; // 効果の強さや数値 } // すべてのカードデータをまとめて管理するクラス public class CardDatabase : MonoBehaviour { // ゲーム内で使用する全カードの一覧 public List<CardData> allCards = new List<CardData>(); // IDを指定してカードデータを取得する public CardData GetCard(string cardID) { return allCards.Find(c => c.cardID == cardID); } } |
このようにカードをデータとして定義しておくことで、カードごとに個別の処理を書く必要がなくなります。
効果の実行やターン管理は、別のシステムから共通ルールとして扱えるようになります。
カードバトルの基礎ロジックでは、「カードは情報を持つだけで、動作は別の仕組みに任せる」という考え方が重要です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
デッキシステムの実装

デッキシステムは、カードバトルにおけるカードの流れ(状態遷移)を管理する仕組みです。
カードは常に同じ場所に存在するのではなく、デッキ・手札・捨て札といった状態を行き来しながらゲームが進行します。
この「どこから引き、どこへ移動するか」というルールは、ほぼすべてのTCGに共通する基礎ロジックです。
デッキ管理システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
using System.Collections.Generic; using UnityEngine; // デッキ全体を管理するクラス // カードの移動先(デッキ・手札・捨て札)を明確に分けて扱います public class Deck { public List<CardData> cards = new List<CardData>(); // 山札 public List<CardData> hand = new List<CardData>(); // 手札 public List<CardData> discardPile = new List<CardData>(); // 捨て札 // 山札をシャッフルする public void Shuffle() { // カードの順番をランダムに並び替える for (int i = 0; i < cards.Count; i++) { CardData temp = cards[i]; int randomIndex = Random.Range(i, cards.Count); cards[i] = cards[randomIndex]; cards[randomIndex] = temp; } } // カードを1枚ドローする public CardData DrawCard() { // 山札が空の場合は、捨て札を戻して再シャッフルする if (cards.Count == 0) { Reshuffle(); } // それでもカードがない場合はドローできない if (cards.Count == 0) { return null; } // 山札の一番上のカードを手札に移動する CardData card = cards[0]; cards.RemoveAt(0); hand.Add(card); return card; } // 捨て札を山札に戻す処理 void Reshuffle() { cards.AddRange(discardPile); discardPile.Clear(); Shuffle(); } } |
このデッキシステムでは、カードの移動先を明確に分けて管理しています。
カードは「消える」のではなく、常にどこかのリストに存在し続けます。
この考え方を採用することで、ドロー・使用・再利用といった処理をシンプルに保つことができ、後からルールを追加しても破綻しにくくなります。

デッキシステムでは、カードの「移動先」を明確に分けることが重要です。
この構造を作っておくと、ルール変更や拡張がしやすくなります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
ターン制システムの実装

ターン制システムは、カードバトル全体の進行を制御する基礎ロジックです。
「誰の番か」「今どの段階なのか」を明確に管理することで、プレイヤーの行動ルールを統一できます。
TCGでは、ターンを複数のフェーズに分けて管理するのが一般的です。
フェーズを分離しておくことで、処理の追加やルール変更が容易になります。
ターン管理システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
using UnityEngine; // ターン内の進行段階を表す enum // 現在どのフェーズかを明確にするために使用します public enum TurnPhase { Draw, // カードを引くフェーズ Main, // カード使用などのメイン行動 Attack, // 攻撃処理 End // ターン終了 } // ターン進行を管理するクラス public class TurnManager : MonoBehaviour { public int currentPlayer = 0; // 現在のプレイヤー public int turnNumber = 1; // ターン数 public TurnPhase currentPhase = TurnPhase.Draw; // 現在のフェーズ // ターン開始処理 public void StartTurn(int player) { currentPlayer = player; currentPhase = TurnPhase.Draw; // 最初にドローフェーズを実行する DrawPhase(); } // ドローフェーズの処理 void DrawPhase() { // 現在のプレイヤーがカードを1枚引く PlayerManager.Instance .GetPlayer(currentPlayer) .DrawCard(); // ドロー後はメインフェーズへ移行 currentPhase = TurnPhase.Main; } // ターン終了処理 public void EndTurn() { currentPhase = TurnPhase.End; // 次のプレイヤーへ切り替える currentPlayer = (currentPlayer + 1) % 2; turnNumber++; // 次のターンを開始する StartTurn(currentPlayer); } } |
このターン制システムでは、ターンを「フェーズの集合」として管理しています。
現在のフェーズを変数で管理することで、実行できる行動を制限しやすくなります。
ターン進行を一元管理しておくと、カード効果や特殊ルールを追加する際も、どのフェーズで処理を行うかを明確に分離できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
効果処理システムの実装

効果処理システムは、カードに設定された効果を共通ルールに基づいて実行するための基礎ロジックです。
カードごとに個別の処理を書くのではなく、効果の種類ごとに処理を分離することで管理しやすくなります。
TCGでは、「ダメージ」「回復」「ドロー」などの効果が何度も再利用されます。
そのため、効果を種類ごとに整理し、統一的に処理できる構造が重要です。
効果処理システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using UnityEngine; // カード効果を処理するクラス // 効果の種類に応じて、対応する処理を呼び分けます public class CardEffectProcessor : MonoBehaviour { // カード効果を実行する public void ProcessEffect(CardEffect effect, CardData card, Player targetPlayer) { // 効果タイプによって処理内容を切り替える switch (effect.effectType) { case "Damage": ProcessDamage(effect.value, targetPlayer); break; case "Heal": ProcessHeal(effect.value, targetPlayer); break; case "Draw": ProcessDraw(effect.value, targetPlayer); break; case "Buff": ProcessBuff(effect.value, targetPlayer); break; } } // ダメージ効果 void ProcessDamage(int damage, Player target) { target.TakeDamage(damage); } // 回復効果 void ProcessHeal(int heal, Player target) { target.Heal(heal); } // カードドロー効果 void ProcessDraw(int count, Player target) { for (int i = 0; i < count; i++) { target.DrawCard(); } } // バフ効果 void ProcessBuff(int buff, Player target) { target.ApplyBuff(buff); } } |
この効果処理システムでは、カード自体は「どの効果を持つか」だけを定義し、実際の処理は専用クラスに集約しています。
この構造を採用することで、新しいカード効果を追加する際も、既存の処理を流用しながら拡張できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全なカードバトルシステム

ここまで紹介してきたカードデータ・デッキ・ターン制・効果処理を1つに統合した、カードバトルシステムの実装例です。
このクラスは、TCGの基礎ロジックをまとめ上げる「ゲーム進行の中核」となります。
カードバトル全体を管理するクラス
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using UnityEngine; // カードバトル全体を統合管理するクラス public class CompleteCardBattleSystem : MonoBehaviour { [Header("システム参照")] // カードデータ管理 public CardDatabase cardDatabase; // ターン制管理 public TurnManager turnManager; // カード効果処理 public CardEffectProcessor effectProcessor; // カードをプレイしたときの処理 public void PlayCard(CardData card, Player targetPlayer) { // プレイヤーのコスト(マナ)を消費 PlayerManager.Instance .GetCurrentPlayer() .ConsumeMana(card.cost); // カードに設定されている効果を順番に処理 foreach (var effect in card.effects) { effectProcessor.ProcessEffect(effect, card, targetPlayer); } } } |
この実装例では、カードをプレイするという1つの行動の中で、以下の基礎ロジックが連携しています。
- カードデータからコストと効果を取得
- プレイヤーのリソースを消費
- 効果処理システムで効果を実行

このように、各システムを役割ごとに分離しつつ、最終的に統合する構造が、TCGバトルの基本形です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

カードバトルは、カードデータ構造から始めましょう。
カードの基本情報を定義すれば、システムが構築できます。
✅ 今日から始める3ステップ
- ステップ1:カードデータ構造を実装する(所要2時間)
- ステップ2:デッキシステムを実装する(所要2時間)
- ステップ3:ターン制システムを実装する(所要3時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント