【Unity】RPG制作 その4-アイテムマネージャー作成
今回はアイテムを管理する仕組みを作っていきます。
まずはじめに、ヒエラルキー上で空のゲームオブジェクトを作成し、名前をItemManagerにします。次に新しくスクリプトを作成し、名前をItemManagerにして、ゲームオブジェクトItemManagerに貼り付けます。
ItemManager.csを開き以下のように編集します。
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; //主にアイテムの所持数を管理 public class ItemManager : MonoBehaviour { //シングルトン(すべてのシーンで共有する)) public static ItemManager instance; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(this.gameObject); } else { Destroy(this.gameObject); } } //--シングルトン終わり-- public ItemData[] itemDatas; // アイテムの種類を設定 public enum Item { Yakusou, //(薬草)HPを20回復する High_Yakusou,//(高級薬草)HPを50回復する TPCharge, //(TPチャージ)TPを10回復するドリンク High_TPCharge, //(高級TPチャージ)TPを30回復するドリンク Pointed_Stone, //(尖った石)使うと相手にダメージ。基本値5。飛んでいる敵に強打(×2) Burn_Stone, //(燃焼石)使うと相手に火属性のダメージ。基本値15。使用者の魔力が高いとダメージが上がる。(×1.1) Water_Stone, //(含水石)使うと相手に水属性のダメージ。基本値10。使用者の魔力が高いとダメージが上がる。(×1.15) Poison_Ball, //(毒玉)使うと相手を確率で毒状態にする。 Paralyzed_Ball, //(麻痺玉)使うと相手を確率で麻痺状態にする。 Sleep_Ball, //(眠り玉)使うと相手を確立で睡眠状態にする。 UltraSound_Generator, //(超音波発生装置)使うと相手を確率で混乱にする。 Care_Poson, //(解毒剤)毒を治療する。 Care_Paralyzed, //(麻痺治療剤)麻痺を治療する。 Alarm_Clock, //(目覚まし時計)睡眠解除。 Panacea, //(万能薬)すべての状態異常を解除。 Hardener, //(硬化薬)5ターンの間、防御力20%アップ。戦闘中のみの効果 Protein, //(プロテイン)5ターンの間、攻撃力20%アップ。戦闘中のみの効果 ConcentrationUp, //(コンセントレートアップ)5ターンの間、命中率+20%。戦闘中のみの効果 SpeedUp, //(スピードアップ)5ターンの間、回避率+10%アップ。戦闘中のみの効果 Super_Aim, //(スーパーエイム)5ターンの間、クリティカル率+20%。戦闘中のみの効果 Magic_Spray, //(マジックスプレー)探索時に使用可能。10ターンの間、敵と遭遇しにくくなる。 Cleanness, //(透明薬)探索時に使用可能。5ターンの間敵に遭遇しない。 Spirit_Ring, //(気合のリング)装備していると一度だけ、HP1でダメージを耐える。 Resuscitation_Drug, //(蘇生薬)戦闘不能になった味方を蘇生する。(一人では使えない) Recovery_Crystal, //(回復結晶)HPを50、TPを30回復する。貴重品。 Attack_Crystal, //(攻撃結晶)攻撃力を2上げる(永久)。貴重品。 Defense_Crystal, //(防御結晶)防御力を2上げる(永久)。貴重品。 Magical_Crystal, //(魔力結晶)魔力を2上げる(永久)。貴重品。 FireArc_Magic_Book, //(ファイアアークの魔法書)ファイアアークの魔法書。読むとファイアアークのストックが増える。(3~5)学力が足りないと失敗することがある。 WindCutter_Magic_Book, //(ウィンドカッターの魔法書)ウィンドカッターの魔法書。読むとウィンドカッターのストックが増える。(3~5)学力が足りないと失敗することがある。 SparkBall_Magic_Book, //(スパークボールの魔法書)スパークボールの魔法書。読むとスパークボールのストックが増える。(3~5)学力が足りないと失敗することがある。 AquaLinear_Magic_Book, //(アクアリニアーの魔法書)アクアリニアーの魔法書。読むとアクアリニアーのストックが増える。(3~5)学力が足りないと失敗することがある。 IceMissile_Magic_Book, //(アイスミサイルの魔法書)アイスミサイルの魔法書。読むとアイスミサイルのストックが増える。(3~5)学力が足りないと失敗することがある。 MagmaWave_Magic_Book, //(マグマウェイブの魔法書)マグマウェイブの魔法書。読むとマグマウェイブのストックが増える。(3~5)学力が足りないと失敗することがある。 ParallelRay_Magic_Book, //(パラレルレイの魔法書)パラレルレイの魔法書。読むとパラレルレイのストックが増える。(2~4)学力が足りないと失敗することがある。 AbyssalShot_Magic_Book, //(アビシャルショットの魔法書)アビシャルショットの魔法書。読むとアビシャルショットのストックが増える。(2~4)学力が足りないと失敗することがある。 PoisonArrow_Magic_Book, //(毒矢の魔法書)毒矢の魔法書。読むと毒矢の魔法のストックが増える。(3~5)学力が足りないと失敗することがある。 }; public enum WeaponItem { Knife, //(ナイフ)装備すると攻撃力が2上がる Air_Knife, //(エアナイフ)装備すると攻撃力が3上がる。通常攻撃に風属性付与。 Sword,//(ソード)装備すると攻撃力が3上がり、命中率が2下がる LongSword, //(ロングソード)装備すると攻撃力が5上がり、命中率が4下がる。 Axe, //(斧)装備すると攻撃力が5上がるが、命中率が10下がる Book, //(本)装備すると攻撃力が1、魔力が2上がる } public enum ArmorItem { PaperHat, //(紙の帽子)防御力+1 炎耐性-15,水耐性-20 ClothHat, //(布の帽子) 防御力+2,炎耐性-10,氷耐性+10 LeatherHat, //(皮の帽子) 防御力+3 WoodenHat, //(木の帽子) 防御力+4,炎耐性-10 Bronze, //(ブロンズヘルム) 防御力+6,電気耐性-15 IronHelm, //(アイアンヘルム)防御力+9,電気耐性-10 ClothClothes, //(布の服)防御力+2,炎耐性-10,氷耐性+10 DurableClothes, //(丈夫な服)防御力+4,氷耐性+10 BronzeArmor, //(ブロンズアーマー)防御力+8,電気耐性-15 IronArmor, //(アイアンアーマー)防御力+12,電気耐性-10 ChainArmor, //(チェインアーマー)防御力+20,電気耐性-10 Robe, //(ローブ)防御力+2,魔力+2,炎耐性+10,氷耐性+10 HiGradeRobe, //(高品質のローブ)防御力+4,魔力+4,炎耐性+15,氷耐性+15,雷耐性+10, AquaRobe, //(アクアローブ)防御力+10,魔力+15,水耐性+30 WoodenShield, //(ウッドシールド)防御力+3,炎耐性-10 BronzeShield, //(ブロンズシールド)防御力+5,雷耐性-10 IronShield, //(アイアンシールド)防御力+8,雷耐性-10 Buckler, //(バックラー)防御力+3,回避率+2% } public enum FoodItem { Apple, //(りんご)果物ランク2 Orange, //(オレンジ)果物ランク2 Grape, //(ぶどう)果物 ランク3 Cherry, //(さくらんぼ)果物 ランク1 Melon, //(メロン)果物 ランク5 Watermelon, //(スイカ)果物 ランク4 Strawberry, //(イチゴ)果物 ランク3 Lemon, //(レモン)果物 ランク2 Daikon, //(大根)野菜 ランク2 Negi, //(ネギ)野菜 ランク1 Carrot, //(人参)野菜 ランク2 Pumpkin, //(かぼちゃ)野菜 ランク3 Potatoes, //(じゃがいも)野菜 ランク3 Asparagus, //(アスパラガス)野菜 ランク4 Cabbage, //(キャベツ)野菜 ランク5 Lettuce, //(レタス)野菜 ランク5 Iwashi, //(いわし)魚 ランク1 Medaka, //(めだか)魚 ランク1 Salmon, //(鮭)魚 Saba, //(鯖)魚 ランク4 SeaBream, //(鯛)魚 ランク5 Squid, //(イカ)魚 ランク5 Suzuki, //(鱸)魚 ランク6 Tako, //(タコ)魚 ランク7 Tuna, //(マグロ)魚 ランク9 Whale, //(鯨)魚 ランク10 } //ゲームを進める鍵となるアイテム public enum KeyItem { RootMapOfCave, //(洞窟の地図)洞窟までの経路が描かれた地図。洞窟を探索できるようになる。 PassagePermitOfEastGate, //(通行許可証(東門))東門を通るための通行許可証。東の草原を探索できるようになる。 RootMapOfOldTower, //(古塔の地図)古塔までの経路が描かれた地図。古塔を探索できるようになる。 } Dictionary<Item, int> itemDictionary = new Dictionary<Item, int>(); public Dictionary<Item, ItemData> itemDataDic = new Dictionary<Item, ItemData>(); Dictionary<WeaponItem, int> weaponDictionary = new Dictionary<WeaponItem, int>(); Dictionary<ArmorItem, int> armorDictionary = new Dictionary<ArmorItem, int>(); Dictionary<KeyItem, bool> keyItemDictionary = new Dictionary<KeyItem, bool>(); // Use this for initialization void Start() { itemDictionary[Item.Yakusou] = 3; //薬草の所持数を3個に設定 itemDictionary[Item.TPCharge] = 2; //TPチャージの所持数を2個に設定 weaponDictionary[WeaponItem.Knife] = 1; //ナイフの所持数を1個に設定 armorDictionary[ArmorItem.ClothClothes] = 1; //布の服の所持数を1個に設定 armorDictionary[ArmorItem.WoodenShield] = 1; //ウッドシールドの所持数を1個に設定 foreach (var item in itemDictionary) { Debug.Log(item.Key + " : " + GetNum(item.Key)); } } // アイテムをどれだけ持っているかの数を返す public int GetNum(Item key) { return itemDictionary[key]; //keyのアイテムは何個かを返す } //アイテムの所持数を増やす public void AddItem(Item key) { itemDictionary[key] += 1; } //アイテムの所持数を減らす public void SubItem(Item key) { itemDictionary[key] -= 1; } //武器の所持数を増やす public void AddWeaponItem(WeaponItem key) { weaponDictionary[key] += 1; } //武器の所持数を減らす public void SubWeaponItem(WeaponItem key) { weaponDictionary[key] -= 1; } //防具の所持数を増やす public void AddArmorItem(ArmorItem key) { armorDictionary[key] += 1; } //防具の所持数を減らす public void SubArmorItem(ArmorItem key) { armorDictionary[key] -= 1; } //キーアイテムの所持の有無をセットする関数 public void SetHaveKeyItem(KeyItem key, bool bHave) { keyItemDictionary[key] = bHave; } public bool GetHaveKeyItem(KeyItem key) { return keyItemDictionary[key]; } //指定したアイテムを持っているかどうかを返す関数 public bool IsHaveItem(Item key) { if (itemDictionary[key] > 0) { return true; } else { return false; } } //指定した武器を持っているかどうか返す関数 public bool IsHaveWeaponItem(WeaponItem key) { if (weaponDictionary[key] > 0) { return true; } else { return false; } } //指定した防具を持っているかどうか返す関数 public bool IsHaveArmorItem(ArmorItem key) { if (armorDictionary[key] > 0) { return true; } else { return false; } } }
ItemManagerではアイテムの所持数を管理します。所持数を保持するのにDictionary型を使用しています。列挙型のItemをキーにし、そのキーを使用することによってアイテムの所持数を取得することができます。取り敢えずDictionaryには実装しそうなアイテムを適当に突っ込んでいます。
次に個々のアイテムの情報を保持するItemData,WeaponData,ArmorDataスクリプトを新規に作成し、以下のように編集します。
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemData : MonoBehaviour { public GameObject effect; //使用時に再生するエフェクト(プレハブを入れる) //主に攻撃アイテムの場合の属性 public enum ELEMENT { NONE, //無属性 FIRE, //火属性 WIND, //風属性 GROUND, //大地属性 THUNDER, //雷属性 AQUA, //水属性 ICE, //氷属性 LIGHT, //光属性 DARK, //闇属性 } public enum STATUSCONDITION { ALL, NONE, POISON, //毒 (毎ターンダメージ。戦闘が終わっても治らない。) BLIND, //盲目(通常攻撃の命中率大幅ダウン(3分の1)) PARALYSIS, //麻痺(数ターン身動きができない。魔法の詠唱は出来る。) SLEEP, //睡眠(数ターン行動できない。攻撃を受けると高確率で起きる。) CONFUSION, //混乱 (数ターン敵味方判別せずに通常攻撃する。敵から攻撃を受けると解除する時がある。) BURN, //燃焼 FROZEN, //凍結 (数ターン動けない) } public enum ITEMTYPE //アイテムの種類(攻撃化回復か) { HEAL, //回復アイテム ATTACK, //攻撃アイテム BOOKOFMAGIC, //魔導書 MAGICWAND, //魔法の杖 FOOD, //食べ物 } public enum AVAILABLESCENES //使用可能な場面の列挙型 { QUESTONLY, BATTLEONLY, QUESTANDBATTLE, } public enum ITEMTARGET { OneOfAllies, //味方一人 AllOfAllies, //味方全員 OneOfEnemy, //敵一人 AllOfEnemy, //敵全員 AllOfBattlers,//敵味方全員 UserHimself, //使用者自身 } [Header("アイテム識別変数")] public ItemManager.Item itemID = ItemManager.Item.Yakusou; [Header("アイテムの説明")] public string explanation = ""; [Header("アイテム名")] public string itemName; [Header("アイテムの種類")] public ITEMTYPE itemType;//インスペクターでアイテムタイプの設定ができる。 [Header("属性")] public ELEMENT element = ELEMENT.NONE; [Header("HP回復量(固定量)")] public int healHPPoint = 0; [Header("MP回復量(固定量)")] public int healMPPoint = 0; [Header("TP回復量(固定量)")] public int healTPPoint = 0; [Header("HP回復率(最大の何%か)")] public int HPHealRateValue = 0; [Header("MP回復率(最大の何%か)")] public int MPHealRateValue = 0; [Header("TP回復率(最大の何%か)")] public int TPHealRateValue = 0; [Header("HPダメージ量(固定量)")] public int HPDamageValue = 0; [Header("MPダメージ量(固定量)")] public int MPDamageValue = 0; [Header("TPダメージ量(固定量)")] public int TPDamageValue = 0; [Header("使用可能回数")] public int canUseTime = 1; //何回使用したらなくなるか [Header("効果対象")] public ITEMTARGET target = ITEMTARGET.OneOfAllies; [Header("使用時のメッセージ")] public string useMessage = "を使った!"; [Header("回復する状態異常1")] public STATUSCONDITION careCondition1 = STATUSCONDITION.NONE; [Header("回復する状態異常2")] public STATUSCONDITION careCondition2 = STATUSCONDITION.NONE; [Header("回復する状態異常3")] public STATUSCONDITION careCondition3 = STATUSCONDITION.NONE; [Header("アイテム使用後のメッセージ(探索時)")] public string AfterUseMessage_Quest = ""; [Header("アイテム使用後のメッセージ(戦闘時)")] public string AfterUseMessage_Battle = ""; [Header("基本販売価格")] public int price = 10; [Header("使用時のSE")] public int UseSEID = 0; }
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; public class WeaponData : MonoBehaviour { public enum WEAPONTYPE { Dagger, //短剣 Sword, //剣 Spear, //槍 Club, //棍棒 Axe, //斧 Bow, //弓 Wand, //杖 Nail, //爪 Gun, //銃 } public enum EQUIPPART { RIGHTHAND, LEFTHAND, BOTHHANDS, //両手持ち。このタイプの武器を装備すると盾などの装備は外れる } //主に攻撃アイテムの場合の属性 public enum ELEMENT { NONE, //無属性 FIRE, //火属性 WIND, //風属性 GROUND, //大地属性 THUNDER, //雷属性 AQUA, //水属性 ICE, //氷属性 LIGHT, //光属性 DARK, //闇属性 DRAGON, //龍属性 SOUND, //音属性 STAR, //星属性 } public enum STATUSCONDITION { ALL, NONE, POISON, //毒 (毎ターンダメージ。戦闘が終わっても治らない。) BLIND, //盲目(通常攻撃の命中率大幅ダウン(3分の1)) PARALYSIS, //麻痺(数ターン身動きができない。魔法の詠唱は出来る。) SLEEP, //睡眠(数ターン行動できない。攻撃を受けると高確率で起きる。) CONFUSION, //混乱 (数ターン敵味方判別せずに通常攻撃する。敵から攻撃を受けると解除する時がある。) BURN, //燃焼 FROZEN, //凍結 (数ターン動けない) } [Header("武器識別変数")]public ItemManager.WeaponItem weaponID = ItemManager.WeaponItem.Knife; //アイテムの識別変数 [Header("武器の説明")]public string explanation = ""; [Header("装備のタイプ")]public WEAPONTYPE weaponType = WEAPONTYPE.Dagger; [Header("装備部位")]public EQUIPPART equipPart = EQUIPPART.RIGHTHAND; [Header("攻撃アニメーション")]public GameObject attackAnimation = null; [Header("MaxHP変化量")]public int changeMaxHP = 0; [Header("MaxMP変化量")]public int changeMaxMP = 0; [Header("MaxTP変化量")]public int changeMaxTP = 0; [Header("攻撃力変化量")]public int changeAtk = 0; [Header("防御力変化量")]public int changeDef = 0; [Header("速さ変化量")]public int changeAgi = 0; [Header("運の良さ変化量")]public int changeLuk = 0; [Header("感覚の鋭さ変化量")]public int changeSence = 0; [Header("命中率変化量")]public int changeHitRate = 0; [Header("回避率変化量")]public int changeEvasionRate = 0; [Header("魔力変化量")]public int changeMagPowRate = 0; [Header("習得力変化量")]public int changeLearnAbiRate = 0; [Header("クリティカル率変化量")]public int changeCriticalRate = 0; [Header("基本販売価格")]public int price = 0; [Header("アイテムとして使えるか?(1:使える,0:使えない)")] public int canUseForItem = 0; [Header("付与ステータス状態1")]public STATUSCONDITION addStatusCondi1 = STATUSCONDITION.NONE; [Header("付与確率1")] public int addProbability1 = 0; [Header("付与ステータス状態2")]public STATUSCONDITION addStatusCondi2 = STATUSCONDITION.NONE; [Header("付与確率2")] public int addProbability2 = 0; [Header("付与ステータス状態3")]public STATUSCONDITION addStatusCondi3 = STATUSCONDITION.NONE; [Header("付与確率3")] public int addProbability3 = 0; }
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ArmorData : MonoBehaviour { public enum EQUIPTYPE { CLOTHES, ARMOR, ROBE, SHIELD, GREATSHIELD, HAT, HELM, } public enum EQUIPPART //装備スロットの列挙型定数 New { RIGHTHAND, LEFTHAND, HEAD, BODY, WEIST, LEG, ACCESSORIES1, ACCESSORIES2, } public enum ELEMENT { NONE, //無属性 FIRE, //火属性 WIND, //風属性 GROUND, //大地属性 THUNDER, //雷属性 AQUA, //水属性 ICE, //氷属性 LIGHT, //光属性 DARK, //闇属性 DRAGON, //龍属性 SOUND, //音属性 STAR, //星属性 ALL, //全属性 } public enum STATUSCONDITION { ALL, NONE, POISON, //毒 (毎ターンダメージ。戦闘が終わっても治らない。) BLIND, //盲目(通常攻撃の命中率大幅ダウン(3分の1)) PARALYSIS, //麻痺(数ターン身動きができない。魔法の詠唱は出来る。) SLEEP, //睡眠(数ターン行動できない。攻撃を受けると高確率で起きる。) CONFUSION, //混乱 (数ターン敵味方判別せずに通常攻撃する。敵から攻撃を受けると解除する時がある。) BURN, //燃焼 FROZEN, //凍結 (数ターン動けない) } [Header("防具識別変数")] public ItemManager.ArmorItem armorID = ItemManager.ArmorItem.PaperHat; [Header("防具の名前")] public string itemName = ""; [Header("アイテムの説明")] public string explanation = ""; [Header("装備タイプ")] public EQUIPTYPE equipType = EQUIPTYPE.SHIELD; [Header("装備部位")] public EQUIPPART equipPart = EQUIPPART.HEAD; [Header("MaxHP変化量")] public int changeMaxHP = 0; [Header("MaxMP変化量")] public int changeMaxMP = 0; [Header("MaxTP変化量")] public int changeMaxTP = 0; [Header("攻撃力変化量")] public int changeAtk = 0; [Header("防御力変化量")] public int changeDef = 0; [Header("速さ変化量")] public int changeAgi = 0; [Header("運の良さ変化量")] public int changeLuk = 0; [Header("感覚の鋭さ変化量")] public int changeSence = 0; [Header("命中率変化量")] public int changeHitRate = 0; [Header("回避率変化量")] public int changeEvasionRate = 0; [Header("魔力変化量")] public int changeMagPowRate = 0; [Header("習得力変化量")] public int changeLearnAbiRate = 0; [Header("クリティカル率変化量")] public int changeCriticalRate = 0; [Header("基本販売価格")] public int price = 0; [Header("アイテムとして使えるか?(1:使える,0:使えない)")] public int canUseForItem = 0; [Header("使用時の文章(探索時)")] public string useMessage_quest = ""; [Header("使用時の文章(戦闘時)")] public string useMessage_battle = ""; [Header("使用後のアイテム変化")] public ItemManager.ArmorItem changeItemAfterUse; [Header("属性耐性1")] public ELEMENT resiElement1; [Header("|__防御率(%)")] public int resiValueOfElement1; [Header("属性耐性2")] public ELEMENT resiElement2; [Header("|__防御率(%)")] public int resiValueOfElement2; [Header("属性耐性3")] public ELEMENT resiElement3; [Header("|__防御率(%)")] public int resiValueOfElement3; [Header("状態耐性1")] public STATUSCONDITION resiStatusCondi1; [Header("|__防御率(%)")] public int resiValueOfCondi1; [Header("状態耐性2")] public STATUSCONDITION resiStatusCondi2; [Header("|__防御率(%)")] public int resiValueOfCondi2; [Header("状態耐性3")] public STATUSCONDITION resiStatusCondi3; [Header("|__防御率(%)")] public int resiValueOfCondi3; }
この3つのスクリプトを貼り付けたゲームオブジェクトをアイテムのデータとしてインスペクターに適当な値を入れ、プレハブにしておきます。
アイテムのデータをゲットするときはこのプレハブから情報を入手するようにしたいので、ItemManagerにItemData型の配列を宣言し、その配列に先ほど作成したプレハブを持たせておきます。
次回はアイテムを戦闘中に使用できるようにアイテム用のUIとそれを制御するためのスクリプトを作成していきます。