【Unity】RPG制作 その14-攻撃アイテム使用処理
前回は戦闘時の回復アイテムの処理の実装を行いました。今回は攻撃アイテムの実装をやっていきます。
アイテムのデータに命中率を設定したいので、itemData.csに以下の記述を追加しておきます。
[Header("攻撃アイテムの場合の命中率")] public int hitRate = 95;
itemEventに命中率の判定を行う関数を定義します。
クリックで展開
public bool CheckHitAttackItem(EnemyManager enemy) //New { int calcHitRate; calcHitRate = (int)((player.hitRate + (player.sence / 10.0f) + (player.luk / 50.0f)) - (enemy.evasionRate + (enemy.agi / 10.0f) + (enemy.luk / 20.0f))); if (calcHitRate >= UnityEngine.Random.Range(1, 101)) { return true; } else { return false; } }
アイテムを使用した際に、何かしらの効果があった場合にtrueにするbool変数を宣言します。
それから、itemDataをもとに、アイテムの対象者に状態異常を付与する関数を作成します。
クリックで展開
IEnumerator AddConditions(EnemyManager enemy) { TermManager termManager = new TermManager(); // 状態異常付与の処理 if (itemData.addCondition1 != GeneralEnum.STATUSCONDITION.NONE) { if (itemData.addProbability1 >= UnityEngine.Random.Range(1, 101)) { enemy.statusCondiWithLastTurn[itemData.addCondition1] = itemData.addCondiTurn1; string statusMessage = termManager.Get_STATUSCONDI_Message(itemData.addCondition1, true); DialogTextManager.instance.SetScenarios(new string[] { enemy.name + statusMessage }); yield return new WaitForSeconds(1.2f); hasEffectivedItem = true; } } if (itemData.addCondition2 != GeneralEnum.STATUSCONDITION.NONE) { if (itemData.addProbability2 >= UnityEngine.Random.Range(1, 101)) { enemy.statusCondiWithLastTurn[itemData.addCondition2] = itemData.addCondiTurn2; string statusMessage = termManager.Get_STATUSCONDI_Message(itemData.addCondition2, true); DialogTextManager.instance.SetScenarios(new string[] { enemy.name + statusMessage }); yield return new WaitForSeconds(1.2f); hasEffectivedItem = true; } } if (itemData.addCondition3 != GeneralEnum.STATUSCONDITION.NONE) { if (itemData.addProbability3 >= UnityEngine.Random.Range(1, 101)) { enemy.statusCondiWithLastTurn[itemData.addCondition3] = itemData.addCondiTurn3; string statusMessage = termManager.Get_STATUSCONDI_Message(itemData.addCondition3, true); DialogTextManager.instance.SetScenarios(new string[] { enemy.name + statusMessage }); yield return new WaitForSeconds(1.2f); hasEffectivedItem = true; } } }
ここでTermManagerという名前のクラスが使われていますが、これは主にアイテムのデータに応じて定義されたメッセージ(script型)を返す関数を定義しているクラスです。TermManagerの中身はこんな感じになっています。
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; // 主に列挙型の変数に応じて用語を返すクラス public class TermManager { //状態異常の用語を取得する関数 public string Get_STATUS_Term(GeneralEnum.STATUSCONDITION status) { switch (status) { case GeneralEnum.STATUSCONDITION.NONE: return "なし"; case GeneralEnum.STATUSCONDITION.DEAD: return "戦闘不能"; case GeneralEnum.STATUSCONDITION.POISON: return "毒"; case GeneralEnum.STATUSCONDITION.BLIND: return "盲目"; case GeneralEnum.STATUSCONDITION.PARALYSIS: return "麻痺"; case GeneralEnum.STATUSCONDITION.SLEEP: return "睡眠"; case GeneralEnum.STATUSCONDITION.CONFUSION: return "混乱"; case GeneralEnum.STATUSCONDITION.BURN: return "燃焼"; case GeneralEnum.STATUSCONDITION.FROZEN: return "凍結"; case GeneralEnum.STATUSCONDITION.ATKUP: return "攻撃力UP"; case GeneralEnum.STATUSCONDITION.DEFUP: return "防御力UP"; case GeneralEnum.STATUSCONDITION.AGIUP: return "速さUP"; case GeneralEnum.STATUSCONDITION.LUKUP: return "運UP"; case GeneralEnum.STATUSCONDITION.HITRATEUP: return "命中率UP"; case GeneralEnum.STATUSCONDITION.EVASIONRATEUP: return "回避率UP"; case GeneralEnum.STATUSCONDITION.CRITICALRATEUP: return "クリティカル率UP"; case GeneralEnum.STATUSCONDITION.MAGPOWUP: return "魔力UP"; case GeneralEnum.STATUSCONDITION.MAGDEFUP: return "魔法防御UP"; case GeneralEnum.STATUSCONDITION.ATKDOWN: return "攻撃力DOWN"; case GeneralEnum.STATUSCONDITION.DEFDOWN: return "防御力DOWN"; case GeneralEnum.STATUSCONDITION.AGIDOWN: return "速さDOWN"; case GeneralEnum.STATUSCONDITION.LUKDOWN: return "運DOWN"; case GeneralEnum.STATUSCONDITION.HITRATEDOWN: return "命中率DOWN"; case GeneralEnum.STATUSCONDITION.EVASIONRATEDOWN: return "回避率DOWN"; case GeneralEnum.STATUSCONDITION.CRITICALRATEDOWN: return "クリティカル率DOWN"; case GeneralEnum.STATUSCONDITION.MAGPOWDOWN: return "魔力DOWN"; case GeneralEnum.STATUSCONDITION.MAGDEFDOWN: return "魔法防御DOWN"; } return "???"; } //主にプレイヤーが状態異常になった時に表示するメッセージを返す関数 public string Get_STATUSCONDI_Message(GeneralEnum.STATUSCONDITION status,bool isBecomeInTheStatus) { //状態異常にかかった場合 if (isBecomeInTheStatus) { switch (status) { case GeneralEnum.STATUSCONDITION.NONE: return ""; case GeneralEnum.STATUSCONDITION.DEAD: return "は倒れた・・・。"; case GeneralEnum.STATUSCONDITION.POISON: return "は毒にかかった"; case GeneralEnum.STATUSCONDITION.BLIND: return "は盲目になった"; case GeneralEnum.STATUSCONDITION.PARALYSIS: return "麻痺した"; case GeneralEnum.STATUSCONDITION.SLEEP: return "眠った"; case GeneralEnum.STATUSCONDITION.CONFUSION: return "は混乱した"; case GeneralEnum.STATUSCONDITION.BURN: return "は燃えた"; case GeneralEnum.STATUSCONDITION.FROZEN: return "は凍りついた"; case GeneralEnum.STATUSCONDITION.ATKUP: return "の攻撃力が上がった"; case GeneralEnum.STATUSCONDITION.DEFUP: return "の防御力が上がった"; case GeneralEnum.STATUSCONDITION.AGIUP: return "の速さが上がった"; case GeneralEnum.STATUSCONDITION.LUKUP: return "の運が上がった"; case GeneralEnum.STATUSCONDITION.HITRATEUP: return "の命中率が上がった"; case GeneralEnum.STATUSCONDITION.EVASIONRATEUP: return "の回避率が上がった"; case GeneralEnum.STATUSCONDITION.CRITICALRATEUP: return "のクリティカル率が上がった"; case GeneralEnum.STATUSCONDITION.MAGPOWUP: return "の魔力が上がった"; case GeneralEnum.STATUSCONDITION.MAGDEFUP: return "の魔法防御が上がった"; case GeneralEnum.STATUSCONDITION.ATKDOWN: return "の攻撃力が下がった"; case GeneralEnum.STATUSCONDITION.DEFDOWN: return "の防御力が下がった"; case GeneralEnum.STATUSCONDITION.AGIDOWN: return "の速さが下がった"; case GeneralEnum.STATUSCONDITION.LUKDOWN: return "の運が下がった"; case GeneralEnum.STATUSCONDITION.HITRATEDOWN: return "の命中率が下がった"; case GeneralEnum.STATUSCONDITION.EVASIONRATEDOWN: return "の回避率が下がった"; case GeneralEnum.STATUSCONDITION.CRITICALRATEDOWN: return "のクリティカル率が下がった"; case GeneralEnum.STATUSCONDITION.MAGPOWDOWN: return "の魔力が下がった"; case GeneralEnum.STATUSCONDITION.MAGDEFDOWN: return "の魔法防御が下がった"; } } else //状態異常解除の場合 { switch (status) { case GeneralEnum.STATUSCONDITION.NONE: return ""; case GeneralEnum.STATUSCONDITION.DEAD: return "は立ち上がった!"; case GeneralEnum.STATUSCONDITION.POISON: return "の毒が消えた!"; case GeneralEnum.STATUSCONDITION.BLIND: return "の目が見えるようになった!"; case GeneralEnum.STATUSCONDITION.PARALYSIS: return "の痺れがなくなった!"; case GeneralEnum.STATUSCONDITION.SLEEP: return "は目が覚めた!"; case GeneralEnum.STATUSCONDITION.CONFUSION: return "は正気に戻った!"; case GeneralEnum.STATUSCONDITION.BURN: return "は鎮火した!"; case GeneralEnum.STATUSCONDITION.FROZEN: return "の氷は溶けた!"; case GeneralEnum.STATUSCONDITION.ATKUP: return "の攻撃力は元に戻った"; case GeneralEnum.STATUSCONDITION.DEFUP: return "の防御力は元に戻った"; case GeneralEnum.STATUSCONDITION.AGIUP: return "の速さは元に戻った"; case GeneralEnum.STATUSCONDITION.LUKUP: return "は幸運でなくなった"; case GeneralEnum.STATUSCONDITION.HITRATEUP: return "の命中率は元に戻った"; case GeneralEnum.STATUSCONDITION.EVASIONRATEUP: return "の回避率は元に戻った"; case GeneralEnum.STATUSCONDITION.CRITICALRATEUP: return "のクリティカル率は元に戻った"; case GeneralEnum.STATUSCONDITION.MAGPOWUP: return "の魔力は元に戻った"; case GeneralEnum.STATUSCONDITION.MAGDEFUP: return "の魔法防御は元に戻った"; case GeneralEnum.STATUSCONDITION.ATKDOWN: return "の攻撃力は元に戻った!"; case GeneralEnum.STATUSCONDITION.DEFDOWN: return "の防御力は元に戻った!"; case GeneralEnum.STATUSCONDITION.AGIDOWN: return "の速さは元に戻った!"; case GeneralEnum.STATUSCONDITION.LUKDOWN: return "は不運でなくなった!"; case GeneralEnum.STATUSCONDITION.HITRATEDOWN: return "の命中率は元に戻った!"; case GeneralEnum.STATUSCONDITION.EVASIONRATEDOWN: return "の回避率は元に戻った!"; case GeneralEnum.STATUSCONDITION.CRITICALRATEDOWN: return "のクリティカル率は元に戻った!"; case GeneralEnum.STATUSCONDITION.MAGPOWDOWN: return "の魔力は元に戻った!"; case GeneralEnum.STATUSCONDITION.MAGDEFDOWN: return "の魔法防御は元に戻った"; } } return "???"; } //プレイヤーの能力が上がった時(恒久的に)に表示するメッセージを返す関数 public string Get_STATUSUP_Message(GeneralEnum.STATUS status) { switch (status) { case GeneralEnum.STATUS.HP: return "の生命力が上がった"; case GeneralEnum.STATUS.MP: return "の魔力の源が大きくなった"; case GeneralEnum.STATUS.ATK: return "の筋力が強くなった"; case GeneralEnum.STATUS.DEF: return "は打たれ強くなった"; case GeneralEnum.STATUS.AGI: return "は動きが早くなった"; case GeneralEnum.STATUS.LUK: return "の運気が上がった"; case GeneralEnum.STATUS.SENCE: return "の感覚が鋭くなった"; case GeneralEnum.STATUS.MAGPOW: return "の魔力が上昇した"; case GeneralEnum.STATUS.MAGDEF: return "は魔法に強くなった"; case GeneralEnum.STATUS.LEARNABI: return "は色々学びたくなった"; case GeneralEnum.STATUS.TP: return "の技の冴えが増した"; case GeneralEnum.STATUS.HIT: return "は狙いは研ぎ澄まされた"; case GeneralEnum.STATUS.EVASION: return "の動体視力が上がった"; case GeneralEnum.STATUS.CRITICAL: return "は急所を見極めて攻撃する"; default: return ""; } } //プレイヤーの能力が下がった時(恒久的に)に表示するメッセージを返す関数 public string Get_STATUSDOWN_Message(GeneralEnum.STATUS status) { switch (status) { case GeneralEnum.STATUS.HP: return "の生命力が下がった"; case GeneralEnum.STATUS.MP: return "の魔力の源が薄れた"; case GeneralEnum.STATUS.ATK: return "の力が弱くなった"; case GeneralEnum.STATUS.DEF: return "は打たれ弱くなった"; case GeneralEnum.STATUS.AGI: return "はのろくなった"; case GeneralEnum.STATUS.LUK: return "は不幸になった"; case GeneralEnum.STATUS.SENCE: return "の鈍感になった"; case GeneralEnum.STATUS.MAGPOW: return "の魔力が弱まった"; case GeneralEnum.STATUS.MAGDEF: return "は魔法に弱くなった"; case GeneralEnum.STATUS.LEARNABI: return "の学習意欲がなくなった"; case GeneralEnum.STATUS.TP: return "の技が錆びついた"; case GeneralEnum.STATUS.HIT: return "は狙いのズレを感じた"; case GeneralEnum.STATUS.EVASION: return "の動体視力が落ちた"; case GeneralEnum.STATUS.CRITICAL: return "は適当に攻撃するようになった"; default: return ""; } } public string Get_STATUS_EnforcedMessage(GeneralEnum.STATUS status) { switch (status) { case GeneralEnum.STATUS.HP: return "の最大HPが上がった!"; case GeneralEnum.STATUS.MP: return "の最大MPが上がった!"; case GeneralEnum.STATUS.ATK: return "の攻撃力が上がった!"; case GeneralEnum.STATUS.DEF: return "の防御力が上がった!"; case GeneralEnum.STATUS.AGI: return "の速さが上がった!"; case GeneralEnum.STATUS.LUK: return "の運が上がった!"; case GeneralEnum.STATUS.SENCE: return "の感覚が上がった!"; case GeneralEnum.STATUS.MAGPOW: return "の魔力が上がった!"; case GeneralEnum.STATUS.MAGDEF: return "の魔法防御が上がった!"; case GeneralEnum.STATUS.LEARNABI: return "の習得が上がった!"; case GeneralEnum.STATUS.TP: return "の最大TPが上がった!"; case GeneralEnum.STATUS.HIT: return "の命中率が上がった!"; case GeneralEnum.STATUS.EVASION: return "の回避率が上がった!"; case GeneralEnum.STATUS.CRITICAL: return "のクリティカル率が上がった!"; default: return ""; } } public string Get_STATUS_WeakenedMessage(GeneralEnum.STATUS status) { switch (status) { case GeneralEnum.STATUS.HP: return "の最大HPが下がった!"; case GeneralEnum.STATUS.MP: return "の最大MPが下がった!"; case GeneralEnum.STATUS.ATK: return "の攻撃力が下がった!"; case GeneralEnum.STATUS.DEF: return "の防御力が下がった!"; case GeneralEnum.STATUS.AGI: return "の速さが下がった!"; case GeneralEnum.STATUS.LUK: return "の運が下がった!"; case GeneralEnum.STATUS.SENCE: return "の感覚が下がった!"; case GeneralEnum.STATUS.MAGPOW: return "の魔力が下がった!"; case GeneralEnum.STATUS.MAGDEF: return "の魔法防御が下がった!"; case GeneralEnum.STATUS.LEARNABI: return "の習得が下がった!"; case GeneralEnum.STATUS.TP: return "の最大TPが下がった!"; case GeneralEnum.STATUS.HIT: return "の命中率が下がった!"; case GeneralEnum.STATUS.EVASION: return "の回避率が下がった!"; case GeneralEnum.STATUS.CRITICAL: return "のクリティカル率が下がった!"; default: return ""; } } public string GetMagicName(MagicManager.Magic magic) { switch (magic) { case MagicManager.Magic.FireArc: return "ファイヤアーク"; case MagicManager.Magic.WindCutter: return "ウィンドカッター"; case MagicManager.Magic.SparkBall: return "スパークボール"; case MagicManager.Magic.AquaLinear: return "アクアリニアー"; case MagicManager.Magic.IceMissile: return "アイスミサイル"; case MagicManager.Magic.MagmaWava: return "マグマウェイブ"; case MagicManager.Magic.ParallelRay: return "パラレルレイ"; case MagicManager.Magic.AbyssalShot: return "アビシャルショット"; case MagicManager.Magic.PoisonArrow: return "毒矢の魔法"; default: return ""; } } }
他のも色々定義されたいますが、今回使うのはGet_STATUSCONDI_Message関数とGet_STATUS_EnforcedMessage関数とGet_STATUS_WeakenedMessage関数です。
次はアイテムの使用対象にステータス強化・弱体を付与する関数を作成します。
クリックで展開
IEnumerator AddStatuEnforceORWeakended(EnemyManager enemy) { if (itemData.tempEnforceSta1 != GeneralEnum.STATUS.NONE) { if (itemData.enforceRate1 >= 0) { yield return StartCoroutine(EnemyStatusEnforce(enemy, itemData.tempEnforceSta1, itemData.enforceTurn1, itemData.enforceRate1)); hasEffectivedItem = true; } else { yield return StartCoroutine(EnemyStatusWeakened(enemy, itemData.tempEnforceSta1, itemData.enforceTurn1, itemData.enforceRate1)); hasEffectivedItem = true; } } if (itemData.tempEnforceSta2 != GeneralEnum.STATUS.NONE) { if (itemData.enforceRate2 >= 0) { yield return StartCoroutine(EnemyStatusEnforce(enemy, itemData.tempEnforceSta2, itemData.enforceTurn2, itemData.enforceRate2)); hasEffectivedItem = true; } else { yield return StartCoroutine(EnemyStatusWeakened(enemy, itemData.tempEnforceSta2, itemData.enforceTurn2, itemData.enforceRate2)); hasEffectivedItem = true; } } if (itemData.tempEnforceSta3 != GeneralEnum.STATUS.NONE) { if (itemData.enforceRate3 >= 0) { yield return StartCoroutine(EnemyStatusEnforce(enemy, itemData.tempEnforceSta3, itemData.enforceTurn3, itemData.enforceRate3)); hasEffectivedItem = true; } else { yield return StartCoroutine(EnemyStatusWeakened(enemy, itemData.tempEnforceSta3, itemData.enforceTurn3, itemData.enforceRate3)); hasEffectivedItem = true; } } }
ステータスの強化率はitemDataのenforceRate1(~3)で設定するのですが、この数値が+の場合は強化、-の場合は弱体です。なので、enforceRateの値が+か-か判定して、条件分岐させています。EnemyStatusEnforce関数とEnemyStatusWeakened関数はそれぞれステータスが強化・弱体された時の強化率やターン数をEnemyManagerに設定したり、メッセージを表示する関数です。
クリックで展開
IEnumerator EnemyStatusEnforce(EnemyManager enemy, GeneralEnum.STATUS upStatus, int enforceTurn, int enforceRate) { if (upStatus == GeneralEnum.STATUS.NONE) { DialogTextManager.instance.SetScenarios(new string[] { "・・・?" }); yield return new WaitForSeconds(1.2f); yield break; } if (enemy.statusUpWithLastTurn[upStatus] < enforceTurn) { enemy.statusUpWithLastTurn[upStatus] = enforceTurn; } if (enemy.statusUpRate[upStatus] < enforceRate) { enemy.statusUpRate[upStatus] = enforceRate; } TermManager termManager = new TermManager(); string statusMessage = termManager.Get_STATUS_EnforcedMessage(upStatus); DialogTextManager.instance.SetScenarios(new string[] { enemy.name + statusMessage }); yield return new WaitForSeconds(1.2f); } IEnumerator EnemyStatusWeakened(EnemyManager enemy, GeneralEnum.STATUS downStatus, int weakenedTurn, int weakenedRate) { if (downStatus == GeneralEnum.STATUS.NONE) { DialogTextManager.instance.SetScenarios(new string[] { "・・・?" }); yield return new WaitForSeconds(2.4f); yield break; } //弱体の場合は-で数字が入ってくるので先に反転しておく weakenedRate *= -1; if (enemy.statusDownWithLastTurn[downStatus] < weakenedTurn) { enemy.statusDownWithLastTurn[downStatus] = weakenedTurn; } if (enemy.statusDownRate[downStatus] < weakenedRate) { enemy.statusDownRate[downStatus] = weakenedRate; } TermManager termManager = new TermManager(); string statusMessage = termManager.Get_STATUS_EnforcedMessage(downStatus); DialogTextManager.instance.SetScenarios(new string[] { enemy.name + statusMessage }); yield return new WaitForSeconds(1.2f); }
次はItemUIが作成された時にそれぞれのアイテムのButtonのOnclickにitemEvent登録される関数、SetItemTargetPanel関数に処理を追加していきます。
クリックで展開
public void SetItemTargetPanel() { if (itemUI.GetComponent<ItemUI>().canTapItemUI) { itemUI.GetComponent<ItemUI>().canTapItemUI = false; useItemText = useItemMessaagePanel.transform.GetChild(0).GetComponent<Text>(); if (GameManager.instance.gamePhase == GameManager.GAMEPHASE.QUEST) //ゲームフェーズがQUESTの場合 { if (itemData.canUseScene == ItemData.AVAILABLESCENES.BATTLEONLY)//戦闘時のみ使用可の場合は使えない { SoundManager.instance.PlaySE(11); //ブザー音 return; } if (itemData.itemType == ItemData.ITEMTYPE.HEAL) //回復アイテムの場合の処理 { itemUsePanel.gameObject.SetActive(true); itemUsePanel.SetHealItemUsePanel(useItemMessaagePanel, itemData, itemUsePanel); } else if (itemData.itemType == ItemData.ITEMTYPE.BOOKOFMAGIC) //魔導書アイテムの場合 { itemUsePanel.gameObject.SetActive(true); } } else if (GameManager.instance.gamePhase == GameManager.GAMEPHASE.BATTLE)//BATTLEフェーズの場合 { if (itemData.canUseScene == ItemData.AVAILABLESCENES.QUESTONLY) { SoundManager.instance.PlaySE(11);//ブザー音 return; } if (itemData.itemType == ItemData.ITEMTYPE.HEAL) //回復アイテムの場合の処理 { itemUsePanel.gameObject.SetActive(true); itemUsePanel.SetHealItemUsePanel(useItemMessaagePanel, itemData, itemUsePanel); } else if (itemData.itemType == ItemData.ITEMTYPE.ATTACK) { itemUsePanel.gameObject.SetActive(true); } } } }
CommandUIManager.csに「やめる」ボタンを押した時に、itemUsePanelとuseItemMessaagePanelを閉じる処理を追加します。
クリックで展開
//--------新しい公開変数の宣言 public GameObject itemUIView; //New public GameObject itemUsePanel; //New public GameObject useItemMessaagePanel; //New //-----------処理の追加----------------- public void PushCancelButton() { if (itemUsePanel.activeInHierarchy) //New { itemUsePanel.gameObject.SetActive(false); itemUI.GetComponent<ItemUI>().canTapItemUI = true; return; } if (useItemMessaagePanel.activeInHierarchy) //New { useItemMessaagePanel.gameObject.SetActive(false); itemUIView.SetActive(true); itemUI.GetComponent<ItemUI>().canTapItemUI = true; return; } attackButton.gameObject.SetActive(true); specialButton.gameObject.SetActive(true); cancelButton.gameObject.SetActive(false); itemButton.gameObject.SetActive(true); escapeButton.gameObject.SetActive(true); DialogUI.gameObject.SetActive(true); //アイテム選択画面から戻る場合はキャンセルボタンの位置をもとに戻す if (isOpenItemUI) { cancelButton.gameObject.transform.Translate(0, 150, 0); itemUI.GetComponent<ItemUI>().HideItemUI(); //itemUI.GetComponent<ItemUI>().itemUsePanel.gameObject.SetActive(false); isOpenItemUI = false; } }
これでItemUIが開いているときに「やめる」ボタンを押すとItemUIを閉じてCommandUIを開き、UseItemMessagePanelが表示されている時に「やめる」ボタンを押すとUseItemMessagePanelが閉じてItemUIが再度開くようになりました。
次はATTACKアイテムを選択した時に、Enemyをタップした時に実行する関数を変更する処理を実装します。EnemyManagerでEnemyがタップされた時に実行する関数の変数tapActionを初期化する関数を作成します。
準備ができたので、先程のAttackアイテム使用時の箇所に処理を追加します。
クリックで展開
public void SetItemTargetPanel() { if (itemUI.GetComponent<ItemUI>().canTapItemUI) { itemUI.GetComponent<ItemUI>().canTapItemUI = false; useItemText = useItemMessaagePanel.transform.GetChild(0).GetComponent<Text>(); if (GameManager.instance.gamePhase == GameManager.GAMEPHASE.QUEST) //ゲームフェーズがQUESTの場合 { if (itemData.canUseScene == ItemData.AVAILABLESCENES.BATTLEONLY)//戦闘時のみ使用可の場合は使えない { SoundManager.instance.PlaySE(11); //ブザー音 return; } if (itemData.itemType == ItemData.ITEMTYPE.HEAL) //回復アイテムの場合の処理 { itemUsePanel.gameObject.SetActive(true); itemUsePanel.SetHealItemUsePanel(useItemMessaagePanel, itemData, itemUsePanel); } else if (itemData.itemType == ItemData.ITEMTYPE.BOOKOFMAGIC) //魔導書アイテムの場合 { itemUsePanel.gameObject.SetActive(true); } } else if (GameManager.instance.gamePhase == GameManager.GAMEPHASE.BATTLE)//BATTLEフェーズの場合 { if (itemData.canUseScene == ItemData.AVAILABLESCENES.QUESTONLY) { SoundManager.instance.PlaySE(11);//ブザー音 return; } if (itemData.itemType == ItemData.ITEMTYPE.HEAL) //回復アイテムの場合の処理 { itemUsePanel.gameObject.SetActive(true); itemUsePanel.SetHealItemUsePanel(useItemMessaagePanel, itemData, itemUsePanel); } else if (itemData.itemType == ItemData.ITEMTYPE.ATTACK) { //itemUsePanel.gameObject.SetActive(true); itemUIView.SetActive(false); useItemMessaagePanel.SetActive(true); useItemText.text = "使用対象を選択してください"; //attackItemEventに実際にアイテム使用処理を実行するに当たって必要な情報を設定しておく(HealItemがuseItemPanelを介してItemEventを新しく作るのに対して、AttackItemはこの場で新規のItemEvent(ゲームオブジェクト)を作成する) //attackItemEvent = new itemEvent(); attackItemEvent = (new GameObject("AttackItemEvent")).AddComponent<itemEvent>(); attackItemEvent.SetObjects(); itemUsePanel.SetTargetSelectOnAttackItem(useItemMessaagePanel, itemData, itemUsePanel, attackItemEvent); //attackItemEventの処理をEnemyのTap処理に登録 foreach (EnemyManager enemy in battleManager.enemysList.Values) { enemy.InitEventListenerOnTap(); enemy.AddEventListenerOnTap(attackItemEvent. DecidePlayerUseItemOnBattle); //enemy.AddEventListenerOnTap(battleManager.EnemyTapAttackItem); } attackItemEvent.battleManager = battleManager; //attackItemEventの関数登録を個々で行っておく attackItemEvent.IEUseItemRegister = attackItemEvent.IEUseAttackItem();//battleManagerで実行されるアイテム使用処理の関数登録 attackItemEvent.DecideUseItem += battleManager.StartBattleTurn; } } } }
やっていることをざっくり説明すると、Attackアイテムを選択した場合は、Enemyのタップ処理を新規に作成したAttackItemEventの関数に登録しなおしています。この処理を行った場合、処理が行われたあとにAttackItemEventを破棄しておきます。
クリックで展開
IEnumerator PlayerUseItem() { commandUI.gameObject.SetActive(false); playerItemEvent.enemy_grobal = enemysList[targetIndex]; //実行するitemEventのターゲットを設定 New yield return StartCoroutine(playerItemEvent.IEUseItemRegister) ; Destroy(playerItemEvent.gameObject); //New yield return null; }
それから、通常攻撃を選択したときは、enemyのタップ処理に通常攻撃時の処理を登録し直すようにします。そのための関数をbattleManagerに新しく作成します。
クリックで展開
public void SetPlayerActionOnNormalAttack() //New { battleActionDic[0] = BATTLEACTIONTYPE.NORMALATTACK; foreach (EnemyManager enemy in enemysList.Values) { enemy.InitEventListenerOnTap(); enemy.AddEventListenerOnTap(EnemyTapNormal); } }
この関数を「攻撃」コマンドを押した時に呼び出すようにします。
実行するとこんな感じになります。
次回は探索するステージの制作をしていきます。