現場レベルのゲーム制作が、すべてここで学べます。
この記事はSlay the Spireみたいなデッキ構築系ローグライト要素を持つオリジナルJRPGを作る講座の第4回です。
前回はバトルシステムを固定3ボタンのコマンド選択からデッキを使ったカードバトルへ移行しました。また、マナコストの管理やターン終了ボタンの実装も行いました。
前回の記事:

第4回ではキャラクターの能力などに影響を与えるレリック、状態異常、そしてダンジョンで起こるイベントデータを作成します。
レリックはダンジョンのイベントで取得し、ゲームオーバーになるまで反映されるバフ・デバフのようなものです。状態異常はバトルシーンでのみ反映されるバフ・デバフです。
まずは[Assets]→[Scenes]にある[Title]をダブルクリックしてタイトルシーンを開きます。
レリック・状態異常・イベントデータの追加 ゲームシステムを拡張しよう
敵キャラとカードのマスターデータを作成しましたが、これに加えてレリック、状態異常、イベントのマスターデータを作成します。
レリックのマスターデータ
まずはレリックの基本情報となるRelicParamsクラスを作成します。[Assets/Scripts]フォルダを右クリックし、[Create]→[Scripting]→[Empty C# Script]をクリックして、名前をRelicParamsにします。

RelicParamsクラスを編集していきます。
RelicParams.cs
このRelicParamsではレリック1つのパラメータを定義します。第一章のCardParams.csの定義と同じ形で進めていきます。
以下のような内容のクラスにしてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using UnityEngine; [System.Serializable] public class RelicParams { [SerializeField] private string id;// レリックを区別するための「識別子」 public string ID => id;// プロパティ(読み取り専用としてidを返す) [SerializeField] private Sprite relicSprite;// レリックの画像 public Sprite RelicSprite => relicSprite; [SerializeField] private string relicName;// レリックの名前 public string RelicName => relicName; [SerializeField] private string relicDescription;// レリックの説明 public string RelicDescription => relicDescription; [SerializeField] private int relicPower;// レリックの力 public int RelicPower => relicPower; } |
レリック定義に必要なクラスを作成し、Unityのインスペクター画面からデータを設定できるようにしています。
レリックをまとめて管理するためのクラス
次に、先ほど作成したレリック1つの定義を行ったRelicParamsクラスを使い、複数のレリックをまとめて扱うクラスを作ります。
[Assets/Scripts]フォルダを右クリックし、[Create]→[Scripting]→[ScriptableObject Script]をクリックして、名前をRelicDataにします。
RelicDataクラスに先ほど作成したRelicParamsクラスをListで変数relicListとして宣言しておきます。
このrelicListの中から画像と名前と説明、そして威力を取得するメソッドを追加します。
さらに取得していないレリックのIDをランダムで返すメソッドも追加します。
つまりレリックのデータベースを作成していくことになります。
RelicData.cs
|
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 59 60 61 62 |
using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "RelicData", menuName = "Scriptable Objects/RelicData")] public class RelicData : ScriptableObject { [SerializeField] private List<RelicParams> relicList; public Sprite GetSprite(string id) { foreach (RelicParams relic in relicList) { if (relic.ID == id) return relic.RelicSprite; } return null; } public string GetName(string id) { foreach (RelicParams relic in relicList) { if (relic.ID == id) return relic.RelicName; } return null; } public string GetInfo(string id) { foreach (RelicParams relic in relicList) { if (relic.ID == id) return relic.RelicDescription; } return null; } public int GetPower(string id) { foreach (RelicParams relic in relicList) { if (relic.ID == id) return relic.RelicPower; } return 0; } // ランダムなレリックを取得 public string GetRandomRelic(List<string> ownedRelics) { List<string> candidate = new List<string>();// レリック候補 // まず候補を決める(すでに所有しているレリックは対象外) foreach (RelicParams relic in relicList) { if (!ownedRelics.Contains(relic.ID)) candidate.Add(relic.ID); } return candidate[Random.Range(0, candidate.Count)];// ランダムでレリックを選ぶ } } |
GetRandomRelicメソッドは引数にすでに所有しているレリックのリストを渡します。
foreachでリストを全件ループし、所有リストに含まれていないIDを候補のリストに追加します。そのあと、候補リストの中からランダムなIDを返すようにしています。
なお、レリックの候補が0だとエラーになってしまいますが、レリック「Potion」はその場で効果があり取得しないレリックとなっている(のちほど実装)ので、レリックの候補には必ず「Potion」が入ります。
データアセットの作成
[Assets/Data]フォルダを右クリックし、[Create]→[ScriptableObject]→[RelicData]をクリックします。
RelicDataの要素にIDを入力し、対応するスプライト画像をアタッチする
追加した要素を展開するとIDやレリックの各種パラメータが表示されるので、IDに[Hammer]、RelicSpriteにAsset Storeからインポートしておいたカードの画像の[500FreeSkillIcons/Icons/skill_277]をドラッグアンドドロップします。
さらにRelicNameに[ハンマー]、RelicDescriptionに[攻撃力が20%増加する。]、RelicPowerに[20]を入れておきます。

同じ要領で要素を増やし、以下の画像のとおりさらに3つのレリックデータを作成します。

合計4つのレリックデータの作成がこれで完了です。
状態異常のマスターデータ
次に状態異常の基本情報となるConditionParamsクラスを作成します。[Assets/Scripts]フォルダを右クリックし、[Create]→[Scripting]→[Empty C# Script]をクリックして、名前をConditionParamsにします。

ConditionParamsクラスを編集していきます。
ConditionParams.cs
このConditionParamsでは状態異常1つのパラメータを定義します。
以下のような内容のクラスにしてください。
まとめ


レリック・状態異常・イベントのデータベースの作成を行い、GameManagerから参照できるようにしました。
ここからは今回作ったデータベースをゲーム内で登場できるようにアップデートを行っていきます。
次回はダンジョンの移動を一本道から二択制にするため、UIの変更と分かれ道の実装を行います。左右の選択肢を用意することで、プレイヤーにルート選択の戦略性が生まれるダンジョン探索へと進化させていきます。
次の記事:

現場レベルのゲーム制作が、すべてここで学べます。







コメント