예제 #1
0
파일: Enemy.cs 프로젝트: kuroshum/Hostage
    /// <summary>
    /// 目的地を設定する関数
    /// </summary>
    /// <param name="pm"> 確率マップからプレイヤーがいる確率の高い座標を選択するためのインスタンス </param>
    /// <param name="stageList"> 保存している確率マップを取り出す用のリスト </param>
    public void SelectTarget(ProbabilityMap pm, ref List <Stage> stageList)
    {
        // 中継地点が設定されている場合、中継地点に到着したので中継地点を初期化
        if (relayStagePos != Vector3.zero)
        {
            relayStagePos = Vector3.zero;
            return;
        }
        // 中継地点が設定されていない場合、目的地に到着したので次の目的地を設定
        else
        {
            // 次の目的地を設定
            targetStage = pm.Sort_Prob(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;

            SetStageID(targetStage.id);
        }
    }
예제 #2
0
    public void SelectTarget(ProbabilityMap pm, ref List <Stage> stageList)
    {
        /*
         * for (int i = 0; i < stages.Length; i++)
         * {
         *  tmpStageColors[i] += (stages[i].gameObject.transform.position - this.gameObject.transform.position).magnitude;
         * }
         */

        targetPosStk.Pop();

        if (targetPosStk.Count == 0)
        {
            //Debug.Log("Select Target");

            targetStage = pm.Sort_Prob(stageList);

            Vector3 targetPos = new Vector3(targetStage.obj.transform.position.x, targetStage.obj.transform.position.y + 1, targetStage.obj.transform.position.z);
            targetPos = targetPos + (targetPos - this.transform.position).normalized / 2;

            targetPosStk.Push(targetPos);

            wp.Initialize();
        }


        MoveFlag = false;
    }
예제 #3
0
    public void Add_Enemy(Vector3 pos)
    {
        Enemy e           = Enemy.Add(e_list.Count, pos.x, 0.75f, pos.z, this);
        Stage targetStage = pm.Sort_Prob(stageList);

        e.InitMgrTarget(enemy_move_speed / 2, new Vector3(targetStage.obj.transform.position.x, targetStage.obj.transform.position.y + 1, targetStage.obj.transform.position.z));

        e_list.Add(e);
    }
예제 #4
0
파일: Enemy.cs 프로젝트: kuroshum/Hostage
    /*===================================================*/
    // 更新処理

    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);
        }
    }