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 } } }
public void sentry() { if (isPlayerInRange(range)) { currState = EnemyState2.Follow; speed = 0; move = moveTime; } }
// 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; } }
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); }
// 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; } }
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; } }