現場レベルのゲーム制作が、すべてここで学べます。
この記事は3DダンジョンRPGの作り方に講座の第14回目です。
前回はアクターの職業ごとにスキルツリーを作成し、街シーンからスキルの習得・レベルアップを行えるようにしました。いわゆるスキルツリーシステムを構築しました。
前回の記事:

今回はこのゲームの機能をさらに拡充するためにアイテムシステムの実装を行います。装備品によってキャラクターを強くできるだけでなく、ダンジョンでアイテムを収集することによるやり込み性の向上も期待できます。
装備は職業別に装備できる武器が異なっている&頭、胴、足など部位別にアイテムを装備できる実装にしています。
ウィザードリィや世界樹の迷宮だけでなく元祖ドラクエなどオーソドックスなRPGで採用されている形式です。装備品によって戦略性が広がり、あなたのゲーム制作スキルがグッとレベルアップする。そんな回となっています。
アイテムシステムの仕様
このゲームでは以下の3種別のアイテムが存在します。
| アイテム種別 | クラス名 | 説明 |
| 武器アイテム | WeaponItemData | 各アクターに1つずつ装備できる 攻撃スキル使用時の与ダメージが上昇する |
| 防具アイテム | ArmorItemData | 各アクターの各部位ごとに装備できる (部位:頭・胴体・脚・左手の4種) 攻撃スキルを受けた時の被ダメージが減少する |
| 消費アイテム | ConsumableItemData | 装備できないアイテム全般が分類される 戦闘中またはダンジョン探索時に使用でき、HP回復などの効果をもつアイテムもある また、合成素材となりショップでのアイテム解放に利用できるアイテムもある |
いずれのアイテムも今後の章にて実装するダンジョンイベントにて入手可能です。
また、街シーンで追加されるショップ画面にてGoldを支払って購入することも可能です。
ショップに陳列されるアイテムは初期状態では購入不可とし、合成素材のアイテムを支払うことで購入可能にする設定にもできます。
この講座はここから
- アイテムシステムの根本の実装
- アクターにアイテムを装備するシステムの実装
- 装備品の効果実装(戦闘ダメージ計算式の実装)
- ショップ画面の実装
という順番で進んでいきます。
RPGのアイテムシステムの実装
まずはアイテムシステムを構築していきます。
アイテムクラス作成
前述のとおり、アイテムのクラスは武器・防具・消費アイテムの3種に分けて作成しますが、それぞれ共通する部分もあるため基底クラスと派生クラスという形で実装していきます。
保存先は任意ですがこの講座では全てScripts > Definesフォルダに作成しています。
ItemData.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 |
using System; using UnityEngine; /// <summary> /// アイテムデータ定義クラス(基底クラス) /// </summary> [Serializable] public class ItemData : ScriptableObject { [Header ("基礎データ")] public string itemName_JP; // アイテム名(JP) public string itemName_EN; // アイテム名(EN) [Multiline (2)] public string description_JP; // アイテム説明(JP) [Multiline (2)] public string description_EN; // アイテム説明(EN) public Sprite iconSprite; // アイコンSprite public int buyPrice; // 買値 [Header ("装備時特殊効果・消費時効果")] public string effectType; // 特殊効果種別 public int effectValue; // 特殊効果量 /// <summary> /// アイテム名を取得する /// </summary> public string GetItemName () { return SimpleTranslationText.GetTranslatedString (itemName_JP, itemName_EN); } /// <summary> /// アイテム説明を取得する /// </summary> public string GetItemDescription () { return SimpleTranslationText.GetTranslatedString (description_JP, description_EN); } } |
アイテム名や説明文は全アイテムで必要になるので共通の基底クラスで宣言しておきます。
effectTypeとeffectValueはそれぞれ特殊な装備アイテムや、消費アイテムを使用した時の効果を示すもので、その場合の処理を作成するタイミングまでは気にしなくてOKです。
また、こちらは基底クラスになるのでScriptableObjectとして作成できる必要はありません。
WeaponItemData.cs (新規)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Collections.Generic; using UnityEngine; [CreateAssetMenu (fileName = "Weapon", menuName = "Dungeon/WeaponSO")] public class WeaponItemData : ItemData { [Header ("攻撃力")] public int weaponPower; [Header ("重量")] public int weight; [Header ("遠距離攻撃フラグ")] public bool isRanged; [Header ("装備可能な職業")] public List<JobData> equipableJob; } |
ItemDataを継承して作成する武器アイテムクラスです。ScriptableObjectとして作成できるよう設定します。
武器にはそれぞれ攻撃力・重量の数値を入力でき、弓矢などの遠距離武器であればその設定を行えるフラグも用意します。
また、全ての武器は職業ごとによって装備できる/できないが存在します。装備できる職業を指定するリストも用意しましょう。
ArmorItemData.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 63 64 65 66 67 68 69 70 71 72 73 |
using System.Collections.Generic; using UnityEngine; [CreateAssetMenu (fileName = "Armor", menuName = "Dungeon/ArmorSO")] public class ArmorItemData : ItemData { [Header ("防御力")] public int armorPower; [Header ("重量")] public int weight; [Header ("装備部位")] public ArmorType armorType; [Header ("属性耐性")] public List<ArmorResist> resists; [System.Serializable] public class ArmorResist { public ElementType elementType; // 対象の属性 public float addResistValue; // 耐性の加算値(マイナスなら減算値) } /// <summary> /// 装備部位名を文字列で返す /// </summary> public static string GetArmorTypeName (ArmorType value) { string res = ""; switch (value) { case ArmorType.Head: res = SimpleTranslationText.GetTranslatedString ("頭", "Head"); break; case ArmorType.Torso: res = SimpleTranslationText.GetTranslatedString ("胴体", "Torso"); break; case ArmorType.Legs: res = SimpleTranslationText.GetTranslatedString ("脚", "Legs"); break; case ArmorType.LeftHand: res = SimpleTranslationText.GetTranslatedString ("左手", "LeftHand"); break; } return res; } /// <summary> /// 対象属性の装備耐性値を返す /// </summary> public float GetResistValue (ElementType elementType) { foreach (var resistData in resists) { if (resistData.elementType == elementType) return resistData.addResistValue; } return 0.0f; } } // 防具アイテムの部位定義 public enum ArmorType { Head, // 頭 Torso, // 胴体 Legs, // 脚 LeftHand, // 左手 _Max, } |
防具アイテムクラスです。
いずれの防具も装備部位が1つ定められており、アクターの該当の部位に対してのみ装備することができます。
属性耐性値を設定していると、その防具を装備しているアクターは指定数値の耐性が増減します。これもInspectorから指定可能です。
ConsumableItemData.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 |
using UnityEngine; [CreateAssetMenu (fileName = "Consumable", menuName = "Dungeon/ConsumableSO")] public class ConsumableItemData : ItemData { [Header ("消費アイテムの種類")] public ConsumableItemType consumableItemType; [Header ("使用時ターゲット")] public TargetType targetType; /// <summary> /// このアイテムの効果を対象に適用する /// </summary> public void ApplyAllEffectsToTarget (BattleManager battleManager, CharacterData casterData, CharacterData targetData) { switch (effectType) { case "HealHP": // HP回復 if (battleManager != null) { // 対象のHP回復 battleManager.ChangeCharacterHP (targetData, effectValue); // ポップアップエフェクト作成 battleManager.SpawnDamagePopupByData (targetData, effectValue, DamagePopupSpawner.DamagePopupType.HP_Heal); } break; case "HealTP": // TP回復 if (battleManager != null) { // 対象のTP回復 battleManager.ChangeCharacterTP (targetData, effectValue); // ポップアップエフェクト作成 battleManager.SpawnDamagePopupByData (targetData, effectValue, DamagePopupSpawner.DamagePopupType.TP_Heal); } break; } } } // 消費アイテムの種類 public enum ConsumableItemType { Combat, // 戦闘時使用可 Both, // 戦闘時・ダンジョン探索時両用 Dungeon, // ダンジョン探索時使用可 Material, // 合成素材 Other, // その他 } |
消費アイテムは使用タイミングなどで種類分けできるようにします。
すぐに使用時処理を作るわけではないですが、HP回復アイテムとTP回復アイテムの2種類の使用時処理は簡単なのでここで作成しておきました。
各アイテムをScriptableObjectを活用して作成する
それでは武器・防具・消費アイテムのScriptableObjectを作成していきます。まずは動作確認用に2~3個ずつ程度あれば問題ありません。ただし防具に関しては各部位を最低2つずつは作っておくと良いでしょう。
サンプル素材の画像も添付していますが、同じように作成する必要はありません。

それではScriptableObjectsフォルダにItemsフォルダを作成し、その中にアイテムデータを作成してきましょう。
武器アイテムを作る
Icon Sprite(アイテムアイコン)は適当な正方形の画像を指定すればOKです。素材はTextures/ItemIcons以下にあります。沢山のアイコン画像素材が1つの画像ファイルにまとめています。その中の1つを選択して使用するのが簡単です。
Weapon Power(攻撃力)は適当に1~2ケタ程度の数値を入力すればOKです。バランス調整は後から行えば大丈夫です。
Weight(重量)は、ここに入力した値分だけ装備時に速度が低下します。あまり大きい値を入れると行動順が回ってこなくなりアクターがいつまで経っても行動できなくなるので気を付けましょう。
弓矢などの遠距離武器にはIs Rangedフラグをオンにします。

Weaponsフォルダを作成し、近接武器、魔法武器、遠距離武器を整理するためのフォルダを作成しておきました(整理の仕方は任意です)。
近接武器
ここでは近接武器を3種類作ります。Meleeフォルダで右クリックしてCreate > Dungeon > WeaponSOで作成します。入力データは以下の通り。

魔法武器
次は同じ要領で魔法武器を作ります。装備可能な職業を魔法使い系統にして近接武器との差別化を図ります。

遠距離武器
最後に遠距離武器を作ります。遠距離攻撃フラグをONにしておきます。

ここまででサンプルの武器データの作成は完了です。
防具アイテムを作る
Itemsフォルダの中にArmorsフォルダを作成し、その中にHead、Torso、Legs、LeftHandのフォルダを作成します。

Scriptable ObjectはArmorSOで作成します。
その他のアイテム作成時の設定は武器と同じような設定で問題ありません。
ただしArmor Typeパラメータ(装備部位)の指定は忘れないようにしましょう。
Head・Torso・Legs・Left Handの4種類から指定します。
Resists(属性耐性)パラメータから、選んだ属性の耐性値を増減させられます。1にすれば完全耐性(ダメージ0)になり、-1にすれば弱点(ダメージ2倍)になります。
Head(頭)
頭に付ける防具の作成をしていきます。装備部位をHeadにして必要項目を入力します。

Torso(胴体)
装備部位をTorsoにします。

最後の東洋の巫女装束では各種属性攻撃を半減させる効果を付与しています。
Legs(脚)
装備部位をLegにします。

Left Hand(左手)
装備部位をLeftHandにします。

ここまででサンプルの防具データの作成は完了です。
消費アイテムを作る
最後に武器や防具とは異なるタイプのアイテムを作成していきます。
先述した通り、
- ダンジョン探索中に使用できるアイテム
- 武器や防具のショップ解放用の素材
- その他の所有アイテム
の3種類を作れるようにアイテムシステムを構築していきます。
まずはItemsフォルダの中にConsumablesというフォルダを作成し、その中に以下のように3つのフォルダを作成しましょう(名称などは任意です)。

このScriptable Objectの構造は以下のようになっています。

基礎データは武器や防具と同じですが、一部異なるパラメータを用意しています。
Consumable Item Typeパラメータではその消費アイテムの種類を指定します。
Combatなら戦闘中に使用可能、Dungeonならダンジョン探索中に使用可能なアイテムとなります。
Bothを指定すれば両方のタイミングで使用できます。
EffectTypeに先ほどConsumableItemDataクラスで定義した”HealHP“か”HealTP“を入力することでそれぞれHP回復効果・TP回復効果を持たせることが可能です。Effect Valueはその回復量になります。
ただしすぐに動作を実装しないため後回しでもOKです。
ちなみに説明文章に{0}を含めるとその部分が効果量に上書きされます。
Material、Otherに指定すると使用不可のアイテムになります。Buy Priceを設定すればお店では売ることが可能です。Materialは合成素材のアイテムを作る場合に指定します。
このようなアイテムシステムは3DダンジョンRPG制作に限らず、あらゆるジャンルのRPGを作るときに使えると思います。ぜひマスターしてみてください!
戦闘・ダンジョン両方で使えるアイテム
ForUseフォルダにScriptable Objectを作成します。

素材
素材はMaterialsフォルダに作成します。

その他(任意)
最後にサンプルとしてOthersフォルダに一つアイテムを作成しておきます。

ここまででアイテムデータの作成は完了です。
所持アイテム管理処理をC#スクリプトで実装
Dataクラス内にどのアイテムをいくつ所持しているかの情報を記録できるようにします。
アイテムデータと所持数を対応させるクラスを作成して管理します。(Dictionaryで実装しても同じことが実現可能です)
Data.cs
まとめ

戦闘への反映およびアイテム入手手段などの実装がまだですが、ひとまず基礎的なアイテム機能の実装が完了しました。
次章でも引き続きアイテム周りの実装を進めていき、ショップでGoldを消費してアイテムをこうy乳できるようにします。
次の記事:

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






コメント