Unity2Dでカードゲーム(ローグライク)を作成のPart4です。
はじめに
前回の続きのPart4を作成していきます。Part3は下記から。
前回まで「スクリプトでカード生成」、「カードを管理するスクリプト作成」、「カードの使用」を作成しました。Part4ではカードをランダムに選択して配ります。
カードのランダム化
カードを複数枚用意し、用意したカードからランダムに選出して配ります。Scriptableobjectを利用していきます。
ゲーム作成開始
ScriptableObjectの作成
Project内に「Scripting」→「ScriptableObjectScript」を追加します。

スクリプトの中身を下記に変更します。カード情報としてコストとダメージを保持します。リスト化してカード情報を管理。「GetCardInfo」はテストでカード情報の1番目を返すようにしています。
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "CardTable", menuName = "Scriptable Objects/CardTable")]
public class CardTable : ScriptableObject
{
[SerializeField] private List<Item> cardInfo;
public Item GetCardInfo()
{
return cardInfo[0];
}
}
[System.Serializable]
public class Item
{
public int cost;
public int damage;
}
Assetsフォルダ内に「Data」フォルダを作成、「ScriptableObjects」→「CardTable」を追加します。

Inspector画面でカード情報を入力します。まずはテストで「コスト1、ダメージ2」のカードを1枚用意します。

Cardスクリプトの「TEST」とコメントした箇所を下記に変更します。
[SerializeField] private CardTable cardTable;
private void Start()
{
// TEST
Item item = cardTable.GetCardInfo();
cost = item.cost;
damage = item.damage;
cost_Text.text = cost.ToString();
damage_Text.text = damage.ToString();
cam = Camera.main;
}
CardPrefabのCardスクリプトのCardTableパラメータをセットします。

実行して下記の様にカードが表示されたらOK

CardTableを下記の様に複数用意します。

CardTableスクリプトを下記の様に変更、ランダムにカードを選択して返します。
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "CardTable", menuName = "Scriptable Objects/CardTable")]
public class CardTable : ScriptableObject
{
[SerializeField] private List<Item> cardInfo;
public Item GetCardInfo()
{
int index = Random.Range(0, cardInfo.Count);
return cardInfo[index];
}
}
[System.Serializable]
public class Item
{
public int cost;
public int damage;
}
実行するたびに異なるカードが表示されたらOK。カード情報に画像や色などを追加することで、更に異なるカード感を出すことが出来ます。

