Exemple #1
0
        public ZombieAI(Creature owner) : base(owner)
        {
            rnd = Randomizer.GetRandomizer();

            state           = ZombieStates.Wander;
            SensoryDistance = 5;
        }
Exemple #2
0
    private void ChangeState(ZombieStates newState)
    {
        activeState = newState;
        switch (activeState)
        {
        case ZombieStates.Stand:
            zombieMovement.SetPatrol(true);
            break;

        case ZombieStates.Move:
            path.enabled = true;
            zombieMovement.SetAngry(false);
            zombieMovement.SetPatrol(false);
            StopAllCoroutines();
            break;

        case ZombieStates.Attack:
            zombieMovement.SetAngry(true);
            StartCoroutine(SetDamage(damage, attackRate));

            break;

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
        private void Awake()
        {
            _movement      = GetComponentInChildren <Movement>();
            _playerTracker = GetComponentInChildren <PlayerTracker>();

            _playerTracker.PlayerEntered += () => { _currentZombieState = ZombieStates.Chasing; };
            _playerTracker.PlayerLeft    += () => { _currentZombieState = ZombieStates.Idle; };
        }
Exemple #4
0
 public void Alert(GameObject alerter)
 {
     targetEnemy         = alerter;
     state               = ZombieController.ZombieStates.Pursuit;
     wanderingToPosition = false;
     anim.SetInteger("ZombieState", (int)ZombieStates.Pursuit);
     agent.speed = stats.attackMovementSpeed;
 }
Exemple #5
0
        private void Awake()
        {
            _movement      = GetComponentInChildren <Movement>();
            _jumping       = GetComponentInChildren <Jumping>();
            _playerTracker = GetComponentInChildren <PlayerTracker>();

            _playerTracker.PlayerEntered += () => { _currentZombieState = Vector3.Distance(transform.position, _playerTracker.Position) <= _jumpThreshold ? ZombieStates.Jumping : ZombieStates.Approaching; };
            _playerTracker.PlayerLeft    += () => { _currentZombieState = ZombieStates.Idle; };
        }
Exemple #6
0
    private void Wander()
    {
        //continually search for enemy to attack
        Collider[] hitColliders = Physics.OverlapSphere(transform.position, alertRadius);

        int highestAggroPriority = -1;

        foreach (Collider hit in hitColliders)
        {
            IFFTag otherAgent = hit.GetComponentInParent <IFFTag>();
            if (otherAgent == null)
            {
                continue;
            }
            if (otherAgent.IFF_channel != iff_channel)
            {
                if (otherAgent.aggroPriority >= highestAggroPriority)
                {
                    targetEnemy = otherAgent.gameObject;
                }
            }
        }

        //if previous goal has been achieved (enemy death or wander point reached) then make a new wander point
        if (targetEnemy == null)
        {
            if (wanderingToPosition)
            {
                //check if position has been reached
                wanderPosition.y = transform.position.y;
                if (Vector3.Distance(wanderPosition, transform.position) <= wanderReachedRadius)
                {
                    wanderingToPosition = false;
                }
            }

            //select new wander position
            if (!wanderingToPosition)
            {
                wanderPosition = RandomNavmeshLocation(wanderRadius);
                Debug.DrawRay(wanderPosition, Vector3.up * 10f, Color.blue, 10f);
                wanderingToPosition = true;
                agent.SetDestination(wanderPosition);
                agent.speed = stats.wanderMovementSpeed;
            }
        }
        else
        {
            wanderingToPosition = false;
            state = ZombieStates.Pursuit;
            anim.SetInteger("ZombieState", (int)ZombieStates.Pursuit);
            agent.speed = stats.attackMovementSpeed;
        }
    }
    public void DeathState()
    {
        CurrentState = ZombieStates.Dead;        //For zombie dead state

        GetComponent <BoxCollider> ().enabled = false;
        box.size = new Vector3(0, 0, 0);                                                                 //for Zombie collider size
        Destroy(gameObject, 1f);                                                                         //for destroy Zombie
        GameObject obj = Instantiate(FireEffect, transform.position, Quaternion.identity) as GameObject; //for Zombie dead Effect instantiate

        Destroy(obj, 1f);                                                                                //destroy Zombie dead effect
        Ace_IngameUiControl.Static.inGameScoreCount++;                                                   //for Counting score
        SoundController.Static.playSoundFromName("Dead2");                                               //for Zombie dead sound
    }
Exemple #8
0
    void MakeDecisions()
    {
        float             distanceToPlayer = Vector3.Distance(transform.position, _player.position);
        AnimatorStateInfo stateInfo        = _animator.GetCurrentAnimatorStateInfo(0);

        if (_state == ZombieStates.idle)
        {
            //si lastiman al zombie o el player entra en rango de deteccion
            if (_healthScript._currentHealth < _healthScript._maxHealth ||
                distanceToPlayer <= _detectRange)
            {
                //comenzamos a perseguir al player
                _state = ZombieStates.pursue;
                _animator.SetTrigger("move");
            }
        }

        else if (_state == ZombieStates.pursue && distanceToPlayer <= _attackRange &&
                 !stateInfo.IsName("Base Layer.zombieAttack"))
        {
            _state = ZombieStates.attack;
            _rigidbody.velocity    = Vector2.zero;
            _rigidbody.isKinematic = true;
            _animator.SetTrigger("attack");
        }

        else if (_state == ZombieStates.attack)
        {
            if (stateInfo.IsName("Base Layer.zombieAttack"))
            {
                if (stateInfo.normalizedTime >= 0.97f)
                {
                    //si despues de atacar el player ya no esta en rango...
                    //pasas a perseguirlo
                    if (distanceToPlayer > _attackRange)
                    {
                        _state = ZombieStates.pursue;
                        _rigidbody.isKinematic = false;
                        _animator.SetTrigger("move");
                    }
                }
            }
        }
    }
Exemple #9
0
    void ChangeState(ZombieStates newState)
    {
        activeState = newState;
        switch (activeState)
        {
        case ZombieStates.STAND:
            movement.enabled = false;
            //movement.StopMovement();
            break;

        case ZombieStates.MOVE:
            movement.enabled = true;
            break;

        case ZombieStates.ATTACK:
            movement.enabled = false;
            // movement.StopMovement();
            break;
        }
    }
Exemple #10
0
    void ChangeState(ZombieStates newState)
    {
        activeState = newState;

        switch (activeState)
        {
        case ZombieStates.Stand:     // если активный шаг == Стэнд, то отключить движение зомби
            _zombieMovement.enabled = false;
            _zombieMovement.StopMovement();
            break;

        case ZombieStates.Move:     // если активный шаг == Мув, то включить движение зомби
            _zombieMovement.enabled = true;
            break;

        case ZombieStates.Attack:     // если активный шаг == Аттак, то отключить движение зомби
            _zombieMovement.enabled = false;
            _zombieMovement.StopMovement();
            break;
        }
    }
    void ChangeState(ZombieStates newState)
    {
        activeState = newState;
        switch (activeState)
        {
        case ZombieStates.STAND:

            // выключаем выполнение скрипта мувмента
            movement.enabled = false;
            //movement.StopMovement();
            transform.up = startGuardRotation;


            break;

        case ZombieStates.MOVE:

            movement.enabled  = true;
            target.target     = player.transform;
            movement.maxSpeed = followSpeed;

            break;

        case ZombieStates.ATTACK:

            movement.enabled = false;
            //movement.StopMovement();

            break;

        case ZombieStates.RETURN:

            movement.enabled  = true;
            target.target     = previousPoint.transform;
            movement.maxSpeed = returnSpeed;
            Rotate(previousPoint);



            break;

        case ZombieStates.PATROL:

            movement.enabled  = true;
            nextPoint         = patrolPoints[currentPatrolPoint];
            target.target     = nextPoint.transform;
            movement.maxSpeed = patrolSpeed;
            Rotate(nextPoint);

            break;

        case ZombieStates.DEATH:

            movement.enabled = false;
            //movement.StopMovement();
            //movement.StopMovement();

            player.onDeath -= onPlayerDeath;

            anim.SetTrigger("Death");
            if (finalBoss)
            {
                ActivateRescueZone(true);
            }
            Destroy(gameObject, corpsTime);
            DropItem();
            break;


        default:
            break;
        }
    }
Exemple #12
0
        internal override void Update()
        {
            switch (state)
            {
            case ZombieStates.Wander:
            {
                bool isCloseToEnemy = false;
                foreach (Creature c in owner.manager.creatures)
                {
                    if (c != owner && c.Faction != owner.Faction)          // do not detect yourself or friends
                    {
                        if (DistanceTo(c.X_pos, c.Y_pos) < SensoryDistance)
                        {
                            isCloseToEnemy = true;
                        }
                    }
                }
                if (isCloseToEnemy)
                {
                    closest_enemy   = FindClosestEnemyInSensoryRange();
                    Creature_Target = closest_enemy;
                    state           = ZombieStates.Attack;
                }



                if (closest_enemy != null)
                {
                    Creature_Target = closest_enemy; state = ZombieStates.Attack;
                }


                if (rnd.Next(100) > 50)
                {
                    Position_Target_X = rnd.Next(0, owner.manager.worldManager.WorldWidth);
                    Position_Target_Y = rnd.Next(0, owner.manager.worldManager.WorldHeight);

                    Send(new CPMessage()
                        {
                            type = CPMessageType.TARGET, x_position = Position_Target_X, y_position = Position_Target_Y
                        });
                }

                break;
            }


            case ZombieStates.Attack:
            {
                if (Creature_Target != null)
                {
                    if (!Creature_Target.body.IsAlive)
                    {
                        Creature_Target = null; state = ZombieStates.Wander; break;
                    }                                                                                                            // job done!

                    if (DistanceTo(Creature_Target.X_pos, Creature_Target.Y_pos) < 2)
                    {
                        Send(new CPMessage()
                            {
                                type       = CPMessageType.MELEE_ATTACK,
                                x_position = Creature_Target.X_pos,
                                y_position = Creature_Target.Y_pos
                            });      // TEST CODE
                        break;
                    }
                    else
                    {
                        Send(new CPMessage()
                            {
                                type       = CPMessageType.TARGET,
                                x_position = Creature_Target.X_pos,
                                y_position = Creature_Target.Y_pos
                            });
                    }
                }
                break;
            }
            }
        }