Page 4 sur 4

Re: [DB - AL] Saut en avant (2.5D)

Publié : 06 Juin 2020 18:23
par Derek82
J'ai dû prendre un peu de temps pour faire du ménage dans le projet et refaire les transitions de l'animator du joueur qui posaient quelques problèmes.
Voilà le résultat sur un niveau encore "bac à sable" avec un personnage en cours d'élaboration (c'est censé être un astronaute au final) :

Image

ça marche très bien et je te remercie encore pour ton aide Djulio74 !
(enfin très bien, il y a des choses bizarres à l'animation, le saut en hauteur n'est pas réglé au niveau des transitions, la pose est bizarre on dirait qu'il fait de la "air-chaise roulante" en lévitation quand il saute :gene: mais je règlerai ça plus tard)

j'ai un petit soucis visiblement avec le multiplicateur de vitesse pour la course qui ne semble pas s'activer depuis que j'ai mis les animations. je ne sais pas ce que j'ai pu faire de mal dans le code en intégrant les animations... ??? :0

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Script_Controles_V3 : MonoBehaviour
{
    CharacterController characterController;
    public GameObject AnimatorCible;
    private Animator monAnim;

    public float VitesseMarche = 3.0f; // Vitesse de la marche
    public float CourseMultiplicateur = 8.0f;   // multiplicateur pour passer de la Vitesse de marche a celle de courir
    public float LongueurSautAvant = 5.0f; // la longeur du saut en avant
    public float HauteurSautAvant = 2.0f; // hauteur général d'un saut
    public float HauteurSaut = 4.5f; // hauteur général d'un saut
    private float Vitesse = 0.0f; // Vitesse calculée en fonction des input
    private float gravity = 9.81f;  // force de gravité pour simuler la retombée d'un saut
    private Vector3 moveDirection = Vector3.zero; // la direction général à donner au controler
    private float direction = 1.0f; // permet de savoir si on va a gauche ou a droite
    
    void Awake()
    {
        // Chercher l'Animator sur le perso.
        // monAnim = AnimatorCible.GetComponent<Animator>();

    }

    void Start()
    {
        // Assignerle controler en prenant celui présent sur le perso.
        characterController = GetComponent<CharacterController>();
        monAnim = AnimatorCible.GetComponent<Animator>();
                
    }

    void Update()
    {

        if (characterController.isGrounded)
        {
            // MARCHER
            // defini la Vitesse de deplacement en fonction de l'axe horizontal des input
            Vitesse = Input.GetAxis("Horizontal") * VitesseMarche;
            monAnim.SetFloat("ConditionMarcher", Mathf.Abs(Vitesse));

            // COURIR
            // si la touche course (ici leftControl) est appuyé, mutiplie la Vitesse par le CourseMultiplicateur
            if (Input.GetKeyDown(KeyCode.LeftControl)) { Vitesse *= CourseMultiplicateur; monAnim.SetFloat("ConditionCourir", 1); }
            else if (Input.GetKeyUp(KeyCode.LeftControl)) { monAnim.SetFloat("ConditionCourir", 0); } 

            // on assigne le deplacement sur l'axe x avec la Vitesse 
            moveDirection.x = Vitesse;

            // S'ACCROUPIR
            // si la touche vers le bas est pressée, le perso se baisse 
            if (Input.GetKeyDown(KeyCode.DownArrow)) { monAnim.SetFloat("ConditionSaccroupir", 1); }
            else if (Input.GetKeyUp(KeyCode.DownArrow)) { monAnim.SetFloat("ConditionSaccroupir", 0); }

            // MARCHER ACCROUPI
            // directement dans l'animator

            // ORIENTATION, RETOURNEMENT
            // on defini la direction que doit avoir le pero, en fonction du signe de Vitesse, en evitant de comparer avec zero
            if (Vitesse > 0) direction = 1.0f;
            else if (Vitesse < 0) direction = -1.0f;

            // on compare la direction du perso (la direction qui pointe devant lui, on retourne le perso s'il est différent de la direction
            if (transform.forward != Vector3.right * direction) { transform.forward = Vector3.right * direction; }

            // SAUT EN HAUTEUR
            // si on appui sur leftShift, on saute. Sur place si on avance pas, sinon dans la direction du deplacement
            if (Input.GetKeyDown(KeyCode.LeftShift))
            {
                moveDirection.y = HauteurSaut;
                monAnim.SetBool("ToucheLeSol", false);
            }
            else { monAnim.SetBool("ToucheLeSol", true); }

            // SAUT EN AVANT
            // Variante du saut pour faire un saut en avant même si on avance pas, ici avec la touche W
            if (Input.GetKeyDown(KeyCode.W) && Vitesse == 0)
            {
                moveDirection.y = HauteurSautAvant;
                moveDirection.x = LongueurSautAvant * direction;
                monAnim.SetFloat("ConditionSautEnAvantFloat", 1);
            }
            else { monAnim.SetFloat("ConditionSautEnAvantFloat", 0); }
        }

        // GRAVITE
        // On ajoute a la Vitesse une force de gavité pour la simuler
        moveDirection.y -= gravity * Time.deltaTime;
               
        // on demande au controler de bouger le perso d'après tout ce qu'on a calculé.
        characterController.Move(moveDirection * Time.deltaTime);
    }


}


et la marche accroupie se comporte un peu bizarrement, il continue à marcher alors que je n'appuie plus et a du mal à repasser à la phase "idle" de l'anim de temps en temps, il bloque un peu. ça se débloque quand j'appuie sur le saut vertical. je ne sais pas ce qui se passe, si ça se joue au niveau des conditions de l'animator, ou si c'est un soucis que j'ai crée en intégrant les anims dans le code (je suis en train de regarder ce qui peut coincer).

Re: [DB - AL] Saut en avant (2.5D)

Publié : 07 Juin 2020 10:27
par djulio74
Le probleme avec la course c'est que tu l'assigne avec un GetKeyDown, donc uniquement a l'appuie de la touche et non tant qu'elle est appuyée.
au lieu de faire :

Code : Tout sélectionner

// a l'appuie de la touche
if (Input.GetKeyDown(KeyCode.LeftControl)) { Vitesse *= CourseMultiplicateur; monAnim.SetFloat("ConditionCourir", 1); }
// au relachement de la touche
else if (Input.GetKeyUp(KeyCode.LeftControl)) { monAnim.SetFloat("ConditionCourir", 0); } 
tu pourrait remplacer par :

Code : Tout sélectionner

// tant que la touche est appuyée
if (Input.GetKey(KeyCode.LeftControl)) { Vitesse *= CourseMultiplicateur; monAnim.SetFloat("ConditionCourir", 1); }
// tant que la touche est relachée
else  { monAnim.SetFloat("ConditionCourir", 0); } 

[Résolu][DB - AL] Saut en avant (2.5D)

Publié : 07 Juin 2020 11:32
par Derek82
:gene: tout simplement... !

oui ça remarche très bien. Il faut vraiment que je trouve un genre de cours pour apprendre à mieux comprendre le C#, j'ai vraiment du mal à l'assimiler.

En tout cas, je te remercie, grâce à toi mon problème est résolu, désolé si ça été un peu laborieux de mon côté pour y arriver !

je vais pouvoir enfin passer à la suite !

Re: [RESOLU][DB - AL] Saut en avant (2.5D)

Publié : 12 Juin 2020 21:05
par jmhoubre
Cours gratuit en français : Tuto Unity Fr
Cours payant sur Udemy pour environ 20 € (Parein).

Re: [RESOLU][DB - AL] Saut en avant (2.5D)

Publié : 13 Juin 2020 10:36
par Derek82
Merci !!