Exemplo n.º 1
0
        void Update()
        {
            if (isDead)
            {
                return;
            }

            if (characterData.Stats.CurrentHealth == 0)
            {
                isDead = true;
                spawner.CurrentEnemyCount--;
                agent.isStopped = true;

                gameObject.SetActive(false);

                Destroy(GetComponent <SphereCollider>());
                Destroy(agent);
                Destroy(gameObject, 3);

                return;
            }

            UnitData playerData = GameObject.FindGameObjectWithTag("Player").GetComponent <UnitData>();


            switch (state)
            {
            case State.IDLE:
            {
                changePositionTimer -= Time.deltaTime;
                if (changePositionTimer <= 0)
                {
                    changePositionTimer = Random.Range(3, 7);
                    agent.isStopped     = false;
                    agent.SetDestination(spawner.NextPosition());
                }

                if (Vector3.SqrMagnitude(playerData.transform.position - transform.position) < _detectionRadius * _detectionRadius)
                {
                    pursuitTimer    = 2.0f;
                    state           = State.PURSUING;
                    agent.isStopped = false;
                }
            }
            break;

            case State.PURSUING:
            {
                float distToPlayer = Vector3.SqrMagnitude(playerData.transform.position - transform.position);
                if (distToPlayer <= _detectionRadius * _detectionRadius)
                {
                    pursuitTimer = 2.0f;

                    if (characterData.CanAttackTarget(playerData))
                    {
                        Debug.Log("Reach");
                        agent.ResetPath();
                        //agent.Stop();
                        agent.velocity = Vector3.zero;

                        characterData.AttackTriggered();
                        characterData.Attack(playerData);
                        state           = State.ATTACKING;
                        agent.isStopped = true;
                        animator.SetTrigger("Attack");
                    }
                }
                else
                {
                    if (pursuitTimer > 0.0f)
                    {
                        pursuitTimer -= Time.deltaTime;

                        if (pursuitTimer <= 0.0f)
                        {
                            agent.SetDestination(startingAnchor);
                            state = State.IDLE;
                            enemyPanel.SetActive(false);
                        }
                    }
                }

                if (pursuitTimer > 0)
                {
                    agent.SetDestination(playerData.transform.position);
                }
            }
            break;

            case State.ATTACKING:
            {
                if (!characterData.CanAttackReach(playerData))
                {
                    state           = State.PURSUING;
                    agent.isStopped = false;
                }
                else
                {
                    if (characterData.CanAttackTarget(playerData) && characterData.TargetIsLive(playerData))
                    {
                        agent.ResetPath();
                        characterData.Attack(playerData);
                        characterData.AttackTriggered();
                        animator.SetTrigger("Attack");
                    }
                }
            }
            break;
            }
        }