[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

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

Message par Derek82 » 02 Juin 2020 01:58

Mon projet est un jeu de plateforme en 3D / 2.5D (dans le genre Another Wolrd, Inside, Abe Odyssey,...)

J'arrive à faire marcher, courir et marcher accroupi mon joueur, mais j'ai un peu de mal à le faire sauter en avant maintenant. Je ne veux pas pour l'instant qu'il saute sur place mais bien en avant pour pouvoir sauter par dessus un piège ou un trou.
Pour le moment une animation se déclenche quand on appuie sur le bouton saut (espace), mais l'animation se joue sur place. j'aimerai faire en sorte que le personnage se déplace sur une distance fixe à chaque saut, sur l'axe X et mettons s'élève un peu sur l'axe Y, mais pas Z (fausse 2D oblige).

et cerise sur le clafoutis, j'aimerai ensuite faire en sorte que le saut à l'arrêt ou en marche soit d'un certaine longueur/distance et que le saut déclenché pendant une course soit plus importante par exemple, pour que le joueur franchisse un fossé plus important ou atteigne un point plus difficile d'accès.

J'ai des 'float' pour la vitesse de marche (vitesseMarche) et de course (vitesseCourse), un autre pour la longueur du saut (longueurSaut) et la condition pour déclencher l'anim de saut est en 'bool' (Sauter)

voilà le bout de code pour la fonction "Saut" dans un void FixedUpdate() :

Code : Tout sélectionner

// Sauter

        if (Input.GetKeyDown(KeyCode.Space))
        { 
            Sauter = true;
            // piste pas terrible pour avancer en sautant : 
            transform.position += transform.forward * longueurSaut;
            
        }

        else Sauter = false;

        if (Sauter == false)
            myAnim.SetBool("Sauter", false);
            
        if (Sauter == true)
            myAnim.SetBool("Sauter", true);

auriez-vous une piste ?
Merci !

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

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

Message par boubouk50 » 02 Juin 2020 09:07

Si tu n'utilises pas la physique, il faudra calculer le déplacement durant tout le saut.
Il te faut donc définir le temps de saut, si le joueur est en l'air et la vitesse de déplacement.
Dans l'idée, un algo:

Si Appui sur la touche Espace
- Si le joueur n'est pas entrain de sauter
-- Définir que le joueur est en saut
-- Lancer une coroutine de saut

Coroutine de saut
- Définir la vitesse de déplacement -> Course ou marche?
- Jouer l'animation
- Tant que le joueur est en saut
-- déplacer le joueur sur son forward en fonction de la vitesse définie
-- Attendre la fin de la frame
- Stopper l'animation
- Définir que le joueur n'est plus en saut
"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

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

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

Message par Derek82 » 02 Juin 2020 10:23

Merci pour ces éléments !

Je suis tout débutant (j'ai commencé la semaine dernière et sans notion de programmation... donc c'est un peu coton mais je m'accroche) et j'apprécie de voir comment tu poses les choses pour préparer le code. je m'en inspirerai pour la méthode :)

je vais essayer de trouver les bons 'termes' pour exprimer ce plan avec la doc et google.
mais j'ai du mal à cerner ce point précis : "déplacer le joueur sur son forward"
tu utiliserais

Code : Tout sélectionner

Rigidbody.transform.position += forward * vitesseMarche;
par exemple ?

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

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

Message par boubouk50 » 02 Juin 2020 10:30

Un rigidbody devrait être dirigé par la physique. Si tu utilises la physique pour le déplacement, il faut que ce soit dans le FixedUpdate () et avec l'utilisation des AddForce ().
Le forward est le vecteur z, normalement l'orientation du personnage, ce qui lui fait face.
"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

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

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

Message par Derek82 » 02 Juin 2020 11:23

D'accord !
J'utilise a priori la physique ailleurs pour la marche et la course :

Code : Tout sélectionner

myRB.velocity = new Vector3(move * vitesseMarche, 0, 0);
ce serait similaire pour le saut ?

j'ai tenté deux options :

Code : Tout sélectionner

 myRB.velocity = new Vector3(move * vitesseMarche, 0, 0);
et

Code : Tout sélectionner

myRB.AddForce(transform.forward * vitesseMarche);
mais les deux ne fonctionnent pas, le joueur n'avance pas quand j'appuie sur le bouton saut.

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

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

Message par boubouk50 » 02 Juin 2020 11:33

Je ne peux pas te répondre tel quel, sans tout le code associé.

Ce que je peux te dire. La vélocité gère le déplacement du rigidbody, l'affecter supprime toute autre modification par des forces. De ce fait, seule la dernière opération sur la vélocité sera appliquée.. C'est écrit noir sur blanc dans la documentation officielle:
Dans la plupart des cas, vous ne devez pas modifier la vitesse directement, car cela peut entraîner un comportement irréaliste - utilisez Addforce à la place. Ne définissez pas la vitesse d’un objet à chaque étape de la physique, ce qui conduira à une simulation physique irréaliste.

Il te faut donc définir et le déplacement et le saut avec les forces. L'utilisation de la vélocité peut être envisagée pour borner les forces pour définir une vitesse maximale par exemple.
"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

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

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

Message par Derek82 » 02 Juin 2020 11:49

Voilà tout le code pour les contrôles de mon personnages :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Script_JoueurControles : MonoBehaviour
{

    // Pour que le personnage se retourne
    bool faireFace;

    // Pour que le personnage saute
    bool Sauter;
    
    // vitesse de marche et course
    public float vitesseMarche;
    public float vitesseCourse;
    public float longueurSaut;




    Rigidbody monRB;
    Animator monAnim;
    Transform monTransform;
    

    void Start()
    {
        monTransform = GetComponent<Transform>();
        monRB = GetComponent<Rigidbody>();
        monAnim = GetComponent<Animator>();
        faireFace = true;
        Sauter = false;
        
               
    }
     

    void Update()
    {

        

    }


    void FixedUpdate() {

        // marcher et courrir
        float deplacement = Input.GetAxis("Horizontal");
        monAnim.SetFloat("ConditionMarcher", Mathf.Abs(deplacement));

        float marche = Input.GetAxisRaw("Fire3");
        monAnim.SetFloat("ConditionCourir", marche);



        if (marche > 0) {
            monRB.velocity = new Vector3(deplacement * vitesseCourse, 0, 0);
        }

        else {
            monRB.velocity = new Vector3(deplacement * vitesseMarche, 0, 0);
        }

        if (deplacement > 0 && !faireFace) Flip();
        else if (deplacement < 0 && faireFace) Flip();


        // s'accroupir        
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            monAnim.SetFloat("ConditionSaccroupir", 1);
           
        }

        else if (Input.GetKeyUp(KeyCode.DownArrow))
        {
            monAnim.SetFloat("ConditionSaccroupir", 0);
        }


        // Sauter

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Sauter = true;
            // Ici emplacement pour ligne de code pour faire avancer le saut...?
            





        }

        else Sauter = false;

        if (Sauter == false)
            monAnim.SetBool("Sauter", false);

        if (Sauter == true)
            monAnim.SetBool("Sauter", true);

        // ----->saut

    }


    void Flip()
    {
        faireFace = !faireFace;
        Vector3 changerEchelle = transform.eulerAngles;
        changerEchelle.y *= -1;
        transform.eulerAngles = changerEchelle;
    }
    
}

J'aurais dû éviter d'utiliser le rigidbody pour la marche et la course et utiliserAddforce à ton avis ?

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

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

Message par boubouk50 » 02 Juin 2020 12:36

Les AddForces sont liés au rigidBody, ils font partie de ses méthodes.
Les input devraient être récupérés dans l'Update ().
Tu utilises un rigidbody, pas un rigidbody2D , tu fais donc un jeu en 3D isométrique et pas un jeu 2D simulant la 3D?

En fait, je ne sais pas vraiment comment t'aider. Là, je t'aide dans ton optique de créer un "characterController" custom alors que je devrais peut être te diriger vers un characterController standard qui fait déjà ce que tu veux.
Les exemples d'Unity sont très bien fait pour cela, je te conseillerai de les éplucher. Bien qu'ils soient en 3D, c'est la même chose mis, la 2.5D est juste moins libre, donc théoriquement plus simple.
Asset Store: Exemples Unity technologies
"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

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

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

Message par Derek82 » 02 Juin 2020 12:48

Je fais un jeu en 3D (tout est en 3d, du décors au personnage) mais dans une logique de jeu de plateforme 2D : la camera suit le joueur qui avance sur un plan fixe (axe X uniquement sauf pour les phases de saut, un tout petit peu sur l'axe X)

voilà toujours une capture d'écran de ce que je suis en train de bricoler si ça peut t'aider à visualiser ce que j'essaie de faire (c'est juste un niveau démo qui me sert à mettre le "moteur du jeu" au point, les scripts et... à apprendre !) note : la capture est ancienne, la vitesse de marche et de course sont encore les mêmes sur l'exemple, mais tu verras j'espère l'idée.

Image

et ici un exemple de ce que je voudrais arriver à faire avec le saut, une action assez classique, ici prise dans Another World (le lien mène juste à l'action de saut en avant que je veux faire) :
https://youtu.be/wjMf_bEfqIc?t=805


J'examine les controller existants donnés en exemple ici et là sur le net et je suis des tutoriaux mais je ne trouve pas de méthode pour un saut en avant (ou plus vraisemblablement je ne les comprends pas assez bien pour les reporter chez moi dans mon code).

voilà, je ne sais pas si je suis plus clair ! :)

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

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

Message par boubouk50 » 02 Juin 2020 13:15

En fait, avec un rigidbody et des forces, tu ne dois pas te soucier d'aller en avant lors d'un saut.
C'est la même chose dans la vie, tu avances et tu sautes. Tu donnes une impulsion vers le haut pour sauter et tu avances pendant ton saut parce que tu as une vitesse de départ.
La vitesse de déplacement va donc définir la vitesse de saut. Le saut n'a qu'à donner une impulsion vers le haut.
Donc si tu te déplaces en marchant, ton saut aura la vitesse de la marche, en courant il aura la vitesse de course. C'est une addition de 2 forces différentes, une vers l'avant et une vers le haut.

Je te dis de regarder ce qu'il se fait car il n'y a pas qu'une seule méthode.
Certains n'utilisent que les forces, d'autres le MovePosition et d'autres le CharacterController.
Je ne fais pas de déplacement de personnages, donc je ne suis pas à même de te donner LA réponse adaptée, je ne peux que te guider vers un chemin possible.
"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 « Scripting »