Code pour repérer si animation jouée

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
alsthorm
Messages : 9
Inscription : 11 Août 2021 13:36

Code pour repérer si animation jouée

Message par alsthorm » 20 Août 2021 10:40

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...

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 20 Août 2021 11:53

Bonjour,

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

alsthorm
Messages : 9
Inscription : 11 Août 2021 13:36

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

Message par alsthorm » 20 Août 2021 17:24

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");
        }
                }
    }

alsthorm
Messages : 9
Inscription : 11 Août 2021 13:36

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

Message par alsthorm » 24 Août 2021 01:44

Pas d'idée?

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

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

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

Message par boubouk50 » 24 Août 2021 09:49

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.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

alsthorm
Messages : 9
Inscription : 11 Août 2021 13:36

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

Message par alsthorm » 24 Août 2021 12:39

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");
                            }

Répondre

Revenir vers « Scripting »