private IEnumerator SelectCommand(Vector2 countActionCharacterInfo) { // 味方キャラが行動できないなら処理終了 if (countActionCharacterInfo.x == 0) { // 敵キャラクターの行動は通常攻撃のみ(仮) selectedCommand = 0; yield break; } // 基本的に全項目選択可能 int isMagicEnable = 1; int isUnisonEnable = 1; // ユニゾン状態の場合、ユニゾンを選択不可に if (countActionCharacterInfo.x >= 2) { isUnisonEnable = 0; } // 詠唱中キャラが含まれていたら 攻撃 のみ選択可 if (OpeCharaList.CountActionableMagic(cd, enemyCd) != 0) { isMagicEnable = 0; isUnisonEnable = 0; } // 選択肢表示処理実行 yield return(DoSelectCommand(new Vector3(1, isUnisonEnable, isMagicEnable))); }
public void SetParameter(PlayerCharacter[] _cd) { // cd を設定する cd = _cd; // ボタンオブジェクトのインスタンス化 buttonObj = new GameObject[4]; // ボタンオブジェクト取得 buttonObj[0] = gameObject.transform.Find("RightButton").gameObject; buttonObj[1] = gameObject.transform.Find("LeftButton").gameObject; buttonObj[2] = gameObject.transform.Find("CharacterGraphic").gameObject; buttonObj[3] = gameObject.transform.Find("Text").gameObject; // 親オブジェクトに自分自身を設定(一緒に破棄されて欲しい) foreach (GameObject o in buttonObj) { o.transform.SetParent(this.transform); } // 初期値の設定 do { selectId++; selectId %= cd.Length; } while (cd[selectId].ctbNum > 0); // 顔グラ初期セット SetFaceGraphic(); // テキスト設定(魔力レベルの和) int sum = OpeCharaList.GetSumMoveableMag(_cd); buttonObj[3].GetComponent <Text>().text = "詠唱 LV" + sum + "!"; }
/* * =========================================================== * 対象キャラクターの選択 * =========================================================== */ // ターゲットの選択を行う // ┗ 呼出元: PlayActionNoRamble // ┗ 条件: selectedCommand selectedLeader が決定済 IEnumerator SelectTarget(Vector2 countActionCharacterInfo) { // 味方キャラが行動できないなら処理終了( 敵キャラの値を設定 ) if (countActionCharacterInfo.x == 0) { for (int i = 0; i < 10000; i++) { selectedTarget = UnityEngine.Random.Range(0, cd.Length); if (cd[selectedTarget].cs != null && !cd[selectedTarget].isknockout) { break; } } yield break; } // ノックバック値の和を求める int knockback = OpeCharaList.GetSumKnockback(cd); // 攻撃コマンドの場合のみターゲット選択を行う if (selectedCommand == (int)Command.Attack) { yield return(DoSelectTarget2(knockback)); } else { selectedTarget = 0; // 攻撃コマンドでない場合、決定済として扱う } }
/* 戦闘終了時の処理 */ // ( リザルト表示終了後 ) private void BattleEnd() { // 詠唱終了 OpeCharaList.AllCharaEndMagic(cd); OpeCharaList.AllCharaEndMagic(enemyCd); OpeCharaList.AllCharaEndWaitUnison(cd); OpeCharaList.AllCharaEndWaitUnison(enemyCd); }
// 終了判定 // 1 = プレイヤー勝利 // -1 = 敵勝利 // 0 = 続行 private int CheckFinish() { if (OpeCharaList.isAllKnockout(enemyCd)) { return(1); } if (OpeCharaList.isAllKnockout(cd)) { return(-1); } return(0); }
/* ボタンクリック式 */ IEnumerator DoSelectTarget2(int sumKnockback) { // カーソルオブジェクトを作成 GameObject cursorObj = MakeCursorObj(); string FilePath = "Prefabs\\Battle\\SelectTarget"; GameObject tObj = (GameObject)Instantiate(Resources.Load(FilePath), new Vector3(400, 0, 0), Quaternion.identity); tObj.GetComponent <SelectTarget>().SetParameter(enemyCd); tObj.GetComponent <SelectTarget>().SetEnableButtonFromKnockout(enemyCd); tObj.transform.SetParent(canvas.transform, false); // プレイヤの予測オブジェクトを表示 OpeCharaList.SetPredictActionableCharacter(cd); int charaNum = OpeCharaList.CountActionableCharacter(cd); // コマンドを選ぶまでループ int _mouseOver = -1; int mouseOver = 0; while (true) { // 予測表示 mouseOver = tObj.GetComponent <SelectTarget>().mouseOverId; if (_mouseOver != mouseOver) { SetCursorObj(mouseOver, cursorObj); // カーソルオブジェクトの座標移動 PredictObject.SetInactiveAllPredictObj(null, enemyCd); enemyCd[mouseOver].predictObj.SetFromCharacterStatus(enemyCd[mouseOver], sumKnockback, charaNum); _mouseOver = mouseOver; } // 終了判定 if (tObj.GetComponent <SelectTarget>().selectId != -1) { selectedTarget = tObj.GetComponent <SelectTarget>().selectId; if (selectedTarget < 0) { selectedTarget = -1; // キャンセルした } break; } yield return(0); } Destroy(tObj); Destroy(cursorObj); PredictObject.SetInactiveAllPredictObj(cd, enemyCd); }
IEnumerator PlayActionRamble(Vector2 countActionCharacterInfo) { // 敵のリーダーキャラクターの選択( 1体でも発動 ) int enemyLeader = SelectLeaderEnemy(countActionCharacterInfo); GameObject enemyLeaderObj = DrawEnemyLeader(enemyLeader); // 味方のリーダーキャラクター選択 selectedLeader = -1; while (selectedLeader == -1) { yield return(SelectLeaderPlayer(countActionCharacterInfo)); } DestroyObject(enemyLeaderObj); // 勝敗判定 int isPlayerWin = JudgeRamble(enemyCd[enemyLeader].cs.element); if (isPlayerWin == 1) { mCombo.AddPlayerCombo(); } else if (isPlayerWin == -1) { mCombo.AddEnemyCombo(); } // 少ない方にスタン処理&ダメージ。 int stunCtbNum = 7; if (isPlayerWin == 1) { OpeCharaList.CallStun(enemyCd, stunCtbNum); } else if (isPlayerWin == -1) { OpeCharaList.CallStun(cd, stunCtbNum); } // エフェクト表示 // ユニゾン・詠唱を終了 OpeCharaList.EndWaitUnison(cd); OpeCharaList.EndWaitUnison(enemyCd); OpeCharaList.EndMagic(cd); OpeCharaList.EndMagic(enemyCd); // CTB 値を再設定( waitAction の値を格納 ) CtbManager.SetCtbNum(cd, enemyCd); }
// 行動できるキャラクターが出るまでループを回す IEnumerator DecideNextActionCharacter() { Vector2 tmp = OpeCharaList.CountActionableCharacter(cd, enemyCd); int isActionableChara = (int)tmp.x + (int)tmp.y; while (isActionableChara == 0) { Debug.Log("OK"); // CTBメータを 1 つ進める isActionableChara += CtbManager.SubCtbNum(cd); isActionableChara += CtbManager.SubCtbNum(enemyCd); CtbManager.SubStun(cd, enemyCd); // メモ: CTB値の更新⇒スタン値の更新の順番である必要がある // 移動演出のコルーチンを呼び出す yield return(CtbMove()); // メモ: 処理終了後に CTB値・STUN値をもとにした位置に再描画 // yield return Utility._Wait.WaitKey(); } } // --- DecideNextActionCharacter()
} // --- DecideNextActionCharacter() // 誰かが動ける状況になると呼ばれる処理 // ( ランブル・通常アクション・ユニゾンに振り分ける ) IEnumerator PlayAction() { // ランブル判定。( ユニゾン中のキャラは数えない ) Vector2 countActionCharacterInfo = OpeCharaList.CountActionableCharacter(cd, enemyCd); // ランブル・ユニゾン・通常アクションの 3 パターンがありえる if (countActionCharacterInfo.x * countActionCharacterInfo.y == 0) { // ランブルでない場合の処理 yield return(PlayActionNoRamble(countActionCharacterInfo)); } else { // ランブル yield return(PlayActionRamble(countActionCharacterInfo)); } yield return(0); }
} // ---SetCursorObj /* * ================================================ * コマンド選択 / リーダーキャラクター選択 * ================================================ */ // 行動内容選択(アタック・ユニゾン・攻撃) // 設定方法: vec( int, int, int ) で選択肢を // 表示するか否かを示す private IEnumerator DoSelectCommand(Vector3 vec) { string FilePath = "Prefabs\\Battle\\SelectAction"; GameObject selObj = (GameObject)Instantiate(Resources.Load(FilePath), new Vector3(400, 0, 0), Quaternion.identity); selObj.GetComponent <SelectAction>().SetParameter(vec); selObj.transform.SetParent(canvas.transform, false); // コマンドを選ぶまでループ int mouseOverId = 0; int _mouseOverId = -1; while (true) { // マウスオーバーに基づく予測表示処理 if (mouseOverId != _mouseOverId) { PredictObject.SetInactiveAllPredictObj(cd, null); if (mouseOverId == 0) { OpeCharaList.SetPredictActionableCharacter(cd); } if (mouseOverId == 2) { OpeCharaList.SetMagPredictActionableCharacter(cd); } } mouseOverId = selObj.GetComponent <SelectAction>().mouseOverId; // 決定処理 if (selObj.GetComponent <SelectAction>().selectId >= 0) { selectedCommand = selObj.GetComponent <SelectAction>().selectId; break; } yield return(0); } Destroy(selObj); PredictObject.SetInactiveAllPredictObj(cd, null); }
private GameObject DrawEnemyLeader(int elId) { // リーダーキャラクター選択処理 string FilePath = "Prefabs\\Battle\\EnemyLeader"; GameObject eObj = (GameObject)Instantiate(Resources.Load(FilePath), new Vector3(-400, 0, 0), Quaternion.identity); eObj.transform.SetParent(canvas.transform, false); GameObject ecObj = eObj.transform.Find("CharacterGraphic").gameObject; ecObj.GetComponent <Image>().sprite = enemyCd[elId].ctbFaceObj.faceObj.GetComponent <Image>().sprite; ecObj = eObj.transform.Find("Text").gameObject; ecObj.GetComponent <Text>().text = "詠唱 LV" + OpeCharaList.GetSumMoveableMag(enemyCd) + "!"; return(eObj); }
// プレイヤーが勝利する場合に 1 敗北する場合に -1 を返す private int JudgeRamble(int eEle) { int isPlayerWin = 1; // それぞれのサイドのMag値の和を求める int playerMagSum = OpeCharaList.GetSumMoveableMag(cd); int enemyMagSum = OpeCharaList.GetSumMoveableMag(enemyCd); int pEle = cd[selectedLeader].cs.element; // 魔力レベル合計値のよる勝敗判定 if (playerMagSum < enemyMagSum) { isPlayerWin = -1; return(isPlayerWin); } // 属性による勝敗判定 if (pEle == eEle) { isPlayerWin = 1; } return(isPlayerWin); }
// 後処理 IEnumerator AfterAction() { // ウェイトを挟む yield return(Utility._Wait.WaitFrame(30)); // CTBが0のキャラかつユニゾンでないキャラにウェイトをセット // ( 詠唱の場合は、ここに来る前に値がセットされているので必要ない ) for (int i = 0; i < cd.Length; i++) { cd[i].SetCtbNumFromWaitAction(); } for (int i = 0; i < enemyCd.Length; i++) { enemyCd[i].SetCtbNumFromWaitAction(); } // 戦闘不能判定 OpeCharaList.KnockoutEffect(cd); OpeCharaList.KnockoutEffect(enemyCd); // 情報を再描画 DrawCharacterData(); }
public static IEnumerator DoUnison(BaseCharacter[] actionCharas, BaseCharacter TargetChara, ComboManager cm) { // 演出を表示する(攻撃者の演出) GameObject canvas = GameObject.Find("Canvas"); List <GameObject> uniObj = new List <GameObject>(); int unisonCount = 0; int unisonSupport = 0; for (int i = 0; i < actionCharas.Length; i++) { if (actionCharas[i].ctbNum == 0) { string str = actionCharas[i].cs.standGraphicPath; unisonSupport += actionCharas[i].cs.unisonSupport; GameObject obj = Utility._Object.MyGenerateImage(str, canvas, new Vector2(270, 540)); obj.GetComponent <RectTransform>().localPosition = id2Pos(unisonCount); uniObj.Add(obj); unisonCount++; SoundManager.PlaySe(Variables.SE.SeName.battle_unison_chari); yield return(Utility._Wait.WaitFrame(10)); } } // ウェイト yield return(Utility._Wait.WaitFrame(30)); // ユニゾンのエフェクトを消す foreach (GameObject g in uniObj) { Destroy(g); } // 対象表示 DamageEffect.TargetGraphicDraw(TargetChara); yield return(Utility._Wait.WaitFrame(10)); // 戦闘アニメーション SoundManager.PlaySe(Variables.SE.SeName.battle_unison_effect); DamageEffect.AttackEffect(1); yield return(Utility._Wait.WaitFrame(45)); // ダメージの算出 SoundManager.PlaySe(Variables.SE.SeName.battle_unison_damage); int damage = OpeCharaList.GetAverageAtk(actionCharas); damage *= (BCV.UNISON_DAMAGE_COEFFICIENT[unisonCount]); damage /= 100; damage *= cm.magnificationDamage; damage /= 100; damage *= (100 + unisonSupport); // ( 要調整 ) damage /= 100; TargetChara.hp -= damage; if (TargetChara.hp < 0) { TargetChara.hp = 0; } // ダメージの演出 DamageEffect.DrawDamage(damage); DamageEffect.DrawCombo(cm); yield return(Utility._Wait.WaitFrame(45)); DamageEffect.DestroyAllObject(); yield return(0); }
// コマンド内容をもとに // 動けるキャラクターすべての行動(攻撃・ユニゾン・詠唱)を行う // ( 吹き飛び処理もこの中で処理する ) // ┗ 呼出元: PlayActionNoRamble // ┗ 条件: selectedCommand selectedLeader selectedTarget が決定済 IEnumerator CallCharacterAction() { // 詠唱中キャラの平均待機値を求めておく int avePlayerMagWait = OpeCharaList.GetAverageMagWait(cd); int aveEnemyMagWait = OpeCharaList.GetAverageMagWait(enemyCd); int actionCharacterNum = 0; bool isPlayerTurn = true; BaseCharacter targetChara = null; for (int i = 0; i < cd.Length; i++) { // 味方キャラクター。CTB ゲージが 0 の場合。 if (cd[i].ctbNum <= 0 && !cd[i].isWaitUnison) { // コマンドに応じた行動を行う if (selectedCommand == (int)Command.Attack) { targetChara = enemyCd[selectedTarget]; actionCharacterNum++; isPlayerTurn = true; mCombo.AddPlayerCombo(); yield return(cd[i].PlayAction( selectedTarget, enemyCd, mCombo)); } else if (selectedCommand == (int)Command.Unison) { cd[i].StartUnison(); } else if (selectedCommand == (int)Command.Magic) { cd[i].StartMagic(avePlayerMagWait); } } } for (int i = 0; i < enemyCd.Length; i++) { // 敵キャラクター。CTB ゲージが 0 の場合。 if (enemyCd[i].ctbNum <= 0 && !enemyCd[i].isWaitUnison) { if (selectedCommand == (int)Command.Attack) { targetChara = cd[selectedTarget]; actionCharacterNum++; isPlayerTurn = false; mCombo.AddEnemyCombo(); yield return(enemyCd[i].PlayAction( selectedTarget, cd, mCombo)); } else if (selectedCommand == (int)Command.Unison) { enemyCd[i].StartUnison(); } else if (selectedCommand == (int)Command.Magic) { enemyCd[i].StartMagic(aveEnemyMagWait); } } } // 複数人が攻撃に参加している場合はユニゾンの追撃処理を行う if (actionCharacterNum >= 2) { // あらかじめコンボの値を増やしておく // ( どちらが攻撃したかをUnison内で知る術はないので ) if (isPlayerTurn) { mCombo.AddPlayerCombo(); } else { mCombo.AddEnemyCombo(); } // ユニゾンの処理を呼び出す if (isPlayerTurn) { yield return(Unison.DoUnison(cd, enemyCd[selectedTarget], mCombo)); } else { yield return(Unison.DoUnison(enemyCd, cd[selectedTarget], mCombo)); } } // 対象キャラを吹き飛ばす if (targetChara != null) // 対象キャラがいない(≒詠唱・ユニゾン)なら無視 { int sumKnockback; if (isPlayerTurn) { sumKnockback = OpeCharaList.GetSumKnockback(cd); } else { sumKnockback = OpeCharaList.GetSumKnockback(enemyCd); } int knockback = PredictObject.CalcBlowNum(targetChara, sumKnockback, actionCharacterNum); targetChara.ctbNum += knockback; } }
/* * ================================================ * PlayAction の内部処理 * ================================================ */ // 通常攻撃・ユニゾンの場合に呼ばれる処理 // ( コマンド入力を行い、処理を実行する ) IEnumerator PlayActionNoRamble(Vector2 countActionCharacterInfo) { // 行動サイドのユニゾン待機を終了 bool isPlayer = (countActionCharacterInfo.x >= 1); if (isPlayer) { OpeCharaList.EndWaitUnison(cd); } else { OpeCharaList.EndWaitUnison(enemyCd); } // 行動人数の情報を再度取得( コマンド選択前に ) countActionCharacterInfo = OpeCharaList.CountActionableCharacter(cd, enemyCd); // コマンド選択・リーダー決定・ターゲット選択を行う selectedCommand = -1; selectedLeader = -1; selectedTarget = -1; while (true) { if (selectedCommand == -1) { // コマンド選択を行う( 攻撃・待機・詠唱など ) yield return(SelectCommand(countActionCharacterInfo)); continue; } if (selectedLeader == -1) { // リーダーキャラクターの選択 yield return(SelectLeader(countActionCharacterInfo)); if (selectedLeader == -1) { selectedCommand = -1; } continue; } if (selectedTarget == -1) { // ターゲットキャラクターの選択 yield return(SelectTarget(countActionCharacterInfo)); if (selectedTarget == -1) // ターゲット選択でキャンセル { selectedLeader = -1; if (countActionCharacterInfo.x == 1 || countActionCharacterInfo.y == 1 || selectedCommand == (int)Command.Magic) { // リーダー選択が存在しないならば 2 ステップ戻す // ( 単体攻撃・詠唱の場合 ) selectedCommand = -1; } } continue; } break; } // 入力内容に応じて、処理を実行する yield return(CallCharacterAction()); }