/// <summary> /// S'occupe des mouvements et de l'attaque de l'ennemi /// </summary> /// <returns></returns> IEnumerator Mouvement() //Changer mouvement pour les autres types d'ennemis, genre le mettre dans un autre component { //Choisis l'ennemi à soigner (Le plus faible) List <Transform> listeEnnemy = GameManager.singleton.listeEnnemis; Transform ennemyFaible = transform; int vieEnnemyFaible = 1000; foreach (var ennemy in listeEnnemy) { if (ennemy.GetComponent <ennemyBasic>().getVie() < vieEnnemyFaible && ennemy.GetComponent <ennemyBasic>().isDead == false) { vieEnnemyFaible = ennemy.GetComponent <ennemyBasic>().getVie(); ennemyFaible = ennemy; } } //Animation animationEnnemy.SetBool("Running", true); //Me déplacer vers la destination scriptBase.isMoving = true; navMeshAgent.isStopped = false; navMeshAgent.SetDestination(ennemyFaible.position); //Déplace le personnage et lui inflige des dégats s'il est empoisonés. Ne s'arrête pas tant qu'il n'est pas à destination //ou que le timer arrive à 0. while (navMeshAgent.pathPending || (navMeshAgent.remainingDistance > 10f && GameManager.singleton.getTimerEnnemy() > 0.2f)) { if (scriptBase.isPoisoned > 0) { scriptBase.timerPoison += Time.deltaTime; if (scriptBase.timerPoison > 0.5) { scriptBase.dealDamage(scriptBase.puissancePoison); if (scriptBase.isDead) { yield break; } scriptBase.timerPoison = 0; } } yield return(null); } //S'il est assez proche, il va soigner l'ennemi float timerAttack = 0f; if (Vector3.Distance(ennemyFaible.position, transform.position) <= 15) { navMeshAgent.isStopped = true; navMeshAgent.ResetPath(); transform.LookAt(ennemyFaible.position); animationEnnemy.SetBool("Running", false); GameManager.singleton.StartAttack(0); //Il s'agit d'un ennemi, il ne consomme pas de temps. Ne fait que s'assurer que le timer ne cause pas //de bug while (timerAttack < 1f) { timerAttack += Time.deltaTime; yield return(null); } //Animation audioSource.PlayOneShot(audioAttack); animationEnnemy.SetTrigger("Heal"); while (timerAttack < 3f) { timerAttack += Time.deltaTime; yield return(null); } //Particules de heal GameObject particleHeal = Instantiate(particleHealPrefab, ennemyFaible.transform.position, Quaternion.Euler(-90, 0, -180)); ennemyFaible.GetComponent <ennemyBasic>().heal(10); yield return(new WaitForSeconds(1.3f)); Destroy(particleHeal); GameManager.singleton.FinishAttack(); } //Arrête le navmesh, même s'il n'a pas attaqué navMeshAgent.isStopped = true; navMeshAgent.ResetPath(); animationEnnemy.SetBool("Running", false); //Changer le tour GameManager.singleton.changeTurn(); scriptBase.isMoving = false; }
/// <summary> /// S'occupe des mouvements et de l'attaque de l'ennemi /// </summary> /// <returns></returns> IEnumerator Mouvement() { //Animation animationEnnemy.SetBool("Running", true); //Se déplacer vers la destination scriptBase.isMoving = true; navMeshAgent.isStopped = false; //Détermine le joueur le plus proche et calcule une trajectoire pour fuir. Transform ennemyChoisi = scriptBase.getJoueurProche(); Vector3 toPlayer = ennemyChoisi.position - transform.position; Vector3 targetPosition = toPlayer.normalized * -10f; navMeshAgent.SetDestination(transform.position + targetPosition); //Déplace le personnage et lui inflige des dégats s'il est empoisonés. Ne s'arrête pas tant qu'il n'est pas à destination //ou que le timer arrive à 0. while ((navMeshAgent.pathPending || (Vector3.Distance(ennemyChoisi.position, transform.position) < 15f && navMeshAgent.remainingDistance > 1f)) && GameManager.singleton.getTimerEnnemy() > 0.2f) { if (scriptBase.isPoisoned > 0) { scriptBase.timerPoison += Time.deltaTime; if (scriptBase.timerPoison > 0.5) { scriptBase.dealDamage(scriptBase.puissancePoison); if (scriptBase.isDead) { yield break; } scriptBase.timerPoison = 0; } } yield return(null); } //S'il est assez proche, il va attaquer le joueur float timerAttack = 0f; if (Vector3.Distance(ennemyChoisi.position, transform.position) < 20f) { //Réinitialise le navMeshAgent navMeshAgent.SetDestination(transform.position); navMeshAgent.isStopped = true; //Regarde vers la cible transform.LookAt(ennemyChoisi.position); fireballPosition.LookAt(ennemyChoisi.position + transform.up * 1.2f); //Animation animationEnnemy.SetBool("Running", false); GameManager.singleton.StartAttack(0); //Il s'agit d'un ennemi, il ne consomme pas de temps. Ne fait que s'assurer que le timer ne cause pas //de bug while (timerAttack < 1f) { timerAttack += Time.deltaTime; yield return(null); } //Son de l'attaque audioSource.PlayOneShot(audioAttack); //Lance la boule de feu. Instantiate(fireball, fireballPosition.position, fireballPosition.rotation); //Attend que la boule de feu finisse while (timerAttack < 5f) { timerAttack += Time.deltaTime; yield return(null); } //Dépause le timer GameManager.singleton.FinishAttack(); } //Arrête le navmesh, même s'il n'a pas attaqué navMeshAgent.isStopped = true; navMeshAgent.ResetPath(); animationEnnemy.SetBool("Running", false); //Change le tour GameManager.singleton.changeTurn(); scriptBase.isMoving = false; }
/// <summary> /// S'occupe des mouvements et de l'attaque de l'ennemi /// </summary> /// <returns></returns> IEnumerator Mouvement() //Changer mouvement pour les autres types d'ennemis, genre le mettre dans un autre component { //Animation animationEnnemy.SetBool("Running", true); //Me déplacer vers le personnage le plus proche scriptBase.isMoving = true; navMeshAgent.isStopped = false; Transform ennemyChoisi = scriptBase.getJoueurProche(); navMeshAgent.SetDestination(ennemyChoisi.position); //Déplace le personnage et lui inflige des dégats s'il est empoisonés. Ne s'arrête pas tant qu'il n'est pas à destination //ou que le timer arrive à 0. while (navMeshAgent.pathPending || (navMeshAgent.remainingDistance > 3f && GameManager.singleton.getTimerEnnemy() > 0.2f)) { if (scriptBase.isPoisoned > 0) { scriptBase.timerPoison += Time.deltaTime; if (scriptBase.timerPoison > 0.5) { scriptBase.dealDamage(scriptBase.puissancePoison); if (scriptBase.isDead) { yield break; } scriptBase.timerPoison = 0; } } yield return(null); } //S'il est assez proche, il va attaquer le joueur float timerAttack = 0f; if (Vector3.Distance(ennemyChoisi.position, transform.position) <= 3) { navMeshAgent.isStopped = true; navMeshAgent.ResetPath(); transform.LookAt(ennemyChoisi.position); animationEnnemy.SetBool("Running", false); GameManager.singleton.StartAttack(0); //Il s'agit d'un ennemi, il ne consomme pas de temps. Ne fait que s'assurer que le timer ne cause pas //de bug while (timerAttack < 1f) { timerAttack += Time.deltaTime; yield return(null); } //Animation audioSource.PlayOneShot(audioAttack); animationEnnemy.SetTrigger("Attack"); ennemyChoisi.GetComponent <Animator>().SetTrigger("Hurt"); while (timerAttack < 3f) { timerAttack += Time.deltaTime; yield return(null); } ennemyChoisi.GetComponent <JoueurMain>().damage(10); GameManager.singleton.FinishAttack(); } //Arrête le navmesh, même s'il n'a pas attaqué navMeshAgent.isStopped = true; navMeshAgent.ResetPath(); animationEnnemy.SetBool("Running", false); //Changer le tour GameManager.singleton.changeTurn(); scriptBase.isMoving = false; }