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

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

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

Message par Derek82 » 06 Juin 2020 18:23

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).

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

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

Message par djulio74 » 07 Juin 2020 10:27

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); } 

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

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

Message par Derek82 » 07 Juin 2020 11:32

: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 !

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 12 Juin 2020 21:05

Cours gratuit en français : Tuto Unity Fr
Cours payant sur Udemy pour environ 20 € (Parein).

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

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

Message par Derek82 » 13 Juin 2020 10:36

Merci !!

Répondre

Revenir vers « Scripting »