【Unity】RPG制作 その24-武器、防具アイテム実装
今回からは武器と防具の実装をやっていきたいと思います。
過去の記事(RPG制作 その4)で作成したWeaponData、ArmorDataクラスを武器と防具のベースのデータに使います。少し修正もしておきます。
クリックで展開
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, //両手持ち。このタイプの武器を装備すると盾などの装備は外れる } [Header("武器識別変数")]public ItemManager.WeaponItem weaponID = ItemManager.WeaponItem.Knife; //アイテムの識別変数 [Header("武器のアイコン")] public Sprite weaponSprite; [Header("武器の説明")]public string explanation = ""; [Header("武器の名前")] public string weaponName; [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 changeMagPow = 0; [Header("習得力変化量")]public int changeLearnAbi = 0; [Header("クリティカル率変化量")]public int changeCriticalRate = 0; [Header("基本販売価格")]public int price = 0; [Header("アイテムとして使えるか?(1:使える,0:使えない)")] public int canUseForItem = 0; //--------STATUSCONDITIONからGeneralEnum.STATUSCONDITIONに変更 [Header("付与ステータス状態1")]public GeneralEnum.STATUSCONDITION addStatusCondi1 = GeneralEnum.STATUSCONDITION.NONE; [Header("付与確率1")] public int addProbability1 = 0; [Header("付与ステータス状態2")]public GeneralEnum.STATUSCONDITION addStatusCondi2 = GeneralEnum.STATUSCONDITION.NONE; [Header("付与確率2")] public int addProbability2 = 0; [Header("付与ステータス状態3")]public GeneralEnum.STATUSCONDITION addStatusCondi3 = GeneralEnum.STATUSCONDITION.NONE; [Header("付与確率3")] public int addProbability3 = 0; //-------------------------------------------------- //-----------------------New--------------------- [Header("付与属性1")]public GeneralEnum.ELEMENT addElement1 = GeneralEnum.ELEMENT.NONE; [Header("付与属性2")] public GeneralEnum.ELEMENT addElement2 = GeneralEnum.ELEMENT.NONE; [Header("エンチャントスロット数")] public int slotCount = 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, } [Header("防具識別変数")] public ItemManager.ArmorItem armorID = ItemManager.ArmorItem.紙の帽子; [Header("防具のアイコン")] public Sprite armorSprite; [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 changeMagPow = 0; [Header("習得力変化量")] public int changeLearnAbi = 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; //----------ELEMENTをGeneralEnum.ELEMENTに変更--------- [Header("属性耐性1")] public GeneralEnum.ELEMENT resiElement1; [Header("|__防御率(%)")] public int resiValueOfElement1; [Header("属性耐性2")] public GeneralEnum.ELEMENT resiElement2; [Header("|__防御率(%)")] public int resiValueOfElement2; [Header("属性耐性3")] public GeneralEnum.ELEMENT resiElement3; [Header("|__防御率(%)")] public int resiValueOfElement3; //------------------------------------------------- //----------STATUSCONDITIONをGeneralEnum.STATUSCONDITIONに変更------ [Header("状態耐性1")] public GeneralEnum.STATUSCONDITION resiStatusCondi1; [Header("|__防御率(%)")] public int resiValueOfCondi1; [Header("状態耐性2")] public GeneralEnum.STATUSCONDITION resiStatusCondi2; [Header("|__防御率(%)")] public int resiValueOfCondi2; [Header("状態耐性3")] public GeneralEnum.STATUSCONDITION resiStatusCondi3; [Header("|__防御率(%)")] public int resiValueOfCondi3; //------------------------------------------------------ [Header("エンチャントスロット数")] public int slotNumber = 0; //New }
これらのデータをもとに作成される武器、防具の個体データを扱うクラス、WeaponEntityとArmorEntityを作成します。
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; //WeaponDataをもとに作成される武器の個体クラス public class WeaponEntity : MonoBehaviour { public enum ENCHANTMENTTYPE { EMPTY, //空きスロット NONE,//使えないスロット MAXHP_PLUS,//MAXHP増加 MAXMP_PLUS,//MAXMP増加 MAXTP_PLUS,//MAXTP増加 ATK_PLUS,//攻撃力増加 DEF_PLUS, //防御力増加 AGI_PLUS, //速さ増加 LUK_PLUS, //運の良さ増加 SENCE_PLUS, //感覚の鋭さ増加 HITRATE_PLUS,//命中率増加 EVASIONRATE_PLUS,//回避率増加 MAGPOW_PLUS, //魔力増加 LEARNABI_PLUS, //習得増加 MAXHP_MINUS,//MAXHP減少 MAXMP_MINUS,//MAXMP減少 MAXTP_MINUS,//MAXTP減少 ATK_MINUS,//攻撃力減少 DEF_MINUS, //防御力減少 AGI_MINUS, //速さ減少 LUK_MINUS, //運の良さ減少 SENCE_MINUS, //感覚の鋭さ減少 HITRATE_MINUS,//命中率減少 EVASIONRATE_MINUS,//回避率減少 MAGPOW_MINUS, //魔力減少 LEARNABI_MINUS, //習得減少 } //武器識別変数、各ステータスの変化量、販売価格、アイテムとして使えるか、付与ステータス1~3及び付与確率 [System.NonSerialized] public bool isRegistry = false; [System.NonSerialized] public ItemManager.WeaponItem weaponID; //武器の識別変数 [System.NonSerialized] public int changeMaxHP;//MaxHP変化量 [System.NonSerialized] public int changeMaxMP;//MaxMP変化量 [System.NonSerialized] public int changeMaxTP;//MaxTP変化量 [System.NonSerialized] public int changeAtk;//攻撃力変化量 [System.NonSerialized] public int changeDef;//防御力変化量 [System.NonSerialized] public int changeAgi;//速さ変化量 [System.NonSerialized] public int changeLuk;//運の良さ変化量 [System.NonSerialized] public int changeSence;//感覚の鋭さ変化量 [System.NonSerialized] public int changeHitRate;//命中率変化量 [System.NonSerialized] public int changeEvasionRate;//回避率変化量 [System.NonSerialized] public int changeMagPow;//魔力変化量 [System.NonSerialized] public int changeLearnAbi;//習得力変化量 [System.NonSerialized] public int changeCriticalRate;//クリティカル率変化量 [System.NonSerialized] public int price;//この武器個体の販売価格 [System.NonSerialized] public GeneralEnum.STATUSCONDITION addStatusCondi1;//付与状態異常1 public int addProbability1;//付与確率1 [System.NonSerialized] public GeneralEnum.STATUSCONDITION addStatusCondi2;//付与状態異常2 public int addProbability2;//付与確率2 [System.NonSerialized] public GeneralEnum.STATUSCONDITION addStatusCondi3;//付与状態異常3 public int addProbability3;//付与確率3 //-------ここまではWeaponDataをもとに数値を決める //-------ここからはWeaponDataの数値によらない変数 [System.NonSerialized] public int enhancementValue;//武器個体の強化値 [System.NonSerialized] public int slotCount;//武器個体のエンチャントスロット数 [System.NonSerialized] public ENCHANTMENTTYPE[] enchantSlots = new ENCHANTMENTTYPE[10]; //エンチャントスロットの配列 void Start() { } void Update() { } /// <summary> /// WeaponDataをもとにWeaponEntityを初期化する /// </summary> public void InitWeaponEntity(WeaponData weaponData) { weaponID = weaponData.weaponID; changeMaxHP = weaponData.changeMaxHP; changeMaxMP = weaponData.changeMaxMP; changeMaxTP = weaponData.changeMaxTP; changeAtk = weaponData.changeAtk; changeDef = weaponData.changeDef; changeAgi = weaponData.changeAgi; changeLuk = weaponData.changeLuk; changeSence = weaponData.changeSence; changeHitRate = weaponData.changeHitRate; changeEvasionRate = weaponData.changeEvasionRate; changeMagPow = weaponData.changeMagPow; changeLearnAbi = weaponData.changeLearnAbi; changeCriticalRate = weaponData.changeCriticalRate; price = weaponData.price; addStatusCondi1 = weaponData.addStatusCondi1; addProbability1 = weaponData.addProbability1; addStatusCondi2 = weaponData.addStatusCondi2; addProbability2 = weaponData.addProbability2; addStatusCondi3 = weaponData.addStatusCondi3; addProbability3 = weaponData.addProbability3; for (int i = 0; i < 10; i++) { enchantSlots[i] = ENCHANTMENTTYPE.NONE; } slotCount = weaponData.slotCount; if(slotCount > 0) { for(int i = 0;i < slotCount; i++) { enchantSlots[i] = ENCHANTMENTTYPE.EMPTY; } } } }
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ArmorEntity : MonoBehaviour { public enum ENCHANTMENTTYPE { EMPTY, //空きスロット NONE,//使えないスロット MAXHP_PLUS,//MAXHP増加 MAXMP_PLUS,//MAXMP増加 MAXTP_PLUS,//MAXTP増加 ATK_PLUS,//攻撃力増加 DEF_PLUS, //防御力増加 AGI_PLUS, //速さ増加 LUK_PLUS, //運の良さ増加 SENCE_PLUS, //感覚の鋭さ増加 HITRATE_PLUS,//命中率増加 EVASIONRATE_PLUS,//回避率増加 MAGPOW_PLUS, //魔力増加 LEARNABI_PLUS, //習得増加 MAXHP_MINUS,//MAXHP減少 MAXMP_MINUS,//MAXMP減少 MAXTP_MINUS,//MAXTP減少 ATK_MINUS,//攻撃力減少 DEF_MINUS, //防御力減少 AGI_MINUS, //速さ減少 LUK_MINUS, //運の良さ減少 SENCE_MINUS, //感覚の鋭さ減少 HITRATE_MINUS,//命中率減少 EVASIONRATE_MINUS,//回避率減少 MAGPOW_MINUS, //魔力減少 LEARNABI_MINUS, //習得減少 } [System.NonSerialized] public bool isRegistry = false;//ArmorData登録済みか? [System.NonSerialized] public ItemManager.ArmorItem armorID; //防具の識別変数 [System.NonSerialized] public int changeMaxHP;//MaxHP変化量 [System.NonSerialized] public int changeMaxMP;//MaxMP変化量 [System.NonSerialized] public int changeMaxTP;//MaxTP変化量 [System.NonSerialized] public int changeAtk; //攻撃力変化量 [System.NonSerialized] public int changeDef; //防御力変化量 [System.NonSerialized] public int changeAgi;//速さ変化量 [System.NonSerialized] public int changeLuk;//運の良さ変化量 [System.NonSerialized] public int changeSence;//感覚の鋭さ変化量 [System.NonSerialized] public int changeHitRate;//命中率変化量 [System.NonSerialized] public int changeEvasionRate;//回避率変化量 [System.NonSerialized] public int changeMagPow;//魔力変化量 [System.NonSerialized] public int changeLearnAbi;//習得変化量 [System.NonSerialized] public int changeCriticalRate;//クリティカル率変化量 [System.NonSerialized] public int price; //この防具個体の販売価格 [System.NonSerialized] public GeneralEnum.ELEMENT resiElement1;//属性耐性1 [System.NonSerialized] public int resiValueOfElement1;//属性耐性1変化量(%) [System.NonSerialized] public GeneralEnum.ELEMENT resiElement2;//属性耐性2 [System.NonSerialized] public int resiValueOfElement2;//属性耐性2変化量(%) [System.NonSerialized] public GeneralEnum.ELEMENT resiElement3;//属性耐性3 [System.NonSerialized] public int resiValueOfElement3;//属性耐性3変化量(%) [System.NonSerialized] public GeneralEnum.STATUSCONDITION resiStatusCondi1;//状態耐性1 [System.NonSerialized] public int resiValueOfCondi1;//状態耐性1変化量(%) [System.NonSerialized] public GeneralEnum.STATUSCONDITION resiStatusCondi2;//状態耐性2 [System.NonSerialized] public int resiValueOfCondi2;//状態耐性2変化量(%) [System.NonSerialized] public GeneralEnum.STATUSCONDITION resiStatusCondi3;//状態耐性3 [System.NonSerialized] public int resiValueOfCondi3;//状態耐性3変化量(%) //-------ここまではArmorDataをもとに数値を決める //-------ここからはArmorDataの数値によらない変数 [System.NonSerialized] public int enhancementValue;//防具個体の強化値 [System.NonSerialized] public int slotCount; //防具個体のエンチャントスロット数 [System.NonSerialized] public ENCHANTMENTTYPE[] enchantSlots = new ENCHANTMENTTYPE[10]; //エンチャントスロットの配列 // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } public void InitArmorEntity(ArmorData armorData) { isRegistry = true; armorID = armorData.armorID; changeMaxHP = armorData.changeMaxHP; changeMaxMP = armorData.changeMaxMP; changeMaxTP = armorData.changeMaxTP; changeAtk = armorData.changeAtk; changeDef = armorData.changeDef; changeAgi = armorData.changeAgi; changeLuk = armorData.changeLuk; changeSence = armorData.changeSence; changeHitRate = armorData.changeHitRate; changeEvasionRate = armorData.changeEvasionRate; changeMagPow = armorData.changeMagPow; changeLearnAbi = armorData.changeLearnAbi; changeCriticalRate = armorData.changeCriticalRate; price = armorData.price; resiElement1 = armorData.resiElement1; resiValueOfElement1 = armorData.resiValueOfElement1; resiElement2 = armorData.resiElement2; resiValueOfElement2 = armorData.resiValueOfElement2; resiElement3 = armorData.resiElement3; resiValueOfElement3 = armorData.resiValueOfElement3; resiStatusCondi1 = armorData.resiStatusCondi1; resiValueOfCondi1 = armorData.resiValueOfCondi1; resiStatusCondi2 = armorData.resiStatusCondi2; resiValueOfCondi2 = armorData.resiValueOfCondi2; resiStatusCondi3 = armorData.resiStatusCondi3; resiValueOfCondi3 = armorData.resiValueOfCondi3; for (int i = 0; i < 10; i++) { enchantSlots[i] = ENCHANTMENTTYPE.NONE; } slotCount = armorData.slotNumber; if (slotCount > 0) { for (int i = 0; i < slotCount; i++) { enchantSlots[i] = ENCHANTMENTTYPE.EMPTY; } } } }
実際に武器、防具を手に入れるイベントを作成します。イベントIDをそれぞれ13,14とします。DangeonController.csのInformDangeonEventコルーチンに処理を追加します。
クリックで展開
public IEnumerator InformDangeonEvent() { eventID = GetCurrentPosDangeonEventID(); DangeonEvent dangeonEvent = new DangeonEvent(); stageUIManager.isEventPosition = true; switch (eventID) { case -1://何もなし stageUIManager.isEventPosition = false; yield break; case 0://採掘イベントを知らせる StartCoroutine(dangeonEvent.IEInformMineEvent()); yield break; case 1://釣りイベントを知らせる StartCoroutine(dangeonEvent.IEInformFishingEvent()); yield break; case 2: //アイテムイベントを知らせる StartCoroutine(dangeonEvent.IEInformItemEvent()); yield break; case 3: //伐採イベントを知らせる StartCoroutine(dangeonEvent.IEInformLoggingEvent()); yield break; case 4: //金貨イベントを知らせる StartCoroutine(dangeonEvent.IEInformGoldEvent()); yield break; case 5: //下階段イベントを知らせる StartCoroutine(dangeonEvent.IEInformDownFloorEvent()); yield break; case 6: //上階段イベントを知らせる StartCoroutine(dangeonEvent.IEInformUpFloorEvent()); yield break; case 7: //トラップイベントを実行する yield return StartCoroutine(dangeonEvent.IETrapEvent(5,questManager,playerUIManager)); DeleteEvent(); stageUIManager.isEventPosition = false; dangionMap.ShowDangeonMapForSearching(); stageUIManager.ShowButtonsForSearching(); questManager.nowEvent = false; yield break; case 8: //スイッチで開く扉イベントを知らせる StartCoroutine(dangeonEvent.IEInformSwitchDoorEvent()); yield break; case 9://青いスイッチ(OFF)イベント StartCoroutine(dangeonEvent.IEInformOffBlueSwitchEvent()); yield break; case 10://青いスイッチ(ON)イベント StartCoroutine(dangeonEvent.IEInformOnBlueSwitchEvent()); yield break; case 11://ワープイベントを知らせる StartCoroutine(dangeonEvent.IEInformWarpEvent()); yield break; case 12: //帰還イベントを知らせる StartCoroutine(dangeonEvent.IEInformReturnTownEvent()); yield break; //--------------New----------- case 13://武器入手イベントを知らせる StartCoroutine(dangeonEvent.IEInformGetWeaponEvent()); yield break; case 14://防具入手イベントを知らせる StartCoroutine(dangeonEvent.IEInformGetArmorEvent()); yield break; //--------------Newここまで----------- } if (eventID != -1 && eventID != 7) { shouldActiveActionButton = true; } else { shouldActiveActionButton = false; } }
武器、防具入手イベント時に参照するWeaponGroupクラスとArmorGroupクラスを作成します。
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "weaponGroup", menuName = "ScriptableObject/weaponGroup")] public class WeaponGroup : ScriptableObject { public string groupName; public WeaponData weaponData1; public int gainProbability1 = 0; public WeaponData weaponData2; public int gainProbability2 = 0; public WeaponData weaponData3; public int gainProbability3 = 0; public WeaponData weaponData4; public int gainProbability4 = 0; public WeaponData weaponData5; public int gainProbability5 = 0; public bool usePriority = false; public int item1Priority = 0; public int item2Priority = 0; public int item3Priority = 0; public int item4Priority = 0; public int item5Priority = 0; public WeaponData DecideWeaponData() //weaponData1~5の中からランダムでWeaponDataを一つ入手する { WeaponData weaponData = null; int tempValue = 0; int tempValue2 = 0; int sumValue = 0; if (!usePriority) { int randValue = Random.Range(0, 101); if (0 <= randValue && randValue < gainProbability1) { weaponData = weaponData1; } else if (gainProbability1 <= randValue && randValue < gainProbability2) { weaponData = weaponData2; } else if (gainProbability2 <= randValue && randValue < gainProbability3) { weaponData = weaponData3; } else if (gainProbability3 <= randValue && randValue < gainProbability4) { weaponData = weaponData4; } else if (gainProbability4 <= randValue && randValue < gainProbability5) { weaponData = weaponData5; } else { weaponData = null; } } else//プライオリティーを使用する場合 { if (item1Priority > 0) { sumValue += Mathf.Clamp(item1Priority, 0, 100); } if (item2Priority > 0) { sumValue += Mathf.Clamp(item2Priority, 0, 100); } if (item3Priority > 0) { sumValue += Mathf.Clamp(item3Priority, 0, 100); } if (item4Priority > 0) { sumValue += Mathf.Clamp(item4Priority, 0, 100); } if (item5Priority > 0) { sumValue += Mathf.Clamp(item5Priority, 0, 100); } if (sumValue == 0) { sumValue = 1; } int randValue = Random.Range(0, sumValue); if (0 <= randValue && randValue < item1Priority) { weaponData = weaponData1; } tempValue += item1Priority; tempValue2 = tempValue + item2Priority; if (tempValue <= randValue && randValue < tempValue2) { weaponData = weaponData2; } tempValue += item2Priority; tempValue2 = tempValue + item3Priority; if (tempValue <= randValue && randValue < tempValue2) { weaponData = weaponData3; } tempValue += item3Priority; tempValue2 = tempValue + item4Priority; if (tempValue <= randValue && randValue < tempValue2) { weaponData = weaponData4; } tempValue += item4Priority; tempValue2 = tempValue + item5Priority; if (tempValue <= randValue && randValue < tempValue2) { weaponData = weaponData5; } if (weaponData == null) { weaponData = weaponData1; } } return weaponData; } }
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "armorGroup", menuName = "ScriptableObject/armorGroup")] public class ArmorGroup : ScriptableObject { public string groupName; public ArmorData armorData1; public int gainProbability1 = 0; public ArmorData armorData2; public int gainProbability2 = 0; public ArmorData armorData3; public int gainProbability3 = 0; public ArmorData armorData4; public int gainProbability4 = 0; public ArmorData armorData5; public int gainProbability5 = 0; public bool usePriority = false; public int item1Priority = 0; public int item2Priority = 0; public int item3Priority = 0; public int item4Priority = 0; public int item5Priority = 0; public ArmorData DecideArmorData() //armorData1~5の中からランダムでArmorDataを一つ入手する { ArmorData armorData = null; int tempValue = 0; int tempValue2 = 0; int sumValue = 0; if (!usePriority) { int randValue = Random.Range(0, 101); if (0 <= randValue && randValue < gainProbability1) { armorData = armorData1; } else if (gainProbability1 <= randValue && randValue < gainProbability2) { armorData = armorData2; } else if (gainProbability2 <= randValue && randValue < gainProbability3) { armorData = armorData3; } else if (gainProbability3 <= randValue && randValue < gainProbability4) { armorData = armorData4; } else if (gainProbability4 <= randValue && randValue < gainProbability5) { armorData = armorData5; } else { armorData = null; } } else//プライオリティーを使用する場合 { if (item1Priority > 0) { sumValue += Mathf.Clamp(item1Priority, 0, 100); } if (item2Priority > 0) { sumValue += Mathf.Clamp(item2Priority, 0, 100); } if (item3Priority > 0) { sumValue += Mathf.Clamp(item3Priority, 0, 100); } if (item4Priority > 0) { sumValue += Mathf.Clamp(item4Priority, 0, 100); } if (item5Priority > 0) { sumValue += Mathf.Clamp(item5Priority, 0, 100); } if (sumValue == 0) { sumValue = 1; } int randValue = Random.Range(0, sumValue); if (0 <= randValue && randValue < item1Priority) { armorData = armorData1; } tempValue += item1Priority; tempValue2 = tempValue + item2Priority; if (tempValue <= randValue && randValue < tempValue2) { armorData = armorData2; } tempValue += item2Priority; tempValue2 = tempValue + item3Priority; if (tempValue <= randValue && randValue < tempValue2) { armorData = armorData3; } tempValue += item3Priority; tempValue2 = tempValue + item4Priority; if (tempValue <= randValue && randValue < tempValue2) { armorData = armorData4; } tempValue += item4Priority; tempValue2 = tempValue + item5Priority; if (tempValue <= randValue && randValue < tempValue2) { armorData = armorData5; } if (armorData == null) { armorData = armorData1; } } return armorData; } }
入手した武器と防具(WeaponEntityとArmorEntity)を管理するWeaponManagerとArmorManagerを作成します。
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; //手に入れた武器を管理するクラス public class WeaponManager : MonoBehaviour { //シングルトン(すべてのシーンで共有する)) public static WeaponManager instance; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(this.gameObject); } else { Destroy(this.gameObject); } } //--シングルトン終わり-- public WeaponData[] weaponDatas; [System.NonSerialized] public WeaponEntity[] possessionWeapon = new WeaponEntity[500]; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } public void InitPossessionWeapon() { for(int i = 0; i < possessionWeapon.Length; i++) { possessionWeapon[i] = new WeaponEntity(); } } /// <summary> /// 武器の強化値を上げる関数 /// </summary> public void StrengthenWeapon(int index, int upValue) { possessionWeapon[index].enhancementValue += upValue; } /// <summary> /// 指定した武器をpossessionWeaponに加える。 /// </summary> /// <param name="weaponData"></param> public bool AddWeapon(WeaponData weaponData) { bool successAdd = false; WeaponEntity weaponEntity = new WeaponEntity(); weaponEntity.InitWeaponEntity(weaponData); for(int i = 0; i < possessionWeapon.Length; i++) { if(!possessionWeapon[i].isRegistry) { possessionWeapon[i] = weaponEntity; successAdd = true; } } return successAdd; } public void DeleteWeapon(int index) { possessionWeapon[index] = new WeaponEntity(); } }
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ArmorManager : MonoBehaviour { //シングルトン(すべてのシーンで共有する)) public static ArmorManager instance; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(this.gameObject); } else { Destroy(this.gameObject); } } //--シングルトン終わり-- public ArmorData[] armorDatas; [System.NonSerialized] public ArmorEntity[] possessionArmor = new ArmorEntity[500]; // Start is called before the first frame update void Start() { InitPossessionArmor(); } // Update is called once per frame void Update() { } public void InitPossessionArmor() { for (int i = 0; i < possessionArmor.Length; i++) { possessionArmor[i] = new ArmorEntity(); } } /// <summary> /// 防具の強化値を上げる関数 /// </summary> public void StrengthenArmor(int index, int upValue) { possessionArmor[index].enhancementValue += upValue; } }
DangeonController.csにWeaponGroup型とArmorGroup型の変数を宣言します。
クリックで展開
//-------------------New---------------- [SerializeField] WeaponGroup weaponGroup1; [SerializeField] WeaponGroup weaponGroup2; [SerializeField] WeaponGroup weaponGroup3; [SerializeField] ArmorGroup armorGroup1; [SerializeField] ArmorGroup armorGroup2; [SerializeField] ArmorGroup armorGroup3; //-------------------Newここまで----------------
DangeonEvent.csでイベントを定義します。
クリックで展開
public IEnumerator IEInformGetWeaponEvent() { DialogTextManager.instance.SetScenarios(new string[] { "武器が落ちている・・・"}); yield return new WaitForSeconds(2f); } public IEnumerator IEInformGetArmorEvent() { DialogTextManager.instance.SetScenarios(new string[] { "防具が落ちている・・・"}); yield return new WaitForSeconds(2f); } public IEnumerator IEGetWeaponEvent(WeaponGroup weaponGroup) { WeaponData getWeapon; SoundManager.instance.PlaySE(23); getWeapon = weaponGroup.DecideWeaponData(); if (getWeapon != null) { DialogTextManager.instance.SetScenarios(new string[] { getWeapon.weaponName + "を手に入れた!"}); WeaponManager.instance.AddWeapon(getWeapon); yield return new WaitForSeconds(1.2f); } else { DialogTextManager.instance.SetScenarios(new string[] { "??何もない??"}); yield return new WaitForSeconds(1.2f); } } public IEnumerator IEGetArmorEvent(ArmorGroup armorGroup) { ArmorData getArmor; SoundManager.instance.PlaySE(23); getArmor = armorGroup.DecideArmorData(); if (getArmor != null) { DialogTextManager.instance.SetScenarios(new string[] { getArmor.armorName + "を手に入れた!"}); ArmorManager.instance.AddArmor(getArmor); yield return new WaitForSeconds(1.2f); } else { DialogTextManager.instance.SetScenarios(new string[] { "??何もない??"}); yield return new WaitForSeconds(1.2f); } }
DangeonController.csのIEDangeonEventProcessコルーチンにeventIDが13,14の時の処理を追加します。
クリックで展開
public IEnumerator IEDangeonEventProcess() { stageUIManager.SetActionButton(false); stageUIManager.SetArrowsButton(false); if (dangionMap.isOpenDangeonMap) { stageUIManager.SetCancelButton(false); } eventID = GetCurrentPosDangeonEventID(); DangeonEvent dangeonEvent = new DangeonEvent(); switch (eventID) { case -1://何もなし break; case 0://採掘イベント yield return dangeonEvent.IEMineEvent(mineItemGroup); RegistryEventMemory(dangeonEvent,3,5,playerPos.x,playerPos.y,0); break; case 1://釣りイベント yield return dangeonEvent.IEFishingEvent(fisingItemGroup); RegistryEventMemory(dangeonEvent, 3,5, playerPos.x, playerPos.y, 1); break; case 2: //アイテムイベント yield return dangeonEvent.IEItemEvent(itemEventGroup); RegistryEventMemory(dangeonEvent, 3, 5, playerPos.x, playerPos.y, 2); DeleteEvent(); break; case 3: //伐採イベント yield return dangeonEvent.IELoggingEvent(loggingItemGroup); RegistryEventMemory(dangeonEvent, 3, 5, playerPos.x, playerPos.y, 3); break; case 4: //金貨イベント yield return dangeonEvent.IEGetGoldEvent(Random.Range(minGold, maxGold + 1)); playerUIManager.UpdateUI(PlayerManager.instance); DeleteEvent(); stageUIManager.isEventPosition = false; break; case 5: //階段を降りるイベント yield return dangeonEvent.IEDownFloorEvent(dangionMap, questManager,stageUIManager,this); break; case 6: //階段を上がるイベント yield return dangeonEvent.IEUpFloorEvent(dangionMap, questManager, stageUIManager,this); break; case 7://7はトラップイベントだが配置された位置に到達した時に実行されるのでここでは何もしない(というかここには処理が来ない) break; case 8: //スイッチで開く扉イベント yield return dangeonEvent.IEUpSwitchDoorEvent(); break; case 9: ////青いスイッチ(OFF)イベント yield return dangeonEvent.IEOFFBlueSwitchEvent(dangionMap,questManager,this); break; case 10: ////青いスイッチ(ON)イベント yield return dangeonEvent.IEONBlueSwitchEvent(); break; case 11: //ワープイベント yield return dangeonEvent.IEWarpEvent(dangionMap,questManager,this); UpdatePlayerPosition(); ActivePlayerPosRoom(); ActivePlayerPosEvent(); break; case 12: //帰還イベント yield return dangeonEvent.IEReturnEvent(questManager); break; //------------------New--------- case 13: //武器入手イベント yield return dangeonEvent.IEGetWeaponEvent(weaponGroup1); break; case 14: //防具入手イベント yield return dangeonEvent.IEGetArmorEvent(armorGroup1); break; //-----------------Newここまで------------ } if (shouldActiveActionButton) { stageUIManager.actionButton.SetActive(true); } else { stageUIManager.actionButton.SetActive(false); } stageUIManager.SetArrowsButton(true); if (dangionMap.isOpenDangeonMap) { stageUIManager.SetCancelButton(true); } yield return null; }
ダンジョンのフロア生成時に武器、防具入手イベントが配置されるようにします。DangeonMap.csのeventIDListにIDを追加します。
クリックで展開
public List<int> eventIDList = new List<int>() {0,1,2,3,4,7,13,14 }; //ランダムで生成させるイベントIDのリスト //13,14追加
これでイベントで武器と防具を入手できるようになりました。
ヒエラルキーにWeaponManagerとArmorManagerの名前でゲームオブジェクトを作成し、同名のスクリプトを貼り付けます。WeaponDatas、ArmorDatasにゲーム中で登場させる武器と防具を設定しておきます。それからResourceフォルダ配下にWeaponGroupとArmorGroupのScriptableObjectを作成します。それぞれ仮に設定しておきます。
あとはこのWeaponGroupとArmorGroupをDangeonController.csの方で読み込みます。
クリックで展開
private void Start() { //ResourceのScriptableObjectから各ItemGroupを読み込む mineItemGroup = Resources.Load<ItemGroup>("ItemGroups/itemGroup_MIne"); fisingItemGroup = Resources.Load<ItemGroup>("ItemGroups/itemGroup_Fising"); itemEventGroup = Resources.Load<ItemGroup>("ItemGroups/itemGroup_ItemEvent1"); loggingItemGroup = Resources.Load<ItemGroup>("ItemGroups/itemGroup_Logging"); weaponGroup1 = Resources.Load<WeaponGroup>("WeaponGroups/weaponGroup1"); //New armorGroup1 = Resources.Load<ArmorGroup>("ArmorGroups/armorGroup1"); //New //探索イベントのメモリ(イベントの残り回数保持)を初期化する InitDangeonEventmemories(); }
今回は以上です。次回は装備画面を作成したいと思います。