
カードゲームを作るとき、最初に決めておきたいのが「カードのデータをどこに持つか」です。名前・コスト・効果・絵・・・。カードの数だけスクリプトを書いていたら、15種類でも大変なことになります。今回は、カード1枚分の情報をScriptableObjectのアセットにして、スクリプトを触らずにカードを増やせる形を作ってみたいと思います!
- シリーズの目次:デッキ構築カードゲームの作り方
- 前回:#1 プロジェクトの準備とバトル画面の枠組みを作ろう
今回作るもの
- カード1枚分のデータを入れておく
CardData - 最初の3枚のカード:定規でペシッ・下じきガード・ばんそうこう
| スクリプト | 役割 | 付ける場所 |
|---|---|---|
| CardData | カード1枚分の名前・コスト・種類・説明・絵 | (付けない。アセットを作る) |
今回はまだ画面に何も出てきません。作ったデータをカードの見た目にするのは#3です。
前回の続きから
前回の最後の状態から始めます。カードの絵は、素材のzipを入れ直すと入ります。
- DeckBuildingAssets.zip
- 前回ダウンロードした人も、もう一度ダウンロードして取り込んでください(カードの絵を足しました)
DeckBuilding/Sprites/Cardsに、card_ruler.png・card_pencilboard.png・card_bandage.pngが入る- 自分で入れた場合は、3枚を選んでSprite Mode:SingleにしてApply

カードのデータに何が要る?
作る前に、カード1枚に何が書いてあるかを考えてみましょう。

| 項目 | 例 | 型 |
|---|---|---|
| 名前 | 定規でペシッ | string |
| コスト(使うのに要るエネルギー) | 1 | int |
| 種類 | 攻撃・防御・回復・特殊 | CardType(今回作る) |
| 説明 | 敵に6ダメージ | string |
| 絵 | 定規の絵 | Sprite |
「6ダメージを与える」といった効果そのものは、今回は説明の文字だけにしておきます。効果の中身は、#7でクラスに分けて作ります。
スライム説明に「6ダメージ」って書くだけで、本当に6ダメージになるんですか?



ならないよ(笑)。今は見た目のための文字だけ。#7で「本当に6ダメージを与える部品」を作って、カードに持たせるんだ
CardDataを作ろう
ScriptableObjectの基本は、12-8 ScriptableObjectでデータを作ろうで紹介しています。今回はその形で、カードのデータを作ります。
- DeckBuilding/Scriptsで右クリック>Create>MonoBehaviour Scriptで「CardData」を作り、中身を次のように書き換える
using UnityEngine;
// カードの種類(枠の色や、使う相手を決めるときに使う)
public enum CardType
{
Attack, // 攻撃
Defense, // 防御
Heal, // 回復
Special // 特殊
}
// カード1枚分のデータ。Project ウインドの Create>DeckBuilding>Card Data でアセットを作れる
[CreateAssetMenu(fileName = "NewCard", menuName = "DeckBuilding/Card Data")]
public class CardData : ScriptableObject
{
public string cardName; // 画面に出す名前
[Min(0)] public int cost = 1; // 使うのに要るエネルギー
public CardType cardType; // 種類
[TextArea] public string description; // 説明
public Sprite artwork; // カードの絵
}
- : ScriptableObject
- MonoBehaviourの代わりにScriptableObjectを受け継ぐと、データを入れておくアセットとして作れる
- [CreateAssetMenu]
- Projectウインドの右クリック>Createに「DeckBuilding>Card Data」の項目が出る
- [Min(0)]
- Inspectorで、0より小さい数を入れられないようにする。コストがマイナスのカードは無いので、入力ミスを防げます
- [TextArea]
- 説明を何行でも書ける、大きな入力欄にする
- nameではなくcardName
- ScriptableObjectには、最初から
name(アセットのファイル名)がある。同じnameを使うと、ファイル名とまざってしまうので、別の名前にしています
- ScriptableObjectには、最初から
ScriptableObjectのクラスは、ファイル名とクラス名をそろえる必要があります(CardData.csの中はCardDataクラス)。違っていると、Create>DeckBuilding>Card Dataを選んでもアセットが作れません。enumのCardTypeは、同じファイルに書いてOKです。
enum(列挙型)とは
CardTypeのところで使っているenumは、決まった選択肢の中から1つを選ぶための型です。
- 選べるのは書いた4つだけ。
"攻撃"のような文字で持つと、「攻げき」のような打ちまちがいに気づけない - Inspectorでは、ドロップダウンで選べる
- スクリプトでは
CardType.Attackのように書く。if (card.cardType == CardType.Attack)のように比べられる
enumの中の名前は英語にしておき、日本語は後ろのコメントに書いておくと、あとから見たときに分かりやすいです。enumとswitch文の使い方は、6-15 選択肢に名前を付けよう:enum(列挙型)とswitch文で、東西南北の向きや町の順番などのゲームの例と一緒に紹介しています。
カードのアセットを作ろう
- DeckBuilding>Dataの中に「Cards」フォルダを作る
- Cardsフォルダで右クリック>Create>DeckBuilding>Card Data で3つ作る


それぞれ、次のように入力します。
| アセットの名前 | Card Name | Cost | Card Type | Description | Artwork |
|---|---|---|---|---|---|
| Ruler | 定規でペシッ | 1 | Attack | 敵に6ダメージ | card_ruler |
| PencilBoard | 下じきガード | 1 | Defense | 防御を5得る | card_pencilboard |
| Bandage | ばんそうこう | 1 | Heal | HPを5回復する | card_bandage |
- Artworkは、ProjectウインドのSprites>Cardsから絵をドラッグ&ドロップ
- アセットの名前は英語、Card Nameは日本語にしておきます
- アセットの名前は、スクリプトやフォルダの中で探すときに使う名前。画面に出すのはCard Nameです




Card Typeをクリックすると、enumに書いた4つがドロップダウンで出てきます。選べるのは書いたものだけなので、打ちまちがいが起きません。
カードを増やしたいときは、Card Dataのアセットを1つ作って値を入れるだけ。スクリプトは1行も変えずに、15種類でも30種類でも増やせます。これがScriptableObjectでデータを作るいちばんのメリットです。
動かして確認!
今回はデータを作っただけなので、確認はInspectorで行います。
#2の動作確認
- Projectウインドの右クリック>Createに、DeckBuilding>Card Dataが出る
- DeckBuilding>Data>Cardsに、Ruler・PencilBoard・Bandageの3つがある
- それぞれのInspectorで、名前・コスト・種類・説明・絵が入っている
- Costに-1を入れようとしても、0に戻る





15種類ぶん入力するのは、ちょっと大変そう・・・



残りは#7と#13で、効果を作るときに少しずつ足していくよ。一気に作らなくて大丈夫!
あとがき
今回はカードのデータの入れ物を作って、最初の3枚を用意しました。見た目はまだありませんが、ここで形を決めておくと、カードを増やすのがぐっと楽になります。次回は、このデータを読み込んで表示する「カードの見た目」をプレハブにしたいと思います!
コメント