//未行動の敵を取得する private void GetBeforeMoveEnemy() { EnemyModel beforeActionEnemy = enemyContainer.GetComponentsInChildren <EnemyModel>().FirstOrDefault( enemy => enemy.isMoved == false); //未行動の敵が存在するので処理へ if (beforeActionEnemy != null) { Debug.Log("選択した敵 : " + beforeActionEnemy.enemy.name); //アクティブな敵を設定 mainMap.activeEnemyName = beforeActionEnemy.enemy.name; mainMap.activeEnemyid = beforeActionEnemy.enemyId; //フェーズ変更 enemyAIPhase = EnemyAIPhase.MOVE_CURSOR; Debug.Log("enemyAIPhase : " + enemyAIPhase); } else { Debug.Log("敵が全員行動済み"); //既に未行動の敵が存在しなければ終了 enemyAIPhase = EnemyAIPhase.END; Debug.Log("enemyAIPhase : " + enemyAIPhase); } }
//移動可能なセルを表示して、攻撃可能かの判定を同時に行う private void HighlightMovableCells() { if (deltaTime <= wait) { return; } deltaTime = 0; //移動可能かつプレイヤーに攻撃可能なセル表示 List <DestinationAndAttackDto> DestinationAndAttackDtoList = mainMap.ActiveEnemy.HighlightMovableCells(); if (DestinationAndAttackDtoList.Count == 0) { //攻撃可能範囲にプレイヤーが見つからないので探索モード isAttackable = false; Debug.Log("攻撃不可"); } else { //攻撃範囲にプレイヤーが居るので攻撃モード isAttackable = true; //TODO とりあえず適当な要素を取得するので、また優先順位の判定を作成する DestinationAndAttackDto = DestinationAndAttackDtoList[0]; Debug.Log("攻撃可"); } enemyAIPhase = EnemyAIPhase.MOVING; Debug.Log("enemyAIPhase : " + enemyAIPhase); }
//アクティブな敵へカーソルを移動させていく private void MoveCursor() { //既にカーソル移動中なら何もしない if (isCursorMove) { return; } //カーソル移動を実行 battleMapCursor.transform.DOMove(new Vector3( mainMap.ActiveEnemy.transform.position.x, mainMap.ActiveEnemy.transform.position.y + 0.5f, mainMap.ActiveEnemy.transform.position.z), 0.5f).SetEase(Ease.OutSine).OnComplete(() => { enemyAIPhase = EnemyAIPhase.MOVE; Debug.Log("enemyAIPhase : " + enemyAIPhase); isCursorMove = false; }); isCursorMove = true; }
//敵ターンの状態変更とログ出力 public void SetEnemyAIPhase(EnemyAIPhase enemyAIPhase) { this.enemyAIPhase = enemyAIPhase; Debug.Log("EnemyAIPhase : " + enemyAIPhase); }
//敵ユニットの移動 private void MoveTo() { //既に移動中の場合は処理が入らない if (isEnemyMove) { return; } isEnemyMove = true; Main_Cell destCell; //攻撃可能か否かで行き先セルを分岐 if (isAttackable) { //行き先の座標をセルに変換 destCell = mainMap.Cells.FirstOrDefault(c => c.X == DestinationAndAttackDto.x && c.Y == DestinationAndAttackDto.y); //事前に確認しているので通常セルが無い事は有り得ない if (destCell == null) { Debug.Log($"Error : 移動可能なセルが有りません : X = {DestinationAndAttackDto.x} , Y = {DestinationAndAttackDto.y}"); } //移動先 = 現在いる場所で攻撃する場合は移動を行わないで攻撃へ if (destCell.X == mainMap.ActiveEnemy.x && destCell.Y == mainMap.ActiveEnemy.y) { isEnemyMove = false; //移動範囲、攻撃範囲消す mainMap.ResetMovableCells(); mainMap.ResetAttackableCells(); enemyAIPhase = EnemyAIPhase.ATTACK; Debug.Log("enemyAIPhase : " + enemyAIPhase); return; } //カーソル移動を実行してからユニット移動 battleMapCursor.transform.DOMove(new Vector3( destCell.transform.position.x, destCell.transform.position.y + 0.5f, destCell.transform.position.z), 0.3f).SetEase(Ease.OutSine).OnComplete(() => { deltaTime = 0; //敵ユニットの移動実行 第二引数は攻撃か否か mainMap.ActiveEnemy.MoveTo(destCell, true); }); } else { //プレイヤーに攻撃出来ない場合 //反撃タイプ、ボスの敵は攻撃範囲にプレイヤーが居なければ待機する if (mainMap.ActiveEnemy.enemyAIPattern != EnemyAIPattern.SEARCH) { //移動可能セルを消す mainMap.ResetMovableCells(); mainMap.ResetAttackableCells(); //行動済みにして次の敵を取得 mainMap.ActiveEnemy.isMoved = true; mainMap.ActiveEnemy.SetBeforeAction(false); enemyAIPhase = EnemyAIPhase.GET_ENEMY; Debug.Log("enemyAIPhase : " + enemyAIPhase); Debug.Log($"敵のAIパターン : {mainMap.ActiveEnemy.enemyAIPattern}"); isEnemyMove = false; } else { //プレイヤーを探索するAIの場合 //プレイヤーのユニットを検索して取得してセルに変換 PlayerModel[] players = unitContainer.GetComponentsInChildren <PlayerModel>(); if (players == null) { Debug.Log("Error : プレイヤーが存在しません"); } //プレイヤーの座標までの最短経路を取得 Main_Cell playerNearestCell = mainMap.ActiveEnemy.Search(players); //カーソル移動を実行してからユニット移動 battleMapCursor.transform.DOMove(new Vector3( playerNearestCell.transform.position.x, playerNearestCell.transform.position.y + 0.5f, playerNearestCell.transform.position.z), 0.3f).SetEase(Ease.OutSine).OnComplete(() => { deltaTime = 0; //敵ユニットの移動実行 第二引数は攻撃か否か mainMap.ActiveEnemy.MoveTo(playerNearestCell, false); }); } } }