[Résolu] [DB-AL] Animator switch d'anims booléennes

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

[Résolu] [DB-AL] Animator switch d'anims booléennes

Message par Krafter » 09 Mars 2017 01:30

Bonjour,

Voilà mon soucis. J'ai un personnage avec un script qui appelle des animations. Animations qui sont dans un animator (que j'appelle dans mon script, etc...). Mon soucis concerne le passage d'une animation à une autre. J'avais des soucis parce que quand je passais de Idle à Running, puis inversement Idle continuait d'être actif et Running aussi. J'ai facilement régler le problème en ajoutant les 2 lignes que j'ai mises en commentaires. Pour l'instant mes animations sont appelées comme suit :

Dans "Update" :

Code : Tout sélectionner

switch (State)
        {
            case CharacterState.Idle:
                Idle();
                break;
            case CharacterState.Running:
                Running();
                break;
        }
Puis :

Code : Tout sélectionner

void Idle()
    {
        animator.SetBool("Idle", true);
        //animator.SetBool("Running", false);
    }
    void Running()
    {
        animator.SetBool("Running", true);
        //animator.SetBool("Idle", false);
    }
Voilà elle sont appelées, tout marche tout le monde est content. Par contre je ne suis pas content moi, cette solution de dire dans "Running" que "Idle" passe en false je ne trouve ça pas opti du tout! Là c'est un bout de code, en fait j'ai une dizaine d'animations. Si à chaque fois que j'en appel une je dois passer les autres en false... ça me semble beaucoup trop bricolo et fouilli pour être du code "propre".
Donc voilà,concrètement ma question : comment puis-je coder les animations de sorte qu'elles se stoppent elles-même quand on arrête de les appeler? J'ai essayer des "while", des "until"... Pas moyen je dois mal m'y prendre,pourtant ça me semble logique que ça soit faisable, plutôt que de tout écrire 15 fois comme un cochon.


Merci de m'avoir lu,

Krafter
Dernière édition par Krafter le 14 Mars 2017 10:29, édité 1 fois.

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL] Animator switch d'anims booléennes

Message par evereal » 09 Mars 2017 11:52

Je pense que tu devrais utiliser un "blend tree" pour le gérer le déplacement.
Avoir tes 2 animations "Idle" et "Run" dans ton blend tree de type 1D, tu n'aura plus qu'une variable float à passer à 0 pour jouer l'animation Idle et 1 pour jouer l'animation de course. Ca te permettra aussi de rajouter facilement d'autre animation dans la lignée (genre la variable a 2 pour une animation de sprint, à 0,5 pour la marche, ...).
Tes méthodes deviendront :

Code : Tout sélectionner

void Idle()
    {
        animator.SetFloat("speed", 0);
    }
    void Running()
    {
        animator.SetFloat("speed", 1);
    }
    
Dernière édition par evereal le 13 Mars 2017 10:19, édité 1 fois.
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Animator switch d'anims booléennes

Message par Krafter » 11 Mars 2017 19:36

Merci de ta réponse :)
J'ai donc suivi quelques tutos sur les blend trees et fait quelques expériences. Cependant quelques questions demeurent. Déjà parmi les blend tree je pense utiliser un 2D blend tree (direction et speed). Par contre il y a plusieurs type de blend tree et je n'ai trouver aucunes explications quant à leurs différences? (Simple, Freeform ou Cartésien)?
Et normalement donc si je règle ma float "direction" à 1 pour tout droit par exemple et à 2 pour à gauche, apparemment si je vais vers l'avant-gauche il y a moyen de mixer les 2 animations? Avoir par exemple 40% tout droit et 60% gauche, plus ou moins en fonction de si on tourne beaucoup ou pas. Par contre moi dans mon code, je switch soit tout droit, soit gauche, soit entre les 2. Malgré que mes états soient séparés comme ça je peux avoir ce résultats dans l'animator? Je n'ai pas réussi ^^"

Merci :)

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL] Animator switch d'anims booléennes

Message par evereal » 13 Mars 2017 10:17

Pour les différents blendtree 2D :
2D Simple Directional : Le plus simple, chaque direction correspond a une animation (en haut pour avancer, en bas pour reculer, a gauche pour aller a gauche et a droite pour aller a droite).
2D Freeform Directional : Comme le directional sauf qu'on px avoir plusieurs animation sur une même direction (en haut pour avancer en marchant, encore + en haut pour avancer en courant par exemple)
2D Freeform Cartesian : Fait pour des animations plus complexe, pour prendre des tournants ou autre, je crois qu'Ethan est basé sur ce blendtree.

Pour la configuration de ton blendtree 2D, Tu devras avoir 2 variables float;
Je vais appeler la première strafing, elle te permet de te déplacer sur la gauche pour une valeur de -1 et sur la droite pour une valeur de 1.
La seconde speed va te permettre d'avancer pour une valeur de 1 et de reculer pour une valeur de -1.
Tu px mnt mixer ces 2 variables pour obtenir un déplacement en biais. En mettant par exemple speed à 1 et strafing à -0.5, ton perso va avancer en se deplacant légèrement sur la gauche.

ps : Une animation Idle en 0,0 de ton blendtree est souvent indispensable
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Animator switch d'anims booléennes

Message par Krafter » 14 Mars 2017 10:28

Ah merci pour ton résumé sur les blend trees ce sont ces infos que je ne trouvais pas :) super!

Je vais essayer un blend tree comme tu le dis. J'avais tenter avec une variable "speed" et une autre "direction" mais je m'en sortais pas bien. Et j'avais pris le freeform comme le 2D simple il fallait une animation Idle oui, mais dans mon animator j'avais déjà un Idle en state de base et je me mélangeais les pinceaux, je voyais mal comment passer de Idle à Idle (à moins que je vire le Idle et que mon blend tree soit le state de base? Pas essayer ça ^^")

Sinon ce que j'avais fini par faire c'est n'utiliser que des blend trees 1D, mais faire des blend trees de blend tree. Je devais avoir un premier blend tree avec une variable "speed", relié à d'autres blends trees avec une variable "direction". Bon ça prend plus de place mais bon l'important c'est de s'y retrouver j'imagine.

Après je me dis, mon perso va à différentes vitesses suivant la direction mais à une seule anim/direction pour l'instant, donc un blend tree 2D comme tu propose devrait bien aller. Si par la suite je veux pouvoir le faire courrir ou autre j'agrandirai tout ça.. En tout cas je vais essayer ton idée, qui répond parfaitement à ma question merci, j'avais du mal à voir (avec les blend tree 1D que j'utilisais du moins) comment l'animator pouvait mixer 2 animations pour aller "en haut à gauche" par exemple. Avec ton exemple de 2D je comprends tout à fait, je test ça ce soir ^^

Merci!

Répondre

Revenir vers « (C#) CSharp »