現場レベルのゲーム制作が、すべてここで学べます。
この記事はノンフィールドRPGの作り方講座の第9回です。
前回はバトルシーンの設定とUIを作成しました。
前回の記事:

第9回ではマスターデータを作成し、敵キャラの表示やバトルシーンの背景を作成していきます。
マスターデータの作成 敵キャラクターデータをScriptable Objectで実装する
マスターデータとは、敵キャラの「名前」「HP」「攻撃力」など、ゲームの中で何度も使われる基本情報(元になるデータ)のことです。
Unityではこれを ScriptableObject という仕組みを使って効率よく管理できます。
敵キャラの情報(パラメータ)を保管しておくクラスを作る
まずは敵キャラの基本情報となるEnemyParamsクラスを作成します。[Assets/Scripts]フォルダを右クリックし、[Create]→[Scripting]→[Empty C# Script]をクリックして、名前をEnemyParamsにします。

EnemyParamsクラスを編集していきます。このゲームでは敵キャラはIDとスプライト(画像)だけをクラスの変数として持たせます。
この変数はここでは private(外から見えない)にしていますが、[SerializeField] をつけることで インスペクターでは見えるようにしています。
そして、外から読み取り専用で取得できるようにしています(「プロパティ」といいます)。
こうすることで、書き換えられる心配がない安全な設計になります。
EnemyParams.cs
このEnemyParamsでは敵キャラ1体のパラメータを定義します。
|
1 2 3 4 5 6 7 8 9 10 11 |
using UnityEngine;// Spriteや[SerializeField]を使うために必要 [System.Serializable] public class EnemyParams { [SerializeField] private string id;// 敵キャラを区別するための「識別子」 public string ID => id;// プロパティ(読み取り専用としてidを返す) [SerializeField] private Sprite enemySprite;// 敵キャラの画像 public Sprite EnemySprite => enemySprite;// プロパティ(読み取り専用としてidを返す) } |
public string ID => id;
この書き方はC# の「式形式プロパティ」(expression-bodied property) の構文で以下の式と等価です。
つまり、プロパティ ID は get アクセサ しか持たず、set アクセサ(= 書き込み)は存在しません。したがって、外部からこのプロパティに値を設定することはできません。よって、「読み取り専用」となります。
関連記事:Unity C# フィールド・プロパティ・アクセス修飾子の使い方 スコープの概念を理解する

もし難しかったらとりあえずここでは他のクラスから情報を直接変更できないんだなと思えばOKです。
複数の敵キャラをまとめて管理するためのクラスを作ろう
次に、先ほど作成した敵キャラ1体の定義を行ったEnemyParamsクラスを使い、複数の敵キャラをまとめて扱うクラスを作ります。
ScriptableObjectを継承したクラスを作成することで、データだけを独立して管理できるオブジェクトを作成できます。
またScriptableObjectはInspectorでデータを編集できるため管理がしやすくなります。
[Assets/Scripts]フォルダを右クリックし、[Create]→[Scripting]→[ScriptableObject Script]をクリックして、名前をEnemyDataにします。
EnemyDataクラスに先ほど作成したEnemyParamsクラスをListで変数EnemyListとして宣言しておきます。
このEnemyListの中からランダムで敵キャラのIDを取得するメソッドと、敵キャラのIDから敵キャラの情報(EnemyParams)を取得するメソッドを追加します。
つまり敵キャラのデータベースを作成していくことになります。
EnemyData.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 |
using UnityEngine; using System.Collections.Generic;// Listを使うのに必要 [CreateAssetMenu(fileName = "EnemyData", menuName = "Scriptable Objects/EnemyData")] public class EnemyData : ScriptableObject { [SerializeField] private List<EnemyParams> enemyList; // enemyListの中からランダムなEnemyParamsを返す public EnemyParams GetRandomEnemyParams() { return enemyList[Random.Range(0, enemyList.Count)]; } // enemyListの中からIDが一致するEnemyParamsを返す public EnemyParams GetEnemyParams(string id) { foreach (EnemyParams enemy in enemyList) { if (enemy.ID == id) return enemy; } return null; } } |
データアセットの作成
データアセットとは先ほどEnemyData.csで定義したScriptableObjectを使って作成される、Unity内で管理できる「設定データファイル」のようなものです。
[Assets/Data]フォルダを右クリックし、[Create]→[ScriptableObject]→[EnemyData]をクリックします。まとめ

ここまでで敵キャラのマスターデータを作成し、バトルシーンのオブジェクトを配置しました。
ですが現状では画像UIを表示しただけでバトルシーンの処理は実装できていません。
次回からバトルシーンになったときの音楽切り替え、マスターデータを用いた敵キャラの表示やステータスウィンドウの表示(主人公、敵キャラ)、プレイヤー側で発動するスキルの処理等を実装していきます。
次の記事:

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






コメント