【Unity】RPG制作 その32-特技の実装3 特技の効果対象による処理分岐、コードの整理
今回は特技の効果対象によって敵を複数回攻撃したりランダムで攻撃したりできるようにしていきます。
SpecialEvent.csのIEUseAttackSpecialコルーチンに処理を描いていきます。現状条件文の中の実行コードがかなり長くなっており、処理全体の見通しが悪くなっているので、実際に処理を行う部分を関数にします。
クリックで展開
public IEnumerator AllOfEnemyAttackSpecialProcess()//New { //全体攻撃の場合、ダメージの減衰をさせたいのでカウント変数を用意する int enemyCount = 0; for (int i = 0; i < 3; i++) { if (battleManager.enemysList.ContainsKey(i)) { enemyCount++;//ダメージ減衰用のカウント変数を1増やす //攻撃特技のダメージ量を計算する((player 攻撃力 * 攻撃影響率 / 100)+(player 魔力 * 魔力影響率 / 100) + 固定ダメージ量) if (CheckHitAttackSpecial(battleManager.enemysList[i])) { //HPダメージ量を計算する int pAtk = player.battleStatusValues[GeneralEnum.STATUS.ATK]; int pAgi = player.battleStatusValues[GeneralEnum.STATUS.AGI]; int pMag = player.battleStatusValues[GeneralEnum.STATUS.MAGPOW]; int pDef = player.battleStatusValues[GeneralEnum.STATUS.DEF]; int pMdef = player.battleStatusValues[GeneralEnum.STATUS.MAGDEF]; int pLuk = player.battleStatusValues[GeneralEnum.STATUS.LUK]; int pLearn = player.battleStatusValues[GeneralEnum.STATUS.LEARNABI]; int sIAtk = specialData.attackInfluence; int sIAgi = specialData.agiInfluence; int sIMag = specialData.magicInfluence; int sIDef = specialData.defInfluence; int sIMDef = specialData.magdefInfluence; int sLuk = specialData.lukInfluence; int sLearn = specialData.learnInfluence; battleManager.enemysList[i].CalcBattleStatusValues();//敵の戦闘時ステータスを計算する int eDef = battleManager.enemysList[i].baseStatusValue[GeneralEnum.STATUS.DEF]; int eMdef = battleManager.enemysList[i].baseStatusValue[GeneralEnum.STATUS.MAGDEF]; //攻撃側の値を計算する float hpAtkValue = (pAtk * sIAtk / 100f) + (pAgi * sIAgi / 100f) + (pMag * sIMag / 100f) + (pDef * sIDef / 100f) + (pMdef * sIMDef / 100f) + (pLuk * sLuk / 100f) + (pLearn * sLearn / 100f) + specialData.HPDamageValue; //防御側の値を計算する(防御力がダメージを減らす割合は基本25%) _ = eMdef * specialData.thingE_MDEFRate / 100f;//特技の魔法防御反映率処理 float hpDefValue = (eDef / 4f) + (eMdef); hpDefValue -= (hpDefValue * (specialData.penetrationRate / 100f));//貫通率処理 float calcDamage = hpAtkValue - hpDefValue; calcDamage = calcDamage * (1.00f - (0.15f * enemyCount)); //敵の数によるダメージの減衰(右の敵ほどダメージが減る) calcDamage *= UnityEngine.Random.Range(1.0f - specialData.damageDispersionRate, 1.0f + specialData.damageDispersionRate); //ダメージを分散させる New int hpPoint = (int)calcDamage; if (PlayerCheckCritical(battleManager.enemysList[i])) hpPoint *= 2; if (hpPoint < 1) hpPoint = 1;//最低ダメージ1 //MPダメージ量を計算する int sIAtkOnMP = specialData.attackInfluenceOnMP; int sIMagOnMP = specialData.attackInfluenceOnMP; int mpPoint = (int)((pAtk * sIAtkOnMP / 100f) + (pMag * sIMagOnMP / 100f) + specialData.MPDamageValue); //TPダメージ量を計算する int sIAtkOnTP = specialData.attackInfluenceOnTP; int sIMagOnTP = specialData.attackInfluenceOnTP; int tpPoint = (int)((pAtk * sIAtkOnTP / 100f) + (pMag * sIMagOnTP / 100f) + specialData.TPDamageValue); battleManager.enemysList[i].hp -= hpPoint; battleManager.enemysList[i].mp -= mpPoint; battleManager.enemysList[i].tp -= tpPoint; bool wasEffecitveSpecial = false; if (battleManager.enemysList[i].hp < 0) battleManager.enemysList[i].hp = 0; if (battleManager.enemysList[i].mp < 0) battleManager.enemysList[i].mp = 0; if (battleManager.enemysList[i].tp < 0) battleManager.enemysList[i].tp = 0; if (hpPoint > 0) { battleManager.enemysList[i].transform.DOShakePosition(0.3f, 0.5f, 20, 0, false, true); DialogTextManager.instance.SetScenarios(new string[] { battleManager.enemysList[i].name + "に" + hpPoint + "のダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (mpPoint > 0) { DialogTextManager.instance.SetScenarios(new string[] { battleManager.enemysList[i].name + "に" + mpPoint + "のMPダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (tpPoint > 0) { DialogTextManager.instance.SetScenarios(new string[] { battleManager.enemysList[i].name + "に" + tpPoint + "のTPダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (hpPoint == 0 && mpPoint == 0 && tpPoint == 0) { DialogTextManager.instance.SetScenarios(new string[] { battleManager.enemysList[i].name + "にダメージを与えられなかった!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); } yield return StartCoroutine(AddConditions()); yield return StartCoroutine(AddStatuEnforceORWeakended()); if (!wasEffecitveSpecial) { DialogTextManager.instance.SetScenarios(new string[] { "しかし何もおこらなかった" }); yield return new WaitForSeconds(1.2f); } battleManager.enemysList[i].gameObject.GetComponent<EnemyUIManager>().UpdateUI(battleManager.enemysList[i]); } else//攻撃が命中しなかった場合 { DialogTextManager.instance.SetScenarios(new string[] { player.pname + "の攻撃は外れた" }); yield return new WaitForSeconds(1.2f); } } } } public IEnumerator OneOfEnemyAttackSpecialProcess() //New { //攻撃特技のダメージ量を計算する((player 攻撃力 * 攻撃影響率 / 100)+(player 魔力 * 魔力影響率 / 100) + 固定ダメージ量) if (CheckHitAttackSpecial(enemy_grobal)) { //HPダメージ量を計算する int pAtk = player.battleStatusValues[GeneralEnum.STATUS.ATK]; int pAgi = player.battleStatusValues[GeneralEnum.STATUS.AGI]; int pMag = player.battleStatusValues[GeneralEnum.STATUS.MAGPOW]; int pDef = player.battleStatusValues[GeneralEnum.STATUS.DEF]; int pMdef = player.battleStatusValues[GeneralEnum.STATUS.MAGDEF]; int pLuk = player.battleStatusValues[GeneralEnum.STATUS.LUK]; int pLearn = player.battleStatusValues[GeneralEnum.STATUS.LEARNABI]; int sIAtk = specialData.attackInfluence; int sIAgi = specialData.agiInfluence; int sIMag = specialData.magicInfluence; int sIDef = specialData.defInfluence; int sIMDef = specialData.magdefInfluence; int sLuk = specialData.lukInfluence; int sLearn = specialData.learnInfluence; enemy_grobal.CalcBattleStatusValues();//敵の戦闘時ステータスを計算する int eDef = enemy_grobal.baseStatusValue[GeneralEnum.STATUS.DEF]; int eMdef = enemy_grobal.baseStatusValue[GeneralEnum.STATUS.MAGDEF]; //攻撃側の値を計算する float hpAtkValue = (pAtk * sIAtk / 100f) + (pAgi * sIAgi / 100f) + (pMag * sIMag / 100f) + (pDef * sIDef / 100f) + (pMdef * sIMDef / 100f) + (pLuk * sLuk / 100f) + (pLearn * sLearn / 100f) + specialData.HPDamageValue; //防御側の値を計算する(防御力がダメージを減らす割合は基本25%) _ = eMdef * specialData.thingE_MDEFRate / 100f;//特技の魔法防御反映率処理 float hpDefValue = (eDef / 4f) + eMdef; hpDefValue -= (hpDefValue * (specialData.penetrationRate / 100f));//貫通率処理 float calcDamage = hpAtkValue - hpDefValue; calcDamage *= UnityEngine.Random.Range(1.0f - specialData.damageDispersionRate, 1.0f + specialData.damageDispersionRate); //ダメージを分散させる New int hpPoint = (int)calcDamage; if (PlayerCheckCritical(enemy_grobal)) hpPoint *= 2; if (hpPoint < 1) hpPoint = 1;//最低ダメージ1 //MPダメージ量を計算する int sIAtkOnMP = specialData.attackInfluenceOnMP; int sIMagOnMP = specialData.attackInfluenceOnMP; int mpPoint = (int)((pAtk * sIAtkOnMP / 100f) + (pMag * sIMagOnMP / 100f) + specialData.MPDamageValue); //TPダメージ量を計算する int sIAtkOnTP = specialData.attackInfluenceOnTP; int sIMagOnTP = specialData.attackInfluenceOnTP; int tpPoint = (int)((pAtk * sIAtkOnTP / 100f) + (pMag * sIMagOnTP / 100f) + specialData.TPDamageValue); enemy_grobal.hp -= hpPoint; enemy_grobal.mp -= mpPoint; enemy_grobal.tp -= tpPoint; bool wasEffecitveSpecial = false; if (enemy_grobal.hp < 0) enemy_grobal.hp = 0; if (enemy_grobal.mp < 0) enemy_grobal.mp = 0; if (enemy_grobal.tp < 0) enemy_grobal.tp = 0; if (hpPoint > 0) { enemy_grobal.transform.DOShakePosition(0.3f, 0.5f, 20, 0, false, true);//New DialogTextManager.instance.SetScenarios(new string[] { enemy_grobal.name + "に" + hpPoint + "のダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (mpPoint > 0) { DialogTextManager.instance.SetScenarios(new string[] { enemy_grobal.name + "に" + mpPoint + "のMPダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (tpPoint > 0) { DialogTextManager.instance.SetScenarios(new string[] { enemy_grobal.name + "に" + tpPoint + "のTPダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (hpPoint == 0 && mpPoint == 0 && tpPoint == 0) { DialogTextManager.instance.SetScenarios(new string[] { enemy_grobal.name + "にダメージを与えられなかった!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); } yield return StartCoroutine(AddConditions()); yield return StartCoroutine(AddStatuEnforceORWeakended()); if (!wasEffecitveSpecial) { DialogTextManager.instance.SetScenarios(new string[] { "しかし何もおこらなかった" }); yield return new WaitForSeconds(1.2f); } } else//攻撃が命中しなかった場合 { DialogTextManager.instance.SetScenarios(new string[] { player.pname + "の攻撃は外れた" }); yield return new WaitForSeconds(1.2f); } enemy_grobal.gameObject.GetComponent<EnemyUIManager>().UpdateUI(enemy_grobal); }
SpecialEvent.csのIEUseAttackSpecialコルーチンの処理を作成した関数に置き換えます。
クリックで展開
IEnumerator IEUseAttackSpecial() { DialogTextManager.instance.SetScenarios(new string[] { player.pname + specialData.useMessage_Battle }); yield return new WaitForSeconds(1.5f); int activateCount = specialData.activateCount;//特技を発動する回数(複数回攻撃する時の処理) for (int j = 0; j < activateCount; j++) { yield return StartCoroutine(PlayBattleEffect()); player.CalcBattleStatusValues();//プレイヤーの戦闘時ステータスを計算する //敵への全体攻撃の場合はBattleManagerのenemysListの要素でループさせる if (specialData.target == SpecialData.TARGET.AllOfEnemy) //New { yield return StartCoroutine(AllOfEnemyAttackSpecialProcess());//全体攻撃の処理 } else //全体攻撃でない場合 { yield return StartCoroutine(OneOfEnemyAttackSpecialProcess());//単体攻撃の処理 } } //TPを消費する player.tp -= specialData.useTpValue; useSpecialMessagePanel.SetActive(false); playerUIManager.UpdateUI(PlayerManager.instance); specialUI.canTapSpecialUI = true; specialUsePanel.canTapSpecialUsePanel = true; specialUsePanel.gameObject.SetActive(false); }
これで攻撃特技の処理が分かりやすくなります。specialDataのactivateCount(特技の発動回数)分For文でループさせるようにしたのでこれで複数回攻撃の実装ができます。
敵をランダムに攻撃する処理を作るのに当たって、Dictinary型からランダムにKeyを取得する処理を使いたいと思います。Dictionary自体にそういった機能持つメソッドが用意されていない(多分)ので、ネットで調べた方法でDictinaryからランダムにKeyを取得できるようにします。こちらのサイトを参考にさせていただきました。
Dictionary型の拡張メソッドクラスDictionaryExtクラスを作成します。
クリックで展開
using System.Collections.Generic; using System; using System.Linq; //Dictionary型からランダムにKeyやValueを取得するための拡張メソッド public static class DictionaryExt { private static Random m_random; private static Random random => m_random ?? (m_random = new Random()); public static KeyValuePair<TKey, TValue> RandomAt<TKey, TValue>(this Dictionary<TKey, TValue> source) { if( source == null) { throw new ArgumentNullException( nameof(source) ); } return source.ElementAt( random.Next( 0, source.Count) ); } public static TKey RandomAt<TKey, TValue>(this Dictionary<TKey, TValue>.KeyCollection source) { if( source == null) { throw new ArgumentNullException(nameof(source)); } return source.ElementAt(random.Next(0, source.Count)); } public static TValue RandomAt<TKey, TValue>(this Dictionary<TKey, TValue>.ValueCollection source) { if(source == null) { throw new ArgumentNullException(nameof(source)); } return source.ElementAt(random.Next(0, source.Count)); } }
このクラスをプロジェクト内に置いておけばプロジェクト内のコードのDictionary型は全て拡張メソッドを使えます。
クリックで展開
//戦闘中に攻撃特技を使う処理 IEnumerator IEUseAttackSpecial() { DialogTextManager.instance.SetScenarios(new string[] { player.pname + specialData.useMessage_Battle }); yield return new WaitForSeconds(1.5f); int activateCount = specialData.activateCount;//特技を発動する回数(複数回攻撃する時の処理) int randomIndex = 0; for (int j = 0; j < activateCount; j++) { if (specialData.target == SpecialData.TARGET.OneOfEnemyAtRandom) { //enemysListからキーをランダムに取得 randomIndex = battleManager.enemysList.Keys.RandomAt();//DirectionaryExtの拡張メソッドを使用する yield return StartCoroutine(PlayBattleEffectWhenRandom(randomIndex)); } else { yield return StartCoroutine(PlayBattleEffect()); } player.CalcBattleStatusValues();//プレイヤーの戦闘時ステータスを計算する //敵への全体攻撃の場合はBattleManagerのenemysListの要素でループさせる if (specialData.target == SpecialData.TARGET.AllOfEnemy) //New { yield return StartCoroutine(AllOfEnemyAttackSpecialProcess());//全体攻撃の処理 } else if (specialData.target == SpecialData.TARGET.OneOfEnemyAtRandom) { yield return StartCoroutine(OneOfEnemyAtRandomAttackSpecialProcess(randomIndex)); } else //それ以外の場合 { yield return StartCoroutine(OneOfEnemyAttackSpecialProcess());//単体攻撃の処理 } if (battleManager.CheckAllEnemyDeath())//敵を全て倒している場合はループさせたくないのでbreak { break; } } //TPを消費する player.tp -= specialData.useTpValue; useSpecialMessagePanel.SetActive(false); playerUIManager.UpdateUI(PlayerManager.instance); specialUI.canTapSpecialUI = true; specialUsePanel.canTapSpecialUsePanel = true; specialUsePanel.gameObject.SetActive(false); if (battleManager.CheckAllEnemyDeath())//敵を全て倒している場合はここで戦闘を終了させる { yield return StartCoroutine(battleManager.EndBattle()); } } public IEnumerator PlayBattleEffectWhenRandom(int index) //New { //SEの再生 if (specialData.UseSEID != -1) { SoundManager.instance.PlaySE(specialData.UseSEID); } //アニメーションの再生 if (specialData.spAnimation != null) //アニメーションが設定されていたら { PlayEffect playEffect = new PlayEffect(); playEffect.playAllEffectPoint = allEffectPoint; yield return StartCoroutine(playEffect.IEPlaySpecialEffect(battleManager.enemysList[index].transform.position, specialData)); } } public IEnumerator OneOfEnemyAtRandomAttackSpecialProcess(int index) //New { EnemyManager enemy = battleManager.enemysList[index]; //攻撃特技のダメージ量を計算する((player 攻撃力 * 攻撃影響率 / 100)+(player 魔力 * 魔力影響率 / 100) + 固定ダメージ量) if (CheckHitAttackSpecial(enemy)) { //HPダメージ量を計算する int pAtk = player.battleStatusValues[GeneralEnum.STATUS.ATK]; int pAgi = player.battleStatusValues[GeneralEnum.STATUS.AGI]; int pMag = player.battleStatusValues[GeneralEnum.STATUS.MAGPOW]; int pDef = player.battleStatusValues[GeneralEnum.STATUS.DEF]; int pMdef = player.battleStatusValues[GeneralEnum.STATUS.MAGDEF]; int pLuk = player.battleStatusValues[GeneralEnum.STATUS.LUK]; int pLearn = player.battleStatusValues[GeneralEnum.STATUS.LEARNABI]; int sIAtk = specialData.attackInfluence; int sIAgi = specialData.agiInfluence; int sIMag = specialData.magicInfluence; int sIDef = specialData.defInfluence; int sIMDef = specialData.magdefInfluence; int sLuk = specialData.lukInfluence; int sLearn = specialData.learnInfluence; enemy.CalcBattleStatusValues();//敵の戦闘時ステータスを計算する int eDef = enemy.baseStatusValue[GeneralEnum.STATUS.DEF]; int eMdef = enemy.baseStatusValue[GeneralEnum.STATUS.MAGDEF]; //攻撃側の値を計算する float hpAtkValue = (pAtk * sIAtk / 100f) + (pAgi * sIAgi / 100f) + (pMag * sIMag / 100f) + (pDef * sIDef / 100f) + (pMdef * sIMDef / 100f) + (pLuk * sLuk / 100f) + (pLearn * sLearn / 100f) + specialData.HPDamageValue; //防御側の値を計算する(防御力がダメージを減らす割合は基本25%) _ = eMdef * specialData.thingE_MDEFRate / 100f;//特技の魔法防御反映率処理 float hpDefValue = (eDef / 4f) + eMdef; hpDefValue -= (hpDefValue * (specialData.penetrationRate / 100f));//貫通率処理 float calcDamage = hpAtkValue - hpDefValue; calcDamage *= UnityEngine.Random.Range(1.0f - specialData.damageDispersionRate / 100f, 1.0f + specialData.damageDispersionRate / 100f); //ダメージを分散させる New int hpPoint = (int)calcDamage; if (PlayerCheckCritical(enemy)) hpPoint *= 2; if (hpPoint < 1) hpPoint = 1;//最低ダメージ1 //MPダメージ量を計算する int sIAtkOnMP = specialData.attackInfluenceOnMP; int sIMagOnMP = specialData.attackInfluenceOnMP; int mpPoint = (int)((pAtk * sIAtkOnMP / 100f) + (pMag * sIMagOnMP / 100f) + specialData.MPDamageValue); //TPダメージ量を計算する int sIAtkOnTP = specialData.attackInfluenceOnTP; int sIMagOnTP = specialData.attackInfluenceOnTP; int tpPoint = (int)((pAtk * sIAtkOnTP / 100f) + (pMag * sIMagOnTP / 100f) + specialData.TPDamageValue); enemy.hp -= hpPoint; enemy.mp -= mpPoint; enemy.tp -= tpPoint; bool wasEffecitveSpecial = false; if (enemy.hp < 0) enemy.hp = 0; if (enemy.mp < 0) enemy.mp = 0; if (enemy.tp < 0) enemy.tp = 0; if (hpPoint > 0) { enemy.transform.DOShakePosition(0.3f, 0.5f, 20, 0, false, true);//New DialogTextManager.instance.SetScenarios(new string[] { enemy.name + "に" + hpPoint + "のダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (mpPoint > 0) { DialogTextManager.instance.SetScenarios(new string[] { enemy.name + "に" + mpPoint + "のMPダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (tpPoint > 0) { DialogTextManager.instance.SetScenarios(new string[] { enemy.name + "に" + tpPoint + "のTPダメージ!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); wasEffecitveSpecial = true; } if (hpPoint == 0 && mpPoint == 0 && tpPoint == 0) { DialogTextManager.instance.SetScenarios(new string[] { enemy.name + "にダメージを与えられなかった!" }); SoundManager.instance.PlaySE(15); yield return new WaitForSeconds(1.2f); } yield return StartCoroutine(AddConditions()); yield return StartCoroutine(AddStatuEnforceORWeakended()); if (!wasEffecitveSpecial) { DialogTextManager.instance.SetScenarios(new string[] { "しかし何もおこらなかった" }); yield return new WaitForSeconds(1.2f); } } else//攻撃が命中しなかった場合 { DialogTextManager.instance.SetScenarios(new string[] { player.pname + "の攻撃は外れた" }); yield return new WaitForSeconds(1.2f); } enemy.gameObject.GetComponent<EnemyUIManager>().UpdateUI(enemy); //HPが0ならここで敵撃破処理を行う if (enemy.hp <= 0) { yield return StartCoroutine(battleManager.EnemyDeath(index)); } }
効果対象がOneOfEnemyAtRandom(ランダムに敵一体)の時にbattleManagerのenemysListからKeyをランダムに取得して敵を攻撃する処理を入れました。PlayBattleEffectWhenRandomコルーチンで攻撃する敵の場所にエフェクトが再生されるようにしています。OneOfEnemyAtRandomAttackSpecialProcessコルーチンでランダムに敵一体を攻撃する時の処理を行っています。もし途中で敵を撃破した場合はbattleManagerのEnemyDeath関数を実行してたおした敵にまた攻撃しないようにします。そしてIEUseAttackSpecialコルーチンのfor文の最後でbattleManager.CheckAllEnemyDeathを行い敵が全て倒された場合はfor文を抜けてそれ以上攻撃が実行されないようにします。
IEUseAttackSpecialコルーチンの最後で再度battleManager.CheckAllEnemyDeathをし、trueなら戦闘終了処理をします。battleManagerの
StartPlayerTurnコルーチンの最後にも戦闘終了処理があるので、そちらはisBattleEndがfalseの場合に実行されるようにし、EndBattleが2回実行されないようにします。
クリックで展開
IEnumerator StartPlayerTurn() { switch (battleActionDic[0]) { case BATTLEACTIONTYPE.NORMALATTACK://通常攻撃の場合 yield return StartCoroutine(PlayerNormalAttack()); break; case BATTLEACTIONTYPE.GUARD://防御の場合 break; case BATTLEACTIONTYPE.ITEM://アイテムの場合 yield return StartCoroutine(PlayerUseItem()); break; case BATTLEACTIONTYPE.MAGIC://魔法の場合 break; case BATTLEACTIONTYPE.MOVE://特技の場合 yield return StartCoroutine(PlayerUseSpecial()); break; case BATTLEACTIONTYPE.ESCAPE: //逃げるの場合 break; } //----------敵を倒した時の処理--------------- if (!isBattleEnd)//SpecialEventの途中でEndBattleする可能性があるので戦闘が終了したかここで判定しておく(判定しないとENdBattleコルーチンが2回実行されてしまう) { for (int i = 0; i < 3; i++) { if (enemysList.ContainsKey(i)) { if (enemysList[i].hp <= 0) { yield return StartCoroutine(EnemyDeath(i)); } } } if (CheckAllEnemyDeath()) { yield return StartCoroutine(EndBattle()); } } }
これで戦闘テストをしてみます。
今回は以上です。