デッキ構築カードゲームの作り方#2|カードのデータをScriptableObjectで作ろう

3つのカードのデータのInspector。定規でペシッ(Attack・敵に6ダメージ)、下じきガード(Defense・防御を5得る)、ばんそうこう(Heal・HPを5回復する)

カードゲームを作るとき、最初に決めておきたいのが「カードのデータをどこに持つか」です。名前・コスト・効果・絵・・・。カードの数だけスクリプトを書いていたら、15種類でも大変なことになります。今回は、カード1枚分の情報をScriptableObjectのアセットにして、スクリプトを触らずにカードを増やせる形を作ってみたいと思います!

目次

今回作るもの

  • カード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
DeckBuilding>Sprites>Cardsにcard_bandage・card_pencilboard・card_rulerの3枚。card_rulerのSprite ModeはSingle

カードのデータに何が要る?

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

カードの各部の名前。左上のコスト(使うエネルギー)、絵、名前、説明、枠の色で分かる種類
項目例型
名前定規でペシッstring
コスト(使うのに要るエネルギー)1int
種類攻撃・防御・回復・特殊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のクラスは、ファイル名とクラス名をそろえる必要があります(CardData.csの中はCardDataクラス)。違っていると、Create>DeckBuilding>Card Dataを選んでもアセットが作れません。enumのCardTypeは、同じファイルに書いてOKです。

enum(列挙型)とは

CardTypeのところで使っているenumは、決まった選択肢の中から1つを選ぶための型です。

enumのいいところ
  • 選べるのは書いた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 NameCostCard TypeDescriptionArtwork
Ruler定規でペシッ1Attack敵に6ダメージcard_ruler
PencilBoard下じきガード1Defense防御を5得るcard_pencilboard
Bandageばんそうこう1HealHPを5回復するcard_bandage
  • Artworkは、ProjectウインドのSprites>Cardsから絵をドラッグ&ドロップ
  • アセットの名前は英語、Card Nameは日本語にしておきます
    • アセットの名前は、スクリプトやフォルダの中で探すときに使う名前。画面に出すのはCard Nameです
RulerのInspector。Card Name:定規でペシッ、Cost:1、Card Type:Attack、Description:敵に6ダメージ、Artwork:card_ruler

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に戻る
DeckBuilding>Data>CardsにBandage・PencilBoard・Rulerの3つのアセット

カード用のデータの考え方は、以前の記事カード用のモデルクラス【カードゲームの作り方】準備編01でも紹介しています。そちらはScriptableObjectを使わずに、スクリプトの中でデータを持つ形です。

スライム

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

フェアリー

残りは#7と#13で、効果を作るときに少しずつ足していくよ。一気に作らなくて大丈夫!

あとがき

今回はカードのデータの入れ物を作って、最初の3枚を用意しました。見た目はまだありませんが、ここで形を決めておくと、カードを増やすのがぐっと楽になります。次回は、このデータを読み込んで表示する「カードの見た目」をプレハブにしたいと思います!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次