/// <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;
    }
示例#2
0
    /// <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;
    }
示例#3
0
    /// <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;
    }