[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 » 02 Juin 2020 14:46

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.
Merci ! C'est déjà pas mal ;)
Je te dis de regarder ce qu'il se fait car il n'y a pas qu'une seule méthode.
oui j'ai bien vu qu'il existe plein de façon de faire, celles que tu cites mais je ne dois pas les comprendre comme il faut car à chaque fois je les ai appliqué sans un bon résultat, mais je vais persister ! tu m'as mis sur la voie (je ne comprenais pas bien la différence entre velocity et addforce par exemple)
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.
Ce que tu dis me semble vrai pour une partie de ce que je veux faire : "course+saut=saut plus grand"
mais pour la première étape "saut simple", il me semble qu'on peut sauter sans avoir de vitesse préalable, depuis une position immobile, sans véritable élan, sans vitesse et sans déplacement préétabli. mais ce sera un saut plus modeste, forcément. C'est ce point que je cherche en particulier.

je vais creuser et je posterai la solution si je la trouve.

pour le moment j'ai obtenu des résultats un peu étranges en remplacant le paramètre velocity par addforce pour gérer les déplacements du personnages :

Code : Tout sélectionner

// 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.AddForce(transform.forward * vitesseCourse, ForceMode.Force);
        }

        else {
              monRB.AddForce(transform.forward * vitesseMarche, ForceMode.Force);
        }
étranges, parceque ça a marché une première fois très bien (avec un petit problème quand même c'est que le personnage ne restait pas statique parfaitement à l'arrêt : il glissait subrepticement... mais bon ça pouvait se régler j'imagine) mais à chaque fois que j'ai relancé, le personnage partait dans les airs, indéfiniment...

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

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

Message par Derek82 » 02 Juin 2020 15:55

Ah du nouveau :

j'ai déplacé mon code initial en conservant les paramètres rigidbody.velocity depuis "void FixedUpdate" vers "void Update" et ça fonctionne. En fait, le saut (le saut executable depuis une position à l'arrêt, sans vitesse préalable) marche tout seul, sans aucun paramètre. la distance prévue par l'animation fait loi ici on dirait.

Je vais potasser davantage la doc sur les fonctions Update et FixedUpdate.
Avant de considérer le sujet comme résolu, je vais m'intéresser à l'option saut + course.

et régler ce problème de "pesanteur" : quand le personnage chute, il chute très lentement... je ne sais pas d'où ça vient.
peut-être la gravité du projet (par défaut : -9.81) et la masse du joueur (1) mais j'en doute.

Image

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 17:08

Attention, les animations doivent être sur place! Dans l'animation de saut ton personnage ne doit pas avancer! Sinon, il en résultera un conflit de position entre le personnage et son Controller.

Pour faire un saut toujours vers l'avant, tu peux donner une force prédéfinie vers le haut et le forward lors du saut, et ensuite, à toi de borner la vélocité en fonction de la vitesse maximale à avoir selon si ton personnage court ou marche.
OI alors de couper la vélocité juste avant de sauter et de donner la bonne force ensuite (dans la même frame).
"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 17:44

Attention, les animations doivent être sur place! Dans l'animation de saut ton personnage ne doit pas avancer! Sinon, il en résultera un conflit de position entre le personnage et son Controller.

Ah d'accord ! Damned c'était trop beau :D
Mais oui je m'en rends compte que ça ne marchait pas très bien de toute façon avec un déplacement un peu approximatif et pas très joli. je vais essayer d'aboutir à une solution plus élégante... mais j'ai encore bien du mal à "traduire" en terme de programmation le plan/la méthode, je passe des heures sur la doc de Unity et les forums, tutos youtube, pas toujours évident de trier... mais faut être patient je crois ! :ange:

Je vais refaire des essais en essayant de suivre la logique que tu as décrite, ça me semble clair, reste à voir comment le formuler de la bonne façon.

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 18:34

Comme dit décortique ce qui a déjà été fait par Unity pour en sortir la logique.
Tu verras que toutes les animations sont sur place et que les déplacements sont gérés programmatiquement.
"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

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

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

Message par djulio74 » 02 Juin 2020 18:39

Pour apporter quelques précisions supplémentaire sur tout ce que t'as déjà expliqué Boubouk50.
Unity gère automatiquement la physique réelle des objets, en prenant en compte une force de gravité, la masse des objets, les frictions.. par exemple.
Pour utiliser les rigidbody, qui fonctionne justement sur la physiqe, il faut faire attention à ne pas contredire cette physique.
Dans la vie, un objet bouge parce qu'on lui applique une force, ce qui se traduit par un déplacement et donc une vitesse. Ce n'est pas l’attribution d'une vitesse qui défini un mouvement.

Il faut donc tant que possible agir de même avec Unity, donc appliquer des force (AddForce) et non des Move, translate ou velocity.
Si tu veux que ton perso avance, ajoute lui une force dans la direction souhaitée. Si tu veux qu'il saute, ajoute lui une force vers le haut quand tu appuie sur "sauter". et il sautera a la vertical.
Dans la quasi totalité des jeux, et ce qui se rapproche le plus de la vraie vie, si tu veux sauter en avant, il faut et ajouter un forcevers l''avant (pour lui donner une vitesse horizontale) et vers le haut pour lui donner une vitesse verticale. plus tu va vite en avant plus tu sautera loin, et par la même si t'es a l’arrêt, tu fait un saut sur place.

Pour ce qui est de ton probleme de tomber "doucement", je suis presque sur que ça viens du fait que tu utilise des Move au lieu de AddForce. Car même si unity gère la gravité, il ne parviens pas gérer la résistance a l'air (qui elle peut etre simulé avec Dragg), donc que ton perso ai une masse de 1 (la vache il est leger d'ailleurs) ou 200, il devrait toujours tomber a la même vitesse pour une gravité donnée.
Justement la gravité de -9.81 en y est parfaite, elle représente une acceleration verticale vers le bas de 1 m/s/s, comme sur terre.

et je rejoint le conseil de Boubouk50, Unity possède déjà de très bon contrôleur de personnage, tu devrais vraiment y jeter un œil. Pourquoi réinventer la roue? ^^

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

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

Message par Derek82 » 02 Juin 2020 19:00

Merci pour ces précisions ! J'y vois un peu plus clair.

En fait j'ai suivi un tutorial sur youtube qui me semblait bien fait : https://www.youtube.com/watch?v=rMogWC_rodI&t=5s
et la méthode décrite utilise des move et la velocité, et jusque là ça marchait correctement pour la marche, la course etc.
Dans la quasi totalité des jeux, et ce qui se rapproche le plus de la vraie vie, si tu veux sauter en avant, il faut et ajouter un forcevers l''avant (pour lui donner une vitesse horizontale) et vers le haut pour lui donner une vitesse verticale. plus tu va vite en avant plus tu sautera loin, et par la même si t'es a l’arrêt, tu fait un saut sur place.
Je vois ce que tu veux dire. Je ne suis pas sûr que ça se vérifie tout à fait dans les exemples de jeux 2D cités plus haut comme mes sources d'inspiration pour ce projet où il n'est pas rare que le personnage ne saute pas sur place, mais saute uniquement en avant d'une distance invariable, sans influence de sa vitesse. il y a souvent un second saut qui est à executer pendant une phase de course, mais j'ai l'impression que la "philosophie" de ces jeux étaient plus de les différencier comme deux actions différentes un saut court et un saut long plutôt que de les soumettre à l'influence de la vitesse de déplacement du personnage (qui est de toute façon fixe ici selon que le personnage court ou marche, sans valeur intermédiaire).


Pour ce qui est de ton probleme de tomber "doucement", je suis presque sur que ça viens du fait que tu utilise des Move au lieu de AddForce. Car même si unity gère la gravité, il ne parviens pas gérer la résistance a l'air (qui elle peut etre simulé avec Dragg), donc que ton perso ai une masse de 1 (la vache il est leger d'ailleurs) ou 200, il devrait toujours tomber a la même vitesse pour une gravité donnée.
Justement la gravité de -9.81 en y est parfaite, elle représente une acceleration verticale vers le bas de 1 m/s/s, comme sur terre.
ah d'accord ! oui je vois.
Au passage j'ai du mal à voir quelle est la masse moyenne qu'on donne au joueur ? dans les tutos que j'ai suivi elle est souvent laissé à 1. il faudra lui donner plutot 10 ? 50 ? 100 ? pour une gravité générale par défaut réaliste de -9.81

Je me demande compte tenu de mes références si je ne devrais pas eviter d'utiliser la gravité et faire comme un jeu 2D mais en 3D... ?
et je rejoint le conseil de Boubouk50, Unity possède déjà de très bon contrôleur de personnage, tu devrais vraiment y jeter un œil. Pourquoi réinventer la roue? ^^
Ok je vais le revoir mais je n'arrivais pas à obtenir du controleur tout fait ce que je voulais, parceque je ne comprenais meme pas la façon dont il a été codé (je débute totalement) du coup en essayant d'apprendre à construire mon propre moteur, en suivant à la lettre un tuto, ça me semblait une bonne méthode d'apprentissage.

je vais voir si je peux me rabattre sur le controleur fourni maintenant que je comprends un peu mieux qu'au début qqs éléments.
merci !

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

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

Message par Derek82 » 05 Juin 2020 03:05

J'ai essayé de suivre vos conseils mais je galère bien :
Voilà ma dernière piste, je précise que j'ai testé le bool isGrounded sur un saut vertical, sur place, et ça marche bien de ce côté (j'arrive à avoir un saut sur place vertical qui se comporte bien vis à vis du sol). j'essaye de l'appliquer à l'horizontal mais ça ne fonctionne pas... je me perds un peu dans la logique je crois.

Je ne vois pas où je me trompe ?
Comment améliorer tout ça ?

Merci de votre aide :nono:

Code : Tout sélectionner

    public Transform groundCheck;
    public float rayonCheck;
    public LayerMask groundLayer;

    public Vector3 force;
    public float SautEnAvant;

    void FixedUpdate()
    {

        // Sauter en avant
        bool isGrounded = Physics.CheckSphere(groundCheck.position, rayonCheck, groundLayer);
        monAnim.SetBool("SauteEnAvant", isGrounded);
        force.x += gravity * Time.deltaTime;

        if (isGrounded)
        {
          
            if (Input.GetKeyDown(KeyCode.LeftAlt))
            {
                //monRB.AddForce(force);
                force.x = SautEnAvant;
            }


        }


    }

}

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

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

Message par djulio74 » 05 Juin 2020 07:08

Je ne vois pas pourquoi tu assigne force.x avec la gravité ?
La gravité influe uniquement sur l'axe vertical soit l'axe Y.
Pour faire un saut en avant il faut que force soit différent de zéro en x (avant) Et en y (haut).

Vraiment pour ce que tu veux faire refaire le component FPS controler de unity. Tu te prend la tête pour quelque chose qui est compris de base.

Tu ajoute le. Component à ton perso, ensuite fzire un script qui tiens en même pas 10lignes je pense donnera tout les mouvement que tu veux à ton perso. Regarde dans la doc il y a un très bon exemple. Après à toi de l'adapter pour le comportement voulu.

Édit : pardon, le character controler et non FPS controler

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

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

Message par Derek82 » 05 Juin 2020 11:10

Merci djulio74 !

Oui la gravité n'a rien à faire dans le saut en avant (encore que j'imaginais que le saut pouvait etre un peu vertical quand même en plus de la poussée en avant). je me suis un peu emmêlé les pinceaux.
Vraiment pour ce que tu veux faire refaire le component FPS controler de unity. Tu te prend la tête pour quelque chose qui est compris de base.

Tu ajoute le. Component à ton perso, ensuite fzire un script qui tiens en même pas 10lignes je pense donnera tout les mouvement que tu veux à ton perso. Regarde dans la doc il y a un très bon exemple. Après à toi de l'adapter pour le comportement voulu.

Édit : pardon, le character controler et non FPS controler
Mais j'en ai un, c'est ce qui m'a été conseillé plus haut et que j'ai suivi : j'ai refait tout les mouvements du personnages en l'utilisant mais je n'ai rien dedans qui soit de base pour mon saut en avant dans le composant, ou alors je ne vois pas ? Du coup je suis bien obligé de completer par un script, non ?

Image

Répondre

Revenir vers « Scripting »