Page 1 sur 1

[RESOLU]Rigidbody et Animation

Publié : 20 Nov 2019 19:43
par Ynua
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:

Re: Rigidbody et Animation

Publié : 20 Nov 2019 22:37
par Max
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 ?

Re: Rigidbody et Animation

Publié : 21 Nov 2019 10:04
par Ynua
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.

Re: Rigidbody et Animation

Publié : 21 Nov 2019 19:07
par Max
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.

Re: Rigidbody et Animation

Publié : 22 Nov 2019 15:23
par Ynua
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:

Re: [RESOLU]Rigidbody et Animation

Publié : 22 Nov 2019 15:26
par boubouk50
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.