Esempio n. 1
0
    //未行動の敵を取得する
    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);
        }
    }
Esempio n. 2
0
    //移動可能なセルを表示して、攻撃可能かの判定を同時に行う
    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);
    }
Esempio n. 3
0
    //アクティブな敵へカーソルを移動させていく
    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;
    }
Esempio n. 4
0
 //敵ターンの状態変更とログ出力
 public void SetEnemyAIPhase(EnemyAIPhase enemyAIPhase)
 {
     this.enemyAIPhase = enemyAIPhase;
     Debug.Log("EnemyAIPhase : " + enemyAIPhase);
 }
Esempio n. 5
0
    //敵ユニットの移動
    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);
                });
            }
        }
    }