Esempio n. 1
0
    public void UpdateEnemy(ProbabilityMap pm, List <Stage> stageList, List <Wall> wallList, Vector3 playerPos)
    {
        pm.UpdateProbabilityMap(ref stageList, this.transform.forward, this.transform.position);

        if (GetAttack())
        {
            if (IsReachTarget(ref stageList))
            {
                PushTargetPosStk(playerPos);
            }

            Look();
            Shoot(playerPos);
        }
        else
        {
            if (IsReachTarget(ref stageList))
            {
                //Debug.Log("Reach Target");
                SelectTarget(pm, ref stageList);
            }

            SearchPlayer(playerPos);
        }


        forward.x = to_binary(this.transform.forward.x);
        forward.y = to_binary(this.transform.forward.y);

        SelectTarget_in_Obst(forward, ref wallList);

        //Coloring_Target(ref targetStage, new Color(targetStage.material.color.r, 1.0f, targetStage.material.color.b, 0.0f));

        Move_Target();
    }
Esempio n. 2
0
    /*===================================================*/
    // 更新処理

    void Update()
    {
        if (startFlag == false)
        {
            return;
        }

        // 障害物にぶつかっている時間を計測
        if (ObstFlag)
        {
            obstTime += Time.deltaTime;
        }

        // 障害物に一定時間ぶつかっていた場合は障害物があると判定
        if (obstTime > 2.0f)
        {
            relayStagePos = Vector3.zero;
            obstTime      = 0;
            ObstFlag      = false;

            // 次の目的地を設定
            targetStage = pm.Sort_Prob(GameMgr.stageList, this);

            // 次の目的地の座標を設定
            targetStagePos = new Vector3(targetStage.obj.transform.position.x, targetStage.obj.transform.position.y + 1, targetStage.obj.transform.position.z);

            // ウェイポイントを初期化
            wp.Initialize();

            // 目的地の方向を向く前は移動しない
            moveFlag = false;
        }

        // 確率マップを更新
        pm.UpdateProbabilityMap(ref GameMgr.stageList, this.transform.forward, this.transform.position);


        switch (states)
        {
        // 通常ステートの場合
        case StateType.Normal:

            // 通常の巡回
            Patrol(normalEyeSightLength, normalEyeSightRange);


            // 注意・警告のUIを非表示にする
            dangerEnemyUIFlag  = false;
            cautionEnemyUIFlag = false;

            dangerUIFlag = false;

            break;

        // 注意ステートの場合
        case StateType.Caution:

            if (trailFlag == true)
            {
                // 現在見つけている跡より一つ新しい跡を取得
                if (GameMgr.trailList.Count > foundTrailInd)
                {
                    Vector3 pos = GameMgr.trailList[foundTrailInd].transform.position;
                    pos = new Vector3(pos.x, player.transform.position.y, pos.z);
                    // プレイヤーの跡を追跡
                    CautionFollowTrail(cautionEyeSightLength, cautionEyeSightRange, pos);
                }
                else
                {
                    trailFlag = false;
                }
            }
            else
            {
                // 注意ステートの巡回
                CautionPatrol(cautionEyeSightLength, cautionEyeSightRange, player.transform.position);
            }


            // 注意のUIを表示する
            dangerEnemyUIFlag  = false;
            cautionEnemyUIFlag = true;

            dangerUIFlag = false;

            // cautionステートの時間を計測する
            ctm.UpdateCautionTime(this);

            break;

        // 警告ステートの場合
        case StateType.Danger:

            //targetStagePos = player.transform.position;

            // 生きているデコイを検知した場合
            if (decoy != null && decoy.GetIsDeath() == false)
            {
                // その場でデコイに攻撃する
                moveFlag = false;
                DecoyAttack(decoy.transform.position);

                dangerUIFlag = false;
            }
            else
            {
                // デコイが死んだのを検知した場合
                if (decoy != null && decoy.GetIsDeath() == true)
                {
                    // 通常ステートに移行する
                    SetStates(StateType.Normal);
                    speed = normalSpeed;

                    dangerUIFlag = false;

                    //break;
                }
                // プレイヤーを検知した場合
                else
                {
                    // プレイヤーを検知した場合はプレイヤーを攻撃する
                    moveFlag = true;
                    Attack(player.transform.position);

                    dangerUIFlag = true;
                }
            }

            // 警告のUIを表示する
            dangerEnemyUIFlag  = true;
            cautionEnemyUIFlag = false;

            break;
        }

        dangerEnemyUI.SetActive(dangerEnemyUIFlag);
        cautionEnemyUI.SetActive(cautionEnemyUIFlag);

        forward.x = to_binary(this.transform.forward.x);
        forward.y = to_binary(this.transform.forward.y);

        // 障害物があった場合に回避するためのポイントを検索し設定
        SelectTarget_in_Obst(forward, GameMgr.wallList);

        // ターゲットの方向に移動する
        MoveTarget();


        // UIを敵と一緒に移動させるs
        FollowUI(cautionEnemyUI, offset);
        FollowUI(dangerEnemyUI, offset);

        // 鍵持ち持ちの場合は鍵UIを一緒に移動させる
        if (keyEnemyUIFlag == true)
        {
            FollowUI(keyEnemyUI, keyOffset);
        }
    }