Page 1 sur 1

Code pour repérer si animation jouée

Publié : 20 Août 2021 10:40
par alsthorm
Bonjour,

Voilà mon souci :

J'ai utilisé Animator afin d'animer mon perso avec des Boléens et des Triggers.

Tout marche à peu près bien pour ne pas que ça se lance en même temps.

Pour les Triggers, dans mon code ça ressemble à ça :

Code : Tout sélectionner

 if (Input.GetMouseButtonDown(0)
        {
            anim.SetTrigger("Attack 1");
Mon souci est que si je clique 2 fois, l'animation se joue bien jusqu'au bout car j'ai coché l'exit Time mais une fois terminée elle se joue une seconde fois, elle enregistre mon second clic en fait.

Même souci si j'appui deux fois sur une touche ou même si j'appui deux fois sur 2 touches différentes. Par exemple si j'appui sur saut puis attack. Une fois le saut finit il attaque.

De ce fait je voudrai ajouté une condition indiquant "si certaines animations ne sont pas jouées" (pas toute je dois pouvoir les sélectionner car par exemple mon perso doit pouvoir continuer à attaquer quand il marche ou court) mais je ne sais pas quel code utiliser...

Re: Code pour repérer si animation jouée

Publié : 20 Août 2021 11:53
par jmhoubre
Bonjour,

tu devrais trouver ce que tu cherches avec ces deux méthodes :

Re: Code pour repérer si animation jouée

Publié : 20 Août 2021 17:24
par alsthorm
Bonjour,

Merci mais je m'en sors pas ^^

Visiblement ça me permet d'obtenir des stats sur les animations mais je n'arrive pas à trouver le code exact pour que ça marche.

Il me faudrait un code genre :

if (Input.GetMouseButtonDown(0) && !(Tel animation est joué ou tel animation Frame >1)

Mais je ne trouve pas le code exact.

Je précise que j'ai déjà dans mon Void Start : anim = GetComponent<Animator>();

Je vous mets mon code actuel complet (mais je vous préviens ça va piquer les yeux de certains, beaucoup de bidouillage :p ) Mais ça marche à part mon souci bien entendu...

Code : Tout sélectionner

public class PlayerController : MonoBehaviour
{
    public int speed = 5;
    public int speedrun = 10;
    public int speedrawl = -5;
    public int coefRot = 200;
    private Animator anim;
    public Vector3 jumpSpeed;
    BoxCollider playerCollider;
    



    void Start()
    {
        anim = GetComponent<Animator>();
        playerCollider = gameObject.GetComponent<BoxCollider>();
                }

    bool IsGrounded()
    {
        Vector3 dwn = transform.TransformDirection(Vector3.down);

        return (Physics.Raycast(transform.position, dwn, 1));
    }
    


    void Update()
    {

        // Déplacement




        if (Input.GetKey(KeyCode.C) && Input.GetAxis("Vertical") > 0)
        {
            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * speedrawl * Time.deltaTime);

        }
        if (Input.GetKey(KeyCode.LeftControl) && Input.GetAxis("Vertical") > 0 &&! Input.GetKey(KeyCode.C))
        {
            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * speedrun * Time.deltaTime);
        }
        if (!Input.GetKey(KeyCode.LeftControl) && Input.GetAxis("Vertical") > 0 && !Input.GetKey(KeyCode.C))
        {
            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * speed * Time.deltaTime);
        }
        transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * coefRot * Time.deltaTime);

        



        if (Input.GetAxis("Vertical") > 0 && !Input.GetKey(KeyCode.LeftShift) && !Input.GetKey(KeyCode.Space) && IsGrounded())
        {
            anim.SetBool("Walk", true);
            anim.SetBool("Run", false);
             anim.SetBool("Recul", false);
            anim.SetBool("Baissé", false);



        }
       
         //run
        if (Input.GetAxis("Vertical") > 0 && Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetBool("Walk", false);
            anim.SetBool("Run", true);
            anim.SetBool("Recul", false);
            anim.SetBool("Baissé", false);
        }
        if (Input.GetAxis("Vertical") > 0 && Input.GetKey(KeyCode.C))
            {
                anim.SetBool("Walk", false);
                anim.SetBool("Run", false);
                anim.SetBool("Recul", false);
                anim.SetBool("Baissé", true);

            }
        //idle
        if (Input.GetAxis("Vertical") == 0 && !Input.GetKey(KeyCode.Z) && !Input.GetKey(KeyCode.S) && IsGrounded())
        {
            anim.SetBool("Walk", false);
            anim.SetBool("Run", false);
            anim.SetBool("Recul", false);
            anim.SetBool("Baissé", false);


        }
        if (Input.GetAxis("Vertical") < 0)
        {
            anim.SetBool("Recul", true);
            anim.SetBool("Walk", false);
            anim.SetBool("Run", false);
            anim.SetBool("Baissé", false);


        }
        if (Input.GetKeyDown(KeyCode.Space) && IsGrounded() && (Input.GetAxis("Vertical") >= 0) && !Input.GetKey(KeyCode.C))
        {
            Vector3 v = gameObject.GetComponent<Rigidbody>().velocity;
            v.y = jumpSpeed.y;
            gameObject.GetComponent<Rigidbody>().velocity = jumpSpeed;
          anim.SetTrigger("Jump"); 
        }
        if (Input.GetMouseButtonDown(0) && !Input.GetKey(KeyCode.C))
        {
            anim.SetTrigger("Attack 1");
            Debug.Log(" clic gauche souris !");
        }
        if (Input.GetMouseButtonDown(1) && !Input.GetKey(KeyCode.C))
        {
            anim.SetTrigger("Attack 2");
            Debug.Log(" clic droit souris !");
        }
        if (Input.GetMouseButtonDown(2) && !Input.GetKey(KeyCode.C))
        {
            anim.SetTrigger("Attack 3");
            Debug.Log(" clic milieu souris !");
        }
        if (Input.GetKeyDown(KeyCode.F) && !Input.GetKey(KeyCode.C))
        {
            anim.SetTrigger("Block");
        }
                }
    }

Re: Code pour repérer si animation jouée

Publié : 24 Août 2021 01:44
par alsthorm
Pas d'idée?

Franchement j'ai fait toute la notice et que dalle. Je me galère toujours autant...

Re: Code pour repérer si animation jouée

Publié : 24 Août 2021 09:49
par boubouk50
GetCurrentAnimatorStateInfo.IsName ("Nom du clip") te donne le nom du clip en cours. Tu peux ainsi savoir si cette animation est entrain d'être jouée ou non.
Après, je n'ai que rarement utilisé l'Animator, mais je pense qu'il est possible depuis celui-ci d'éviter qu'une animation puisse boucler sur elle-même.
Il existe aussi le ResetTrigger (), qui annule un trigger et donc empêche une animation d'être jouée à la suite.

Re: Code pour repérer si animation jouée

Publié : 24 Août 2021 12:39
par alsthorm
Bordel j'ai enfin réussi ! Merci ! On peut clore le sujet.

Du coup s'il y'en a qui ont le même souci avec l'animator à savoir des animations déclenchées par des Triggers qui si on clique plusieurs fois ou qu'on spam la touche affectée, elles se jouent une nouvelle fois à la fin de la première :

Code : Tout sélectionner

public class
Animator anim;

 void Start()
    {
    anim = gameObject.GetComponent<Animator>();
    }

 void Update()
 if (anim.GetCurrentAnimatorStateInfo(1).IsName("le nom de l'animation")) // Moi c'est (1) car animation dans le layer 1 car j'ai utilisé un LayerMask mais si c'est dans le LayerBase c'est (0)
            {
                GetComponent<Animator>().ResetTrigger("le nom du Trigger");
                            }