コード例 #1
0
ファイル: PursueTargetState.cs プロジェクト: kenttim/MAGD488
    public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager)
    {
        if (enemyManager.isPerformingAction)
        {
            enemyAnimatorManager.anim.SetFloat("Vertical", 0, 0.1f, Time.deltaTime);
            return(this);
        }


        Vector3 targetDirection    = enemyManager.currentTarget.transform.position - enemyManager.transform.position;
        float   distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, enemyManager.transform.position);
        float   viewableAngle      = Vector3.Angle(targetDirection, enemyManager.transform.forward);

        //if we are performing an action, stop our movement
        if (distanceFromTarget > enemyManager.maximumAttackRange)
        {
            enemyAnimatorManager.anim.SetFloat("Vertical", 1, 0.1f, Time.deltaTime);
        }

        HandleRotationTowardsTarget(enemyManager);


        if (distanceFromTarget <= enemyManager.maximumAttackRange)
        {
            return(combatStanceState);
        }
        else
        {
            return(this);
        }
    }
コード例 #2
0
    public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager)
    {
        float distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, enemyManager.transform.position);

        HandleRotationTowardsTarget(enemyManager);

        if (enemyManager.isPerformingAction)
        {
            enemyAnimatorManager.anim.SetFloat("Vertical", 0, 0.1f, Time.deltaTime);
        }

        if (enemyManager.currentRecoveryTime <= 0 && distanceFromTarget <= enemyManager.maximumAttackRange)
        {
            return(attackState);
        }
        else if (distanceFromTarget > enemyManager.maximumAttackRange)
        {
            return(pursueTargetState);
        }
        else
        {
            return(this);
        }
        //potentially circle the player or walk around them
    }
コード例 #3
0
 public void Initialize()
 {
     enemy_manager = Enemy_Manager.Instance;
     enemy_script  = gameObject.GetComponent <Enemy>();
     enemy_status  = new Enemy_Status();
     enemy_move    = new Enemy_Move();
 }
コード例 #4
0
 public static void DeleteEnemy(Enemy_Manager _Enemy)
 {
     if (_Enemys.Contains(_Enemy))
     {
         _Enemys.Remove(_Enemy);
     }
 }
コード例 #5
0
    public void ReciveTactical(Enemy_Manager _Enemy)
    {
        if (_Text == null)
        {
            _Text = UI_MANAGER.m_UI_MANAGER.Tactical;
        }
        switch (_Attack_Style)
        {
        case Attack_Style.NONE:
            break;

        case Attack_Style.Move_Forward:
            Tactical         = _Enemy.gameObject.AddComponent <Move_Forward>();
            Tactical._this   = _Enemy;
            _Enemy._Tactical = Tactical;
            _Text.text       = "전진";
            break;

        case Attack_Style.Charge:
            Tactical         = _Enemy.gameObject.AddComponent <Charge>();
            Tactical._this   = _Enemy;
            _Enemy._Tactical = Tactical;
            _Text.text       = "돌격";
            break;

        case Attack_Style.Siege:
            Tactical         = _Enemy.gameObject.AddComponent <Siege>();
            Tactical._this   = _Enemy;
            _Enemy._Tactical = Tactical;
            _Text.text       = "포위";
            break;
        }

        switch (_Defense_Style)
        {
        case Defense_Style.NONE:
            break;

        case Defense_Style.Build_Recon:
            Tactical         = _Enemy.gameObject.AddComponent <By_Pass>();
            Tactical._this   = _Enemy;
            _Enemy._Tactical = Tactical;
            _Text.text       = "백핸드";
            break;

        case Defense_Style.Shot_Run:
            Tactical         = _Enemy.gameObject.AddComponent <Shot_Run>();
            Tactical._this   = _Enemy;
            _Enemy._Tactical = Tactical;
            _Text.text       = "능동방어";
            break;

        case Defense_Style.Bypass:
            Tactical         = _Enemy.gameObject.AddComponent <By_Pass>();
            Tactical._this   = _Enemy;
            _Enemy._Tactical = Tactical;
            _Text.text       = "백핸드";
            break;
        }
    }
コード例 #6
0
    /// <summary>
    /// 実際に攻撃を行い、ゲームを進める
    /// </summary>
    /// <param name="on_first">1マス先を取るのに使用</param>
    void Attack_Process(int adjust_value1, int adjust_value2)
    {
        var enemy_manager = new Enemy_Manager();

        // 隣接してるエネミーを調べる
        GameObject side_enemy = enemy_manager.Find_Enemy(player_script.position.x + adjust_value1,
                                                         player_script.position.y + adjust_value2);
        // 隣接してるエネミーのステータスを取ってくる
        var enemy_status = side_enemy.GetComponent <Enemy_Controller>().enemy_status;

        enemy_status.hit_point -= damage_calculation.Damage(player_status.attack,
                                                            enemy_status.defence);
        // ダメージのログを流す
        Log_Scroll.Player_Attack_Log(player_status, side_enemy, damage_calculation.Damage(player_status.attack,
                                                                                          enemy_status.defence));

        // 攻撃した敵が死んでいたら経験値を取得
        if (enemy_status.hit_point <= 0)
        {
            // レベルアップより先に経験値を取得
            Log_Scroll.Get_Experience_Point(player_status, side_enemy, enemy_status.experience_point);

            // 実際に経験値を取得し、次レベルに必要な経験値量に達しているかを見る
            player_status.Add_Experience_Point(enemy_status.experience_point);

            // ダンジョンに出現中の敵のリストを取得
            List <GameObject> enemy_list = Enemy_Manager.Instance.enemies;
            // プレイヤーに隣接しているものを抽出
            enemy_manager.Dead_Enemy(enemy_list.IndexOf(side_enemy));
        }
        // 移動状態に戻す
        player_action.Set_Action(ePlayer_State.Move);
    }
コード例 #7
0
    /// <summary>
    /// ダンジョンに出現する敵の種類ごとにステータスを設定し、リストに格納する
    /// </summary>
    public void Create_Enemy()
    {
        // csv読み込みクラス
        csv_Reader reader;

        reader        = Game.Instance.reader;
        enemy_manager = Enemy_Manager.Instance;
        var enemy_status = reader.Load_csv("csv/Actor/Enemy/Enemy_csv", Define_Value.UNNECESSARY_COLUMN);

        for (int enemy_type = 0; enemy_type < Define_Value.ENEMY_NUMBER; ++enemy_type)
        {
            var enemy = new Enemy_Status {
                ID               = int.Parse(enemy_status[enemy_type][0]),  // 番号
                name             = enemy_status[enemy_type][1],             // 名前
                class_type       = int.Parse(enemy_status[enemy_type][2]),  // クラス
                level            = int.Parse(enemy_status[enemy_type][3]),  // レベル
                hit_point        = int.Parse(enemy_status[enemy_type][4]),  // 体力
                max_hitpoint     = int.Parse(enemy_status[enemy_type][5]),  // 最大体力
                attack           = int.Parse(enemy_status[enemy_type][6]),  // 攻撃力
                defence          = int.Parse(enemy_status[enemy_type][7]),  // 防御力
                activity         = int.Parse(enemy_status[enemy_type][8]),  // 行動力
                critical         = int.Parse(enemy_status[enemy_type][9]),  // クリティカル
                experience_point = int.Parse(enemy_status[enemy_type][10]), // 経験値
                skill            = int.Parse(enemy_status[enemy_type][11]), // スキル(種類)
                AI_pattern       = int.Parse(enemy_status[enemy_type][12]), // AI
                first_floor      = int.Parse(enemy_status[enemy_type][13]), // 出開始階層
                last_floor       = int.Parse(enemy_status[enemy_type][14]), // 出現終了階層
                turn_count       = int.Parse(enemy_status[enemy_type][15])  // 経過ターンをカウント
            };

            enemy_manager.enemy_type.Add(enemy);
        }
    }
コード例 #8
0
    private void HandleRotationTowardsTarget(Enemy_Manager enemyManager)
    {
        //rotate manually
        if (enemyManager.isPerformingAction)
        {
            Vector3 direction = enemyManager.currentTarget.transform.position - transform.position;
            direction.y = 0;
            direction.Normalize();

            if (direction == Vector3.zero)
            {
                direction = transform.forward;
            }

            Quaternion targetRotation = Quaternion.LookRotation(direction);
            enemyManager.transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, enemyManager.rotationSpeed / Time.deltaTime);
        }
        //rotate w/ pathfinding
        else
        {
            Vector3 relativeDirection = transform.InverseTransformDirection(enemyManager.navMeshAgent.desiredVelocity);
            Vector3 targetVelocity    = enemyManager.enemyRigidBody.velocity;

            enemyManager.navMeshAgent.enabled = true;
            enemyManager.navMeshAgent.SetDestination(enemyManager.currentTarget.transform.position);
            enemyManager.enemyRigidBody.velocity = targetVelocity;
            enemyManager.transform.rotation      = Quaternion.Slerp(enemyManager.transform.rotation, enemyManager.navMeshAgent.transform.rotation, enemyManager.rotationSpeed / Time.deltaTime);
        }
    }
コード例 #9
0
 public static void AddEnemy(Enemy_Manager _Enemy)
 {
     if (_Enemys == null)
     {
         _Enemys = new List <Enemy_Manager>();
     }
     _Enemys.Add(_Enemy);
 }
コード例 #10
0
 /// <summary>
 /// 初期化
 /// </summary>
 public void Initialize(GameObject enemy_object, int enemy_number)
 {
     enemy_manager = Enemy_Manager.Instance;
     Set_Enemy_Object(enemy_object);
     Set_Enemy_Number(enemy_number);
     now_room_number = enemy_object.GetComponent <Enemy_Controller>().enemy_status.Now_Room;
     division_list   = Dungeon_Manager.Instance.dungeon_generator.division_list;
 }
コード例 #11
0
 public void Initialize()
 {
     game_manager       = GameManager.Instance;
     enemy_manager      = Enemy_Manager.Instance;
     player             = Player_Manager.Instance.player_script;
     player_status      = Player_Manager.Instance.player_status;
     enemy_status       = new Enemy_Status();
     map_layer          = Dungeon_Manager.Instance.map_layer_2D;
     damage_calculation = Game.Instance.damage_calculation;
 }
コード例 #12
0
    void Start()
    {
        room_list = new List <List <Vector2Int> >();

        enemy_manager = Enemy_Manager.Instance;
        floor         = new ReactiveProperty <int>(Define_Value.INITIAL_FLOOR);
        max_floor     = new ReactiveProperty <int>();
        tile_state    = new ReactiveProperty <eTile_State>(eTile_State.Grass);
        wall_state    = new ReactiveProperty <eWall_State>(eWall_State.Tree);
    }
コード例 #13
0
    public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager)
    {
        Vector3 targetDirection    = enemyManager.currentTarget.transform.position - transform.position;
        float   viewableAngle      = Vector3.Angle(targetDirection, transform.forward);
        float   distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, enemyManager.transform.position);

        HandleRotationTowardsTarget(enemyManager);
        //select one of our many attacks
        //if the selected attack is not able to be used because of bad angle or distance, select a new attack
        //if the attack is viable, stop our movement and attack the target
        //set our recovery timer to the attacks recovery time
        //return to the combat stance state

        #region Attacks

        if (enemyManager.isPerformingAction)
        {
            return(combatStanceState);
        }

        if (currentAttack != null)
        {
            //if too close, get new attack

            if (distanceFromTarget < currentAttack.minimumDistanceNeededToAttack)
            {
                return(this);
            }
            //if we are close enough to atack, then let us proceed
            else if (distanceFromTarget < currentAttack.maximumDistanceNeededToAttack)
            {
                //if our enemy is within our attacks viewable angle, we attack
                if (viewableAngle <= currentAttack.maximumAttackAngle &&
                    viewableAngle >= currentAttack.minimumAttackAngle)
                {
                    if (enemyManager.currentRecoveryTime <= 0 && enemyManager.isPerformingAction == false)
                    {
                        enemyAnimatorManager.anim.SetFloat("Vertical", 0, 0.1f, Time.deltaTime);
                        enemyAnimatorManager.anim.SetFloat("Horizontal", 0, 0.1f, Time.deltaTime);
                        enemyAnimatorManager.PlayTargetAnimation(currentAttack.actionAnimation, true);
                        enemyManager.isPerformingAction  = true;
                        enemyManager.currentRecoveryTime = currentAttack.recoveryTime;
                        currentAttack = null;
                        return(combatStanceState);
                    }
                }
            }
        }
        else
        {
            GetNewAttack(enemyManager);
        }

        return(combatStanceState);
    }
コード例 #14
0
    private void GetNewAttack(Enemy_Manager enemyManager)
    {
        Vector3 targetsDirection   = enemyManager.currentTarget.transform.position - transform.position;
        float   viewableAngle      = Vector3.Angle(targetsDirection, transform.forward);
        float   distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, transform.position);
        //Debug.Log("Distance from target currently is: " + distanceFromTarget);

        int maxScore = 0;

        for (int i = 0; i < enemyAttacks.Length; i++)
        {
            EnemyAttackAction enemyAttackAction = enemyAttacks[i];

            if (distanceFromTarget <= enemyAttackAction.maximumDistanceNeededToAttack &&
                distanceFromTarget >= enemyAttackAction.minimumDistanceNeededToAttack)
            {
                //Debug.Log("Enemy in Distance!");
                if (viewableAngle <= enemyAttackAction.maximumAttackAngle &&
                    viewableAngle >= enemyAttackAction.minimumAttackAngle)
                {
                    //Debug.Log("Grabbed Max Score!");
                    maxScore += enemyAttackAction.attackScore;
                }
            }
        }

        int randomValue    = Random.Range(0, maxScore);
        int temporaryScore = 0;

        for (int i = 0; i < enemyAttacks.Length; i++)
        {
            EnemyAttackAction enemyAttackAction = enemyAttacks[i];

            if (distanceFromTarget <= enemyAttackAction.maximumDistanceNeededToAttack &&
                distanceFromTarget >= enemyAttackAction.minimumDistanceNeededToAttack)
            {
                if (viewableAngle <= enemyAttackAction.maximumAttackAngle &&
                    viewableAngle >= enemyAttackAction.minimumAttackAngle)
                {
                    if (currentAttack != null)
                    {
                        return;
                    }

                    temporaryScore += enemyAttackAction.attackScore;

                    if (temporaryScore > randomValue)
                    {
                        currentAttack = enemyAttackAction;
                    }
                }
            }
        }
    }
コード例 #15
0
ファイル: AmbushState.cs プロジェクト: kenttim/MAGD488
    public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager)
    {
        if (isSleeping && enemyManager.isInteracting == false)
        {
            //play sleep anim
            Debug.Log("Is sleeping");
            enemyAnimatorManager.PlayTargetAnimation(sleepAnimation, true);
        }

        #region Handle Target Detection

        Collider[] colliders = Physics.OverlapSphere(enemyManager.transform.position, detectionRadius, detectionLayer);

        for (int i = 0; i < colliders.Length; i++)
        {
            CharacterStats characterStats = colliders[i].transform.GetComponent <CharacterStats>();

            if (characterStats != null)
            {
                Vector3 targetsDirection = characterStats.transform.position - enemyManager.transform.position;
                float   viewableAngle    = Vector3.Angle(targetsDirection, enemyManager.transform.forward);

                if (viewableAngle > enemyManager.minimumDetectionAngle &&
                    viewableAngle < enemyManager.maximumDetectionAngle)
                {
                    enemyManager.currentTarget = characterStats;
                    isSleeping = false;

                    //play wake animation
                    Debug.Log("Is awake!");
                    enemyAnimatorManager.PlayTargetAnimation(wakeAnimation, true);
                }
            }
        }

        #endregion

        #region Handle State Change

        if (enemyManager.currentTarget != null)
        {
            return(pursueTargetState);
        }
        else
        {
            return(this);
        }
        #endregion
    }
コード例 #16
0
    public void Start()
    {
        if (hasStarted)
        {
            return;
        }
        LevelManager  = Managers[0].GetComponent <Level_Manager>();
        PlayerManager = Managers[1].GetComponent <Player_Manager>();
        EnemyManager  = Managers[2].GetComponent <Enemy_Manager>();

        FetchName();

        LevelManager.Initialize();
        EnemyManager.Initialize();
        PlayerManager.Initialize();

        PrepareNextLvl();
    }
コード例 #17
0
    /// <summary>
    /// スポーンされたエネミーに登録しておいた種類別のステータスをセットする
    /// </summary>
    /// <param name="enemy_object">生成されたエネミー</param>
    /// <param name="type">敵の種類</param>
    public void Set_Parameter(GameObject enemy_object, int type)
    {
        enemy_manager = Enemy_Manager.Instance;
        Enemy_Status enemy_status = enemy_object.GetComponent <Enemy_Controller>().enemy_status;

        enemy_status.ID               = enemy_manager.enemy_type[type].ID;               // ID
        enemy_status.name             = enemy_manager.enemy_type[type].name;             // 名前
        enemy_status.class_type       = enemy_manager.enemy_type[type].class_type;       // クラス
        enemy_status.level            = enemy_manager.enemy_type[type].level;            // レベル
        enemy_status.hit_point        = enemy_manager.enemy_type[type].hit_point;        // 体力
        enemy_status.max_hitpoint     = enemy_manager.enemy_type[type].max_hitpoint;     // 最大体力
        enemy_status.attack           = enemy_manager.enemy_type[type].attack;           // 攻撃力
        enemy_status.defence          = enemy_manager.enemy_type[type].defence;          // 防御力
        enemy_status.activity         = enemy_manager.enemy_type[type].activity;         // 行動力
        enemy_status.critical         = enemy_manager.enemy_type[type].critical;         // クリティカル発生率
        enemy_status.experience_point = enemy_manager.enemy_type[type].experience_point; // 経験値
        enemy_status.skill            = enemy_manager.enemy_type[type].skill;            // スキル
        enemy_status.AI_pattern       = enemy_manager.enemy_type[type].AI_pattern;       // 行動パターン
        enemy_status.first_floor      = enemy_manager.enemy_type[type].first_floor;      // 出現開始階層
        enemy_status.last_floor       = enemy_manager.enemy_type[type].last_floor;       // 出現終了階層
        enemy_status.turn_count       = enemy_manager.enemy_type[type].turn_count;       // 経過ターン
    }
コード例 #18
0
    public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager)
    {
        #region Handle Enemy Target Detection
        Collider[] colliders = Physics.OverlapSphere(transform.position, enemyManager.detectionRadius, detectionLayer);

        for (int i = 0; i < colliders.Length; i++)
        {
            CharacterStats characterStats = colliders[i].transform.GetComponent <CharacterStats>();

            if (characterStats != null)
            {
                //check for team id

                Vector3 targetDirection = characterStats.transform.position - transform.position;
                float   viewableAngle   = Vector3.Angle(targetDirection, transform.forward);

                if (viewableAngle > enemyManager.minimumDetectionAngle && viewableAngle < enemyManager.maximumDetectionAngle)
                {
                    enemyManager.currentTarget = characterStats;
                }
            }
        }
        #endregion

        #region Handle Switching To Next State
        if (enemyManager.currentTarget != null)
        {
            return(pursueTargetState);
        }
        else
        {
            return(this);
        }

        #endregion
    }
コード例 #19
0
    public override bool Rand(Enemy_Manager _this)
    {
        base.Rand(_this);
        if (Unit.Now_Action_Point < 3 || Action)
        {
            return(false);
        }

        Unit_Manager CloserPlayer = _this.GetMeetPlayer()[_this.CloserPlayer()];

        if (Mathf.Abs(CloserPlayer.x - _this.x) + Mathf.Abs(CloserPlayer.y - _this.y) <= Weapon.Range)
        {
            Tile _Tile = CloserPlayer.T;

            for (int x = _Tile.X - 1; x <= _Tile.X + 1; x++)
            {
                for (int y = _Tile.Y - 1; y <= _Tile.Y + 1; y++)
                {
                    Weapon.HeadShot_Bonus = 0;
                    if (x < 0 || x >= _Tile._Tile.X || y < 0 || y >= _Tile._Tile.Y)
                    {
                        continue;
                    }
                    if (x != _Tile.X && y != _Tile.Y)
                    {
                        continue;
                    }

                    _Tile._Tile.MY_Tile[x][y].DownGrade();

                    if (_Tile._Tile.MY_Tile[x][y].transform.childCount > 0)
                    {
                        if (_Tile._Tile.MY_Tile[x][y].transform.Find("Enemy(Clone)") != null)
                        {
                            Unit_Manager _Unit = _Tile._Tile.MY_Tile[x][y].transform.Find("Enemy(Clone)").GetComponent <Unit_Manager>();
                            if (_Unit != null)
                            {
                                if (x == _Tile.X && y == _Tile.Y)
                                {
                                    Weapon.HeadShot_Bonus = 100;
                                }

                                _Unit.Hit(Weapon);
                            }
                        }
                        else if (_Tile._Tile.MY_Tile[x][y].transform.Find("Player(Clone)") != null)
                        {
                            Unit_Manager _Unit = _Tile._Tile.MY_Tile[x][y].transform.Find("Player(Clone)").GetComponent <Unit_Manager>();
                            if (_Unit != null)
                            {
                                if (x == _Tile.X && y == _Tile.Y)
                                {
                                    Weapon.HeadShot_Bonus = 100;
                                }

                                _Unit.Hit(Weapon);
                            }
                        }
                    }
                }
            }

            _this.Now_Action_Point -= 3;

            Btn1   = false;
            Action = false;
            count--;

            Cursor_Manager.m_Cursor_Manager.SetCursor(UI_MANAGER.m_UI_MANAGER.Cursors[1]);

            if (count <= 0)
            {
                _this.Items.Remove(this);
                Destroy(gameObject);
            }
        }
        return(true);
    }
コード例 #20
0
 public virtual bool Rand(Enemy_Manager _this)
 {
     return(true);
 }
コード例 #21
0
 /// <summary>
 /// 変数に情報を入れる処理
 /// </summary>
 void Start()
 {
     EnemyShipManager_ = transform.root.GetComponent <EnemyShipManager>();
     Enemy_Points_     = transform.root.GetComponent <Enemy_Points>();
     Enemy_Manager_    = transform.root.GetComponent <Enemy_Manager>();
 }
コード例 #22
0
 private void Awake()
 {
     enemyManager         = GetComponent <Enemy_Manager>();
     enemyAnimatorManager = GetComponentInChildren <EnemyAnimatorManager>();
 }
コード例 #23
0
 public abstract State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager);
コード例 #24
0
 void Start()
 {
     room_entrance = new List <Vector2Int>();
     enemy_manager = Enemy_Manager.Instance;
     player        = Player_Manager.Instance.player_script;
 }
コード例 #25
0
 private void Awake()
 {
     anim         = GetComponent <Animator>();
     enemyManager = GetComponentInParent <Enemy_Manager>();
 }
コード例 #26
0
 void Start()
 {
     Enemyscript = RU3.GetComponent <Enemy_Manager>();
 }