【Unity】RPGを作るチュートリアルその10 キャラクターのパラメータ設計と設定
- 2025.01.16
- RPGチュートリアル
- RPG, Unity, ゲーム開発, チュートリアル
シンプルなRPGをUnityで作るチュートリアルシリーズの10回目です。大台に乗りました。
第9回ではキャラクター同士が重ならないようにする制御を実装しました。Colliderを使ったRaycastと、Tilemap上の座標管理によって実現しました。やり方は他にもあるかと思いますので、チュートリアル完了後に「こういう実装なら簡単にできそうだ!」なんて改造してみるのも面白いかもしれません。
今回は操作関係の制御からうってかわって、定義データの設計や設定に入っていきます。必要なパラメータの洗い出しや実装方針を固めて、データを作成していきたいと思います。
制作環境
MacBook Pro 2023 Apple M2 Max
Unity6 (6000.0.30f1) Silicon
作業内容と順序
シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。
前回の内容
前回はキャラクター同士の衝突(重なり)を防ぐ機能を実装しました。
定義データの実装方針
RPGといえば味方キャラクターのデータや敵キャラのデータ、魔法やアイテムのデータなど、定義データとして決めておかなければならないことがわんさかあります。これらの定義データをどのように保持するかはゲームがオフラインで実行されるのか、オンラインで実行されるのかによっても変わってきます。
オフラインで実行される場合は、定義データをJSONやScriptableObjectで保持しておくとグッド。ScriptableObjectだとすでにシリアライズされた状態になるため、変換の手間は減らせるかもしれません。
オンラインで実行される場合は、サーバ側のDBにデータを保持することが多いかと思います。ゲーム側からAPIを叩いてサーバ側のデータをJSONで返し、それを利用する形が多いかと思います。オンラインのゲームだとデータがサーバ側にあることから調整などがしやすい利点があります。JSONからの変換は、Unityに組み込みのJSONUtilityを使うこともありますが、MessagePack for C#を使うともっと速く処理できます。ただし、macで使うには若干大変なので、Windowsを使っているときに使うのが良いかもしれません。
今回はオフラインで実行されるゲームなので、サーバは使わずScriptableObjectで定義データを作成していきます。私はいつもEditor拡張でcsvなどからScriptableObjectにデータを取り込む機能を作ってしまうのですが、このチュートリアルではデータ量も少ないので人力で頑張りたいと思います。
キャラクターの定義データ
この回ではキャラクターの定義データを作成していきます。パラメータが増えれば増えるほど大変になるので、なるべく最低限で進めたいと思います。
必要なパラメータとしては以下のものが想定されます。
パラメータの種別 | 概要 |
HP | 体力を表します。残りHPが0になるとゲームオーバー扱いで長老の前に戻します。 |
MP | 魔法を使うためのパワーです。 |
力 | 攻撃力の計算の基礎値です。戦闘中は武器の攻撃力を足して別で保持しましょう。 |
身のまもり | 防御力の計算の基礎値です。こちらも戦闘中は防具の防御力を足して別で保持しましょう。 |
素早さ | 行動順の決定に使用する値です。 |
これらの値はレベルによって変動していくので、各レベルに対応する値を決めていきます。
また、レベルに関しては、経験値いくつでレベル2、といったように経験値とレベルを対応させていきます。次のレベルまでの経験値はこの経験値表と現在の経験値から計算します。
それぞれ別で管理したいので、
- 経験値とレベルの対応データ
- レベルとパラメータの対応データ
で対応するクラスを作成していきましょう。どちらもScriptableObjectを継承させて実装していきます。
定義データ用スクリプトのフォルダ作成
定義データ用にスクリプトを作っていく前に、フォルダを作成しておきます。Projectウィンドウの「Assets/Scripts」にてフォルダを作成し、名前を [Data] にしました。
以前作成した「NoEntryTileData」のスクリプトファイルも定義データ用のクラスになっているため、作成した「Data」フォルダに移動させておきましょう。
経験値とレベルの対応データ
先ほど作成した「Data」フォルダでScriptableObject用のスクリプトファイルを作成します。名前は [ExpTable] にしました。
経験値が0になったらレベル1、経験値が5になったらレベル2、経験値が20になったらレベル3、なんて形で、経験値とレベルのペアとしてデータを保持しようと思います。そのため、経験値のフィールドとレベルのフィールドをペアで持たせるようなクラスを作って、それを「ExpTable」のクラスでリストとして保持するようにしましょう。
同じく「Data」フォルダで今度は空のスクリプトファイルを作成します。名前は [ExpRecord] にしました。
作成した「ExpRecord」のファイルでは、以下のように記載しました。
[Serializable]の属性をつけてシリアライズできるようにします。「ExpRecord」はリスト形式で保持する予定ですが、この属性がないと、Unityを一度終了して再度開いた時にリストの中身が消えている! なんてことになったりします。シリアライズの対象にしておくことで、.assetの中にリストの中身の参照先である「ExpRecord」の内容を書き込んでくれるので、再度Unityを開いた時にも中身を再現してくれます。
フィールドとしてはレベルと、そのレベルに必要なトータルの経験値を保持するようになっています。後ほどScriptableObjectのファイルを作成後、Inspectorウィンドウでこれらの値を定義していきましょう。
続いて「ExpTable」のクラスも中身を書いていきます。
こちらはリストとして「ExpRecord」を保持します。メニューからアセットを作成するための属性の[CreateAssetMenu]がついています。コンテキストメニューからScriptableObjectのスクリプトを作る際に自動的についているので便利ですね。
両方のスクリプトファイルを編集したら、定義データ用のファイルを作成します。Projectウィンドウにて「Assets/Data」のフォルダに移動し、コンテキストメニューの [Create] -> [Scriptable Objects] -> [SimpleRpg] -> [ExpTable] からファイルを作成します。
作成したファイルの名前はそのまま [ExpTable] にしましょう。
作成した「ExpTable」を選択した状態でInspectorウィンドウを見ると、「Exp Records」のフィールドが表示されるので、クリックして広げてリストの部分を表示します。リストでは [+] ボタンをクリックして項目を追加していきましょう。
データは以下のようにレベル5まで作成しました。経験値の値は任意に入れていただいてOKです。
入力が完了したら、一旦シーンを保存してUnityを閉じて、再度開いてデータが保持されることを確認しましょう。長時間のデータ入力の後にデータが保持されていないとなると泣きたくなりますからね(1敗)
データが保存されていることを確認したら、キャラクターのパラメータの定義を作成していきます。
キャラクターのパラメータ定義データ
こちらもリストを保持するScriptableObject、リストの各レコード、という形でクラスを作成します。
まずはパラメータ用のレコードから作成します。Projectウィンドウから「Assets/Scripts/Data」のフォルダを開き、空のスクリプトを作成します。名前は [ParameterRecord] にしました。
作成した「ParameterRecord」のファイルでは以下のように記載します。
上の方の表に合わせて必要なフィールドを作成しました。経験値テーブルではレベル5まで必要な経験値を定義したので、それに合わせてレベル5までのパラメータを設定しましょう。といっても現時点ではまだ敵キャラのパラメータも決めていないので、ざっくりとした値でOKです。大事なのは、必要なパラメータの項目を定義することですからね。
続いて「ParameterRecord」をリストとして保持するクラスを作成します。Projectウィンドウから「Assets/Scripts/Data」のフォルダで、ScriptableObjectのスクリプトを作成します。名前は [ParameterTable] にしました。
作成した「ParameterTable」のファイルでは経験値テーブルの時と同様に以下のように記載します。
スクリプトファイルの編集が終わったらパラメータ用のScriptableObjectを作成します。Projectウィンドウにて「Assets/Data」のフォルダに移動し、コンテキストメニューの [Create] -> [Scriptable Objects] -> [SimpleRpg] -> [ParameterTable] からファイルを作成します。名前はそのまま [ParameterTable] にしました。
作成した「ParameterTable」を選択した状態でInspectorウィンドウを見ると、「Parameter Records」のフィールドが表示されるので、クリックして広げてリストの部分を表示します。リストでは [+] ボタンをクリックして項目を追加していきましょう。経験値テーブルと時と同様にレベル5まで用意して、ざっくりと値を入れてみます。調整は後半フェーズで行っていきましょう。
一応の方針としては、「(攻撃力 / 2) – (防御力 / 4)」の古いドラクエ方式に沿ってちょっとずつ与えるダメージが大きくなりそうな感じで入れています。武器や防具も初期装備、上位品の2種類を用意しようと思うので、パラメータだけで大きくなりすぎないようにしています。MPに関しては、消費MP3の回復魔法が使える回数を1回ずつ増やしていくイメージにしています。
表にまとめると以下のような感じです。
レベル | 1 | 2 | 3 | 4 | 5 |
HP | 20 | 25 | 30 | 35 | 40 |
MP | 3 | 6 | 9 | 12 | 15 |
Strength | 8 | 10 | 12 | 14 | 16 |
Guard | 4 | 6 | 8 | 10 | 12 |
Speed | 6 | 7 | 8 | 9 | 10 |
ScriptableObjectのファイルを複数作成することで、キャラクターに応じたパラメータ表を準備することができるため、味方キャラクターが複数いる場合にも同様の方法で対応可能です。
ここまで設定できたら今回は完了です。動作確認は戦闘シーンの作成時になりそうなので、次回以降も必要そうなデータをある程度まとめて作っていきましょう。
今回のブランチ
まとめ
今回は定義データの作成方針としてScriptableObjectを使っていくことを決めました。ゲームをリリースする先のプラットフォームや、ゲームの形態に応じて定義データの持ち方も選んでいけるとグッド。定義データのうち、操作キャラクターの経験値とレベルの対応表や、各レベルごとのパラメータを作成しました。複数のキャラクターがいる場合は同じクラスを使いつつ別のScriptableObjectのファイルを使って違う値を使うこともできます。
次回は引き続き定義データの作成として、敵キャラクターのものを用意します。データと画像を紐づけるので、戦闘時の敵キャラの画像もモック版を用意する予定です。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその9 キャラクター同士の衝突確認 2025.01.12
-
次の記事
【Unity】RPGを作るチュートリアルその11 敵キャラクターの定義データを実装 2025.01.17
コメントを書く