[RESOLU]Rigidbody et Animation

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
Ynua
Messages : 13
Inscription : 07 Nov 2018 15:21

[RESOLU]Rigidbody et Animation

Message par Ynua » 20 Nov 2019 19:43

Bonsoir !

Je viens faire appel à votre savoir parce que j'ai un petit soucis que je ne comprend pas...

Je travaille sur un projet de jeu 2D, j'ai donc un personnage 2D, avec trois animations: Idle, Run-Right et Run-Left (c'est un modèle 3D que j'ai créé à la base et j'en ai fais des sprites avec Blender). J'aimerais que mon personnage cours vers la droite ou vers la gauche et que lorsque qu'il s'immobilise, l'animation Idle se lance. J'ai donc essayé diverses méthodes, comme par exemple utiliser "is moving" ou "rigidbody.velocity.magnitude = 0" mais pour une raison que j'ignore, ça ne fonctionne pas.
Mais ce n'est pas tout. Lorsque mon personnage rentre en collision avec des objets (qui dans mon cas, tombent du ciel) mon personnage "bascule". Alors là, la solution est toute trouvée, je check les contraintes du rigidbody de position Y et de rotation Z, oui mais... Pour une raison que j'ignore, lorsque je fais ça mon personnage continue de courir même lorsqu'il n'est plus censé le faire. :pascontent2:

Donc question:
- Comment faire pour que mon personnage joue l'animation Idle lorsqu'il est immobile ?
- Comment faire pour que mon personnage ne bascule pas et ne continue pas de courir lorsque j'active les contraintes ?

Voici mon code:

Code : Tout sélectionner

 
 void Update()
    {
        int i = 0;
        while(i < Input.touchCount)
        {
            if(Input.GetTouch(i).position.x > screenWidth / 2)
            {//right
                RunCharacter(1.0f);
                anim.SetBool("Run_Right", true);
                anim.SetBool("Run_Left", false);
                anim.SetBool("Idle", false);
            }
            if(Input.GetTouch(i).position.x < screenWidth / 2)
            {//left
                RunCharacter(-1.0f);
                anim.SetBool("Run_Right", false);
                anim.SetBool("Run_Left", true);
                anim.SetBool("Idle", false);
            }
            if(characterBody.velocity.magnitude == 0)
            {//idle
                anim.SetBool("Idle", true);
                anim.SetBool("Run_Right", false);
                anim.SetBool("Run_Left", false);
            }
            i++;
        }
    }

void FixedUpdate()
    {
        #if UNITY_EDITOR
        RunCharacter(Input.GetAxis("Horizontal"));
        #endif
    }
    
private void RunCharacter(float horizontalInput)
    {
        characterBody.AddForce(new Vector2(horizontalInput * moveSpeed * Time.deltaTime, 0));
    }
Merci d'avance pour votre aide :merci:
Dernière édition par Ynua le 22 Nov 2019 15:23, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Rigidbody et Animation

Message par Max » 20 Nov 2019 22:37

Bonsoir,
Ynua a écrit :
20 Nov 2019 19:43
- Comment faire pour que mon personnage joue l'animation Idle lorsqu'il est immobile ?
Ton perso aura rarement une magnitude pile-poil égale à zéro quand il est immobile, surtout après une phase dynamique (déplacement). A fortiori si des objets lui tombe dessus. Donc quand tu écris if(characterBody.velocity.magnitude == 0), c'est une condition qui a peu de chance de se vérifier. Même un test par rapport à Mathf.Epsilon ne serait pas fiable dans ce cas.
Tu peux essayer un truc du genre

Code : Tout sélectionner

float seuil = 0.001f;
...
 void Update()
    { ...
    if(characterBody.velocity.magnitude < seuil)
    ...
      ...  }
Ynua a écrit :
20 Nov 2019 19:43
- Comment faire pour que mon personnage ne bascule pas et ne continue pas de courir lorsque j'active les contraintes ?
Là, il faudrait en savoir plus sur la conf de ton Player niveau physique (RigidBody2D et ses collider2D).
Bloquer la rotation sur Z ok, mais pourquoi bloquer l'axe des Y en translation ? Ton player n'a aucune possibilité de mouvement vertical ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Ynua
Messages : 13
Inscription : 07 Nov 2018 15:21

Re: Rigidbody et Animation

Message par Ynua » 21 Nov 2019 10:04

Bonjour,

Merci pour ta réponse !
En ce qui concerne la deuxième question, le problème venait effectivement du fait que je bloquait l'axe des Y, puisque mon personnage ne bouge que de gauche à droite. En bloquant uniquement la rotation Z tout fonctionne parfaitement.

Néanmoins, pour mon premier problème, mettre un seuil ne fonctionne pas très bien dans mon cas. Mon personnage se met en Idle si, par exemple, je cours vers la droite, arrêt, puis recours vers la gauche, dans ce cas il va se mettre en Idle pendant genre 1 seconde avant de courir vers la gauche. Est-ce qu'il n'y aurait pas juste une autre solution que d'utiliser la magnitude dans ce cas ? J'avais essayé en utilisant "last position" et "current position" mais ça revient au même, ça ne fonctionne pas.. Et je ne vois pas comment faire autrement.

Merci une fois de plus pour ton aide.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Rigidbody et Animation

Message par Max » 21 Nov 2019 19:07

Bonsoir,
Ynua a écrit :
21 Nov 2019 10:04
Néanmoins, pour mon premier problème, mettre un seuil ne fonctionne pas très bien dans mon cas. Mon personnage se met en Idle si, par exemple, je cours vers la droite, arrêt, puis recours vers la gauche, dans ce cas il va se mettre en Idle pendant genre 1 seconde avant de courir vers la gauche. Est-ce qu'il n'y aurait pas juste une autre solution que d'utiliser la magnitude dans ce cas ? J'avais essayé en utilisant "last position" et "current position" mais ça revient au même, ça ne fonctionne pas.. Et je ne vois pas comment faire autrement.
Personnellement, pour ce genre de gestion, je partirais sur un truc simple. N'activer l'animation "run" que quand tu détectes une commande (vers la droite ou la gauche), mais si aucun input, alors forcer l'Idle.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Ynua
Messages : 13
Inscription : 07 Nov 2018 15:21

Re: Rigidbody et Animation

Message par Ynua » 22 Nov 2019 15:23

Bonjour,

Merci pour ta réponse et pour ton aide.
J'ai déjà essayé d'activer les animations "run" uniquement dans le cas où j'appuyais sur l'écran, malheureusement ça ne fonctionne pas dans mon cas parce que mon personnage continue de courir après avoir appuyer donc si j'activais l'idle à ce moment là, mon personnage jouerait l'animation de repos en mouvement.

Merci tout de même pour ton aide et pour ton temps :merci:

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

Re: [RESOLU]Rigidbody et Animation

Message par boubouk50 » 22 Nov 2019 15:26

Parce que tu ne gères pas le cas où tu ne touches plus l'écran?
Dans ton premier code, on voit bien que tu joues des animations quand tu touches l'écran, mais aucune quand tu ne le touches plus. Du coup, cela est normal que l'animation ne passe pas directement en Idle.
"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

Répondre

Revenir vers « (C#) CSharp »