【スタジオしまづ】カードゲームの作り方を学んでみる #3 カードデータの生成

カードゲームが作りたかったので【Unityゲームスタジオ スタジオしまづ】さんの動画を見ながら学習してみる

シャドバ風！？カードゲームの作り方 #3 カードデータの生成
https://youtu.be/9VtfajLzSrg

前回はこちら
[【スタジオしまづ】カードゲームの作り方を学んでみる #2 カードの生成](https://qiita.com/kreinto/items/06cc953ebe185f55f100)

***
###カードを扱うスクリプト(CardController)を作成
動画時間0:40～
・ScriptsフォルダにC#スクリプトを作成し名前を「CardController」にする
CardControllerは
　見かけ(view)に関することを操作
　データ(model)に関することを操作
の2つを扱うがデータ(model)は別のクラスで実装する

###カードデータのスクリプト(CardModel)を作成
動画時間2:15～
・ScriptsフォルダにC#スクリプトを作成し名前を「CardModel」にする
・カードのデータに必要な項目をpublicで定義してく
（後で追記します）

```csharp:CardModel.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// カードデータそのものとその処理
public class CardModel
{
    public string name;
    public int hp;
    public int at;
    public int cost;
    public Sprite icon;
}
```

・CardControllerに追記（後でまた追記します）

```csharp:CardController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CardController : MonoBehaviour
{
    // データ(model)に関することを操作
    CardModel model;

    public void Init()
    {
        model = new CardModel();
    }
}
```

・プレハブのカードにCardControllerをアタッチする（プレハブを開くを押してから行うこと）
![3-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617902/9040e1c6-d5ec-9c9a-3fe5-1f769ed962f1.png)


###カードエンティティ(CardEntity)を作成
動画時間4:40～
カードの元々の情報を持つ外部データ（エクセル、csvなど）として「ScriptableObject」を使用する
[ScriptableObject - Unity マニュアル](https://docs.unity3d.com/ja/2018.4/Manual/class-ScriptableObject.html)
・ScriptsフォルダにC#スクリプトを作成し名前を「CardEntity」にする

```csharp:CardEntity.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName ="CardEntity", menuName ="Create CardEntity")]
// カードデータそのもの
public class CardEntity : ScriptableObject
{
    public new string name;
    public int hp;
    public int at;
    public int cost;
    public Sprite icon;
}
```

CardEntityができたらUnityの作成メニューに「Create CardEntity」が出てくるようになり、簡単にカードデータを作成できる
![3-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617902/ec6ab22b-a708-101d-b3b2-78b718a8aa60.png)


###最初のカード(Card1)を作成
動画時間7:20～
最初のカードを作る
![3-03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617902/92feffb2-989e-4e05-3cc8-b6c78c82a458.png)

###Card1の情報を使ってゲーム内にカードを生成する
・Assetsにフォルダを作成し名前を「Resources」にする
・PrefabsフォルダをResources内に移動させる
・Resourcesにフォルダを作成し名前を「CardEntityList」にする
・Card1をCardEntityList内に移動させる
・CardModelを編集

```csharp:CardModel.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// カードデータそのものとその処理
public class CardModel
{
    public string name;
    public int hp;
    public int at;
    public int cost;
    public Sprite icon;

    public CardModel(int cardID)
    {
        CardEntity cardEntity = Resources.Load<CardEntity>("CardEntityList/Card"+cardID);
        name = cardEntity.name;
        hp = cardEntity.hp;
        at = cardEntity.at;
        cost = cardEntity.cost;
        icon = cardEntity.icon;
    }
}
```
・CardControllerを編集

```csharp:CardController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CardController : MonoBehaviour
{
    // データ(model)に関することを操作
    CardModel model;

    public void Init(int cardID)
    {
        model = new CardModel(cardID);
    }
}
```

・GameManagerを編集

```csharp:GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    [SerializeField] Transform playerHandTransform;
    [SerializeField] CardController cardPrefab;
    void Start()
    {
        CreateCard(playerHandTransform);
    }

    void CreateCard(Transform hand)
    {
        //カードの生成とデータの受け渡し
        CardController card = Instantiate(cardPrefab, hand, false);
        card.Init(1);
    }
}
```

cardPrefabの型を変えたせいでGameManagerのcardPrefabの指定が「なし」になっているので改めてPrefabsからCardを設定する

今回はここまで