[RESOLU] Blend Tree et clavier

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
Tomomalley
Messages : 9
Inscription : 30 Déc 2018 13:36

[RESOLU] Blend Tree et clavier

Message par Tomomalley » 27 Fév 2019 09:41

Salut à tous,

Je suis en train de configurer un blend tree, qui fonctionne bien, à un petit détail près.
J'y ai inclus l'animation de marche (X 0 - Y 0.5) et l'animation de course (X 0 - Y 1).
Le problème du clavier c'est que lorsque j'appuie sur ma touche, la float passe de 0 à 1 et donc, je ne peux pas jouer mon animation de marche.

https://image.noelshack.com/fichiers/20 ... ndtree.png

J'ai également tenté de faire 2 blend tree différents (1 pour la marche, 1 pour la course) en switchant de l'un à l'autre avec avec une bool (run true, run false). En soit ça fonctionne, mais le résultat n'est pas super

je voudrai savoir si il existe un moyen de limiter les floats (vertical et horizontal) (-0.5 et 0.5 max) et de faire sauter cette limite en appuyant sur une touche (Left Shift) afin d'activer l'animation de course ?

Voici ce que j'ai en code pour le moment:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMotor : MonoBehaviour
{

    public float walkSpeed = 3f;
    public float runSpeed = 8f;
    public float turnSpeed = 180f;
    
    Animator anim;

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


    void Update()
    {
        if (!Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetFloat("vertical", Input.GetAxis("Vertical"));
            anim.SetFloat("horizontal", Input.GetAxis("Horizontal"));

            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * walkSpeed * Time.deltaTime);
            transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * walkSpeed * Time.deltaTime);
            transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * turnSpeed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetFloat("vertical", Input.GetAxis("Vertical"));
            anim.SetFloat("horizontal", Input.GetAxis("Horizontal"));

            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * runSpeed * Time.deltaTime);
            transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * runSpeed * Time.deltaTime);
            transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * turnSpeed * Time.deltaTime);
        }
    }
}
Si quelqu'un peut m'éclairer ça serait super.
Bonne journée.
Dernière édition par Tomomalley le 28 Fév 2019 09:10, édité 1 fois.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [Débutant] Blend Tree et clavier

Message par Moi 1971 » 27 Fév 2019 10:11

Bonjour la réponse est oui et c'est très simple. Mais comme tu ne t'y prends pas forcément de la bonne manière ça complique...
Les tests de touches LeftShift et GetAxis sont inversés... à mon avis...
là de ce que je comprends, si tu appuis sur shift sans appuyer sur les touches de direction, l'animation "marche" se joue sans que le perso se déplace?!?.. Enfin je ne m'y connais pas en anim.
Mais, dans ton code, en tous cas, il faut juste faire des maths très simples... DIVISER par 2 entre la marche et la course. Donc tu écris un seul test :
SI appuis sur shift ALORS
Input.GetAxis("Vertical") DIVISER par 2 ( => 1 / 2 = 0.5 )
Input.GetAxis("Horizontal") DIVISER par 2 ( => 1 / 2 = 0.5 )

Attention de ne pas diviser 0 (zéro) par deux.. à tester avant donc...

Tomomalley
Messages : 9
Inscription : 30 Déc 2018 13:36

Re: [Débutant] Blend Tree et clavier

Message par Tomomalley » 27 Fév 2019 10:29

En fait j'ai cherché beaucoup trop compliqué...

J'ai suivis ton conseil j'ai juste rajouté * 1/2

Code : Tout sélectionner

 if (!Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetFloat("vertical", Input.GetAxis("Vertical") * 1/2);
            anim.SetFloat("horizontal", Input.GetAxis("Horizontal") * 1/2);
et ça fonctionne. Je te remercie.
Je rencontre jute un autre problème maintenant, c'est la transition entre les 2 anims. (marche et course) Elle est brutale, la ou le blend tree est sensé donner de la souplesse entre les différentes anims justement.
En soit dans l'état ça fonctionne, mon personnage fait ce que je lui demande de faire. Il va juste falloir que je trouve comment optimiser tout ça.

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

Re: [Débutant] Blend Tree et clavier

Message par boubouk50 » 27 Fév 2019 10:55

Multiplie par 0.5f au lieu de multiplier par 1 puis diviser par 2. La division est plus lourde que la multiplication par l'inverse. Aussi, utilises des float et pas des entiers pour les opérations décimales.
"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

Tomomalley
Messages : 9
Inscription : 30 Déc 2018 13:36

Re: [Débutant] Blend Tree et clavier

Message par Tomomalley » 27 Fév 2019 12:02

Ok je note, merci pour le tuyau ;)

En revanche j'ai toujours le même soucis que je ne comprend pas.
Si je n'appuie pas sur la touche shift, mes axes "Horizontal" et "Vertical" bougent progressivement de 0 à 0.5 et de 0 à -0.5.
Mais lorsque j'enfonce shift, il passent directement de 0.5 à 1 et de -0.5 à -1 sans progression.

C'est la seule chose qui me pose problème.

Si par contre j'enfonce d'abord shift puis ensuite ma touche directionnelle, elles vont bien de 0 à 1 et 0 à -1 progressivement.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [Débutant] Blend Tree et clavier

Message par Moi 1971 » 27 Fév 2019 13:06

Sans le nouveau code ça va être dur de répondre...

Tomomalley
Messages : 9
Inscription : 30 Déc 2018 13:36

Re: [Débutant] Blend Tree et clavier

Message par Tomomalley » 27 Fév 2019 13:18

Autant pour moi :)

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMotor : MonoBehaviour
{

    public float walkSpeed = 3f;
    public float runSpeed = 8f;
    public float turnSpeed = 180f;

    public bool OH;
    public bool TH;
    
    Animator anim;

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


    void Update()
    {
        OH = false;
        TH = false;

        if (!Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetFloat("vertical", Input.GetAxis("Vertical") * 0.5f);
            anim.SetFloat("horizontal", Input.GetAxis("Horizontal") * 0.5f);

            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * walkSpeed * Time.deltaTime);
            transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * walkSpeed * Time.deltaTime);
            transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * turnSpeed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetFloat("vertical", Input.GetAxis("Vertical"));
            anim.SetFloat("horizontal", Input.GetAxis("Horizontal"));

            transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * runSpeed * Time.deltaTime);
            transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * runSpeed * Time.deltaTime);
            transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * turnSpeed * Time.deltaTime);
        }

    }

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [Débutant] Blend Tree et clavier

Message par Moi 1971 » 27 Fév 2019 14:02

Oui, donc pour ton problème, c'est normal.
Input.GetAxis("") renvoie des valeurs de 0 à 1 par pas, disons de 0.1.
Donc si on reprends ce que tu dis :
"Si je n'appuie pas sur la touche shift, mes axes "Horizontal" et "Vertical" bougent progressivement de 0 à 0.5 et de 0 à -0.5."
=> Input.GetAxis("") renvoi bien de 0 à 1 (ou -1) progressivement mais tu divise par 2 donc 0.5 max ( ou -0.5)... et ça reste bloqué à 0.5max.
=> A ce moment là, quand c'est max, Input.GetAxis("") renvoie 1, mais tu divises par 2 donc tu utilises la valeur 0.5

"Mais lorsque j'enfonce shift, il passent directement de 0.5 à 1 et de -0.5 à -1 sans progression."
=> A ce moment tu ne divises plus par 2 donc tu utilises la vraie valeur renvoyée par Input.GetAxis("") qui est à ce moment là de 1 (ou -1), la valeur max. Donc tu passes direct de 0.5 à 1 (ou -0.5 à -1)

Voilà
Pour t'en rendre compte, rajoute des Debug.log pour afficher les vraies valeurs de Input.GetAxis("") au cours du temps.

Tomomalley
Messages : 9
Inscription : 30 Déc 2018 13:36

Re: [Débutant] Blend Tree et clavier

Message par Tomomalley » 27 Fév 2019 14:30

Ok, je pige à peu près, je vais tester différents trucs.

Merci ;)

Répondre

Revenir vers « (C#) CSharp »