예제 #1
0
    void Update()
    {
        if (enemyCurrentState != EnemyState2.DEATH)
        {
            enemyCurrentState = setEnemyState(enemyCurrentState, enemyLastState, enemyToPlayerDistance);

            if (finishedMovement)
            {
                getCurrentState(enemyCurrentState);
            }
            else
            {
                if (!anim.IsInTransition(0) && anim.GetCurrentAnimatorStateInfo(0).IsName("Idle"))
                {
                    finishedMovement = true;
                }
                else if (!anim.IsInTransition(0) && anim.GetCurrentAnimatorStateInfo(0).IsTag("Atk1") ||
                         anim.GetCurrentAnimatorStateInfo(0).IsTag("Atk2"))
                {
                    anim.SetInteger("Atk", 0);
                }
            }
        }
        else
        {
            anim.SetBool("", true);
            charController.enabled = false;
            navAgent.enabled       = false;
            if (!anim.IsInTransition(0) && anim.GetCurrentAnimatorStateInfo(0).IsName("Death") &&
                anim.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.95f)
            {
                Destroy(gameObject, 2f); //destroi depois de 1 segundo
            }
        }
    }
예제 #2
0
 public void sentry()
 {
     if (isPlayerInRange(range))
     {
         currState = EnemyState2.Follow;
         speed     = 0;
         move      = moveTime;
     }
 }
예제 #3
0
    // Update is called once per frame
    void Update()
    {
        if (player1 == null && player2 == null)
        {
            return;
        }
        else if (player1 == null)
        {
            player = player2;
        }
        t2 = t2 - Time.deltaTime;
        float distance = Vector3.Distance(player.position, transform.position);

        //判断状态
        switch (CurrentState)
        {
        case EnemyState2.idle:
            if (distance >= 15)
            {
                CurrentState = EnemyState2.movement;
            }
            //导航停止
            agent.isStopped = true;
            break;

        case EnemyState2.movement:
            //追踪状态
            if (distance < 15)
            {
                CurrentState = EnemyState2.attack;
            }
            //导航开启
            agent.isStopped = false;
            agent.SetDestination(player.position);
            break;

        case EnemyState2.attack:
        {
            agent.isStopped = true;
            if (distance < 15 && t2 <= 0)
            {
                AudioSource.PlayClipAtPoint(shootAudio, transform.position);
                GameObject go = GameObject.Instantiate(shellPrefab, firePosition.position, firePosition.rotation) as GameObject;
                go.GetComponent <Rigidbody>().velocity = go.transform.forward * shellSpeed;
                t2 = t1;
            }
            if (distance >= 15)
            {
                CurrentState = EnemyState2.idle;
            }
        }
        break;
        }
    }
예제 #4
0
    EnemyState2 setEnemyState(EnemyState2 currentState, EnemyState2 lastState, float enemyToPlayerDistance)
    {
        enemyToPlayerDistance = Vector3.Distance(transform.position, playerTarget.position);

        float initialDistance = Vector3.Distance(initialPosition, transform.position);

        if (initialDistance > followDistance)
        {
            lastState    = currentState;
            currentState = EnemyState2.GOBACK;
        }
        else if (enemyToPlayerDistance <= attackDistance)
        {
            lastState    = currentState;
            currentState = EnemyState2.ATTACK;
        }
        else if ((enemyToPlayerDistance >= alertAttackDistance && lastState == EnemyState2.PAUSE) ||
                 lastState == EnemyState2.ATTACK)
        {
            lastState    = currentState;
            currentState = EnemyState2.PAUSE;
        }
        else if (enemyToPlayerDistance <= alertAttackDistance && enemyToPlayerDistance > attackDistance)
        {
            if (currentState != EnemyState2.GOBACK || lastState == EnemyState2.WALK)
            {
                lastState    = currentState;
                currentState = EnemyState2.PAUSE;
            }
        }
        else if (enemyToPlayerDistance > alertAttackDistance && lastState != EnemyState2.GOBACK &&
                 lastState != EnemyState2.PAUSE)
        {
            lastState    = currentState;
            currentState = EnemyState2.WALK;
        }

        return(currentState);
    }
예제 #5
0
    // Update is called once per frame
    void Update()
    {
        Debug.Log(currState);

        if (currState == EnemyState2.Return && isHome())
        {
            currState = EnemyState2.Sentry;
            //speed = 0;
        }
        switch (currState)
        {
        case (EnemyState2.Sentry):
            sentry();
            break;

        case (EnemyState2.Follow):
            if (!(capSpeed == null))
            {
                speed = capSpeed;
            }
            else
            {
                speed = 6;
            }
            follow();
            move--;
            if (move <= 0)
            {
                currState = EnemyState2.Return;
            }
            break;

        case (EnemyState2.Return):
            returnHome();
            break;
        }
    }
예제 #6
0
    void getCurrentState(EnemyState2 currentState)
    {
        if (currentState == EnemyState2.RUN || currentState == EnemyState2.PAUSE)
        {
            if (currentState != EnemyState2.ATTACK)
            {
                Vector3 targetPosition = new Vector3(playerTarget.position.x, transform.position.y, playerTarget.position.z);

                anim.SetBool("Walk", false);
                anim.SetBool("Run", true);

                navAgent.SetDestination(targetPosition);
            }
            else if (currentState == EnemyState2.ATTACK)
            {
                anim.SetBool("Run", false);
                whereToMove.Set(0, 0, 0);
                navAgent.SetDestination(transform.position);

                transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(playerTarget.position - transform.position), 5f * Time.deltaTime);

                if (currentAttackTime >= waitAttackTime)
                {
                    int attackRange = Random.Range(1, 3); //não inclui o 3 = 1 ou 2

                    anim.SetInteger("Atk", attackRange);

                    finishedAnimation = false;
                    currentAttackTime = 0;
                }
                else
                {
                    anim.SetInteger("Atk", 0);
                    currentAttackTime += Time.deltaTime;
                }
            }
            else if (currentState == EnemyState2.GOBACK)
            {
                anim.SetBool("RUN", true);
                Vector3 targetPosition = new Vector3(initialPosition.x, transform.position.y, initialPosition.z);
                navAgent.SetDestination(targetPosition);
                if (Vector3.Distance(targetPosition, initialPosition) <= 3.5f)
                {
                    enemyLastState = currentState;
                    currentState   = EnemyState2.WALK;
                }
            }
            else if (currentState == EnemyState2.WALK)
            {
                anim.SetBool("Run", false);
                anim.SetBool("Walk", true);

                if (Vector3.Distance(transform.position, whereToNavigate) <= 2f)
                {
                    whereToNavigate.x = Random.Range(initialPosition.x - 5f, initialPosition.x + 5f);
                    whereToNavigate.z = Random.Range(initialPosition.z - 5f, initialPosition.z + 5f);
                }
                else
                {
                    navAgent.SetDestination(whereToNavigate);
                }
            }
        }
        else
        {
            anim.SetBool("Run", false);
            anim.SetBool("Walk", false);
            whereToMove.Set(0, 0, 0);
            navAgent.isStopped = true;
        }
    }