[RESOLU] Saut alétoires avec Rigidbody et GetkeyDown

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
Since84
Messages : 14
Inscription : 09 Avr 2021 17:04

[RESOLU] Saut alétoires avec Rigidbody et GetkeyDown

Message par Since84 » 14 Avr 2021 19:02

Bonjour à tous,

je viens vers vous car je suis en train de suivre une formation pour animer un personnage dans Unity. Tout se passe pour l'instant bien jusqu'a ce que je commence à gérer le saut chez mon personnage....

Voici les explications:

J'ai crée un script que j'ai nommé déplacement que j'attribue à mon personne. tout se passe bien pour la marche avant arrière à gauche a droite mais lorsque je demande à mon personnage de sauter.

Il y a deux cas de figure, soit il saute mais comme si il planait si j'utilise GetKey(Kecode.space) soit il ne saute pas ou de facon très aléatoire lorsque j'utilise GetkeyDown(Kecode.space).... j'ai beau marteler la touche espace il saute un fois sur 10....

La ou je ne comprends pas c'est que dans formation l'enseignant utilise GeykeyDown et cela marche à merveille....est ce que cela vient de mon code ou des paramètres ? Pour info, j'ai bien un boxcollider et un rigidbody sur mon perso.....

voici mon code

Code : Tout sélectionner

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

public class Deplacements : MonoBehaviour
{
    // Variables 
    [SerializeField] float walkSpeed = 3f, runSpeed = 8f, rotSpeed = 100f, jumpForce = 350f;
    float axeH, axeV;
    Animator anim;
    Rigidbody rb;
    private void Awake()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody>();
    }

    private void Update()
    {

        axeH = Input.GetAxis("Horizontal");
        axeV = Input.GetAxis("Vertical");

        if (axeV != 0)
        {

            if (Input.GetKey(KeyCode.LeftShift))
            {
                transform.Translate(Vector3.forward * runSpeed * axeV * Time.deltaTime);
                anim.SetBool("run", true);
                anim.SetBool("walk", false);
            }
            else
            {
                transform.Translate(Vector3.forward * walkSpeed * axeV * Time.deltaTime);
                anim.SetBool("walk", true);
                anim.SetBool("run", false);

            }

            if (axeV < 0)
                anim.SetBool("walk", false);
        }
        else
        {
            anim.SetBool("walk", false);
        }


        // Recule du personnage 
        if(axeH != 0)
        {
            transform.Rotate(Vector3.up * rotSpeed * axeH * Time.deltaTime);
        }

        //Donner le coup 1 
        if (Input.GetKey(KeyCode.Mouse0))
        {
            anim.SetBool("coup1", true);
        }
        else
        {
            anim.SetBool("coup1", false);
        }

    }

    private void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce);

        }
    }


}
Par avance merci :-D
Dernière édition par Since84 le 16 Avr 2021 00:29, édité 2 fois.

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Edrahil511 » 14 Avr 2021 20:02

Le premier truc que je vois c'est que tu as mis ton Input dans le fixed update et c'est normal que ça de ça bug, il faut que tu mette ton Input dans l'update.

La fixeUpdate est appelé à un interval de temps régulier (contrairement à l'update qui, sa fréquence d'appel dépend de la machine) Les inputs ne marche pas bien dans le fixedupdate car il me semble qu'elle n'est pas appelé assez souvent et que c'est pour cela que ton input deconne.

Since84
Messages : 14
Inscription : 09 Avr 2021 17:04

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Since84 » 14 Avr 2021 20:54

Edrahil511 a écrit :
14 Avr 2021 20:02
Le premier truc que je vois c'est que tu as mis ton Input dans le fixed update et c'est normal que ça de ça bug, il faut que tu mette ton Input dans l'update.

La fixeUpdate est appelé à un interval de temps régulier (contrairement à l'update qui, sa fréquence d'appel dépend de la machine) Les inputs ne marche pas bien dans le fixedupdate car il me semble qu'elle n'est pas appelé assez souvent et que c'est pour cela que ton input deconne.
Je vais essayer ça mais dans la formation on me dit que c’est pas très judicieux de mettre tout ce qui concerne la je cite « physique » et les rigidbody dans l’Updtate et qui vaut mieux privilégier le FixedUpdate... est ce vraiment le cas ?

Merci en tt cas ;)

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Edrahil511 » 14 Avr 2021 21:00

Oui c'est vrai j'ai dit que ton Input ne devais pas être dans le fixed update mais ton rb.addforce doit y être car comme tu dit c'est un element qui joue sur la physique donc dans le fixed update. Maintenant faut réfléchir comment tu peux faire pour que ton bonhomme saute en ayant le Input dans l'update et le rb.addforce dans le fixed update

Since84
Messages : 14
Inscription : 09 Avr 2021 17:04

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Since84 » 14 Avr 2021 21:11

Edrahil511 a écrit :
14 Avr 2021 21:00
Oui c'est vrai j'ai dit que ton Input ne devais pas être dans le fixed update mais ton rb.addforce doit y être car comme tu dit c'est un element qui joue sur la physique donc dans le fixed update. Maintenant faut réfléchir comment tu peux faire pour que ton bonhomme saute en ayant le Input dans l'update et le rb.addforce dans le fixed update
J’avoue que c’est un bon moyen de me faire travailler mes réflexes ! Je vais y réfléchir et faire des tests avant de demander la réponse merci de m’avoir un peu orienté :)

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Edrahil511 » 14 Avr 2021 21:17

Since84 a écrit :
14 Avr 2021 20:54

on me dit que c’est pas très judicieux de mettre tout ce qui concerne la je cite « physique » et les rigidbody dans l’Updtate et qui vaut mieux privilégier le FixedUpdate... est ce vraiment le cas ?

Merci en tt cas ;)
Sans trop m'étaler la dessus car je n'ai pas d'énormes connaissance mais si je ne dit pas de bêtises il n'est pas judicieux mais nécessaire de mettre ce qui concerne la physique dans le fixed update car comme dit au dessus elle est appelé à un interval de temps fixe. Ta fonction update va être exécuté un nombre de fois par seconde qui va varier tout le temps et ça pour les calculs concernant la physique, ça peut faire des trucs bizzare mais la il faudrait que quelqu'un de plus calé que moi explique de façon plus rigoureuse le phénomène.


Since84
Messages : 14
Inscription : 09 Avr 2021 17:04

Re: Saut aléatoires avec Rigidbody et GetkeyDown

Message par Since84 » 15 Avr 2021 15:42

jmhoubre a écrit :
14 Avr 2021 23:56
Voici une réponse faite il y a quelques jours sur ce sujet.
Hello effectivement ça marche a merveille, alors j'ai juste une petite question pour continuer mon apprentissage dans le code du topic ou tu expliques comment saute tu mets ceci

    private void FixedUpdate ()
    {
        // Action de saut.
        if (isJumping)
        {
            rigidBody.AddForce (Vector3.up * jumpForce);
            isJumping = false;
        }
    }
}
au debut j'avais oublié le Isjumping = false mais j'avais mis dans mon update ceci
 if (Input.GetKeyDown(KeyCode.Space))
        {
            isJumping = true;
        }else{

 isJumping = false;

}
et effectivement ca ne marchait pas du tout..... donc, pourquoi doit on mettre isJumping = false; dans le fixedUpdate ?

merci :)

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Edrahil511 » 15 Avr 2021 20:55

Ton isJumping te permet d'enregistrer le fait que tu as appuyé sur la touche espace pour faire sauter ton personnage. Tu fait sauter ton personnage quand isJumping=true donc remet cette variable à false quand tu es sûr qu'il a sauté (juste après ton rb.AddForce et pas ailleurs)


Je pense qu'il faut que tu essaye de comprendre comment se déroule ton code et ce que deviennent les variables pour saisir le truc surtout quand ce sont des morceaux de code simple comme ca. Avec ce que tu avais écris voila ce qu'il se déroule :

Tu as une update qui se fait à l'instant t et où tu appuie sur la barre espace. Celle ci rentre dans ton if et ton isJumping = true.

L'update qui vient juste après (instant t+1)passe par ton else (car c'est l'appuie de la barre espace que demande ton if et tu l'a fait à l'update précédente) donc isJumping= false

Entre l'update à l'instant t et celle à l'instant t+1 s'est écoulé un centième de millième de seconde.

Donc en gros tu fait passé ta variable isJumping à true mais immédiatement après tu la remet à false donc tu rentrera jamais dans le if(isJumping) de ton fixedUpdate car il se peut que la fonction update soit lu 5 ou 6 fois (ou je ne sais combien de fois) avant qu'un fixedUpdate soit lu.

Since84
Messages : 14
Inscription : 09 Avr 2021 17:04

Re: Saut alétoires avec Rigidbody et GetkeyDown

Message par Since84 » 16 Avr 2021 00:28

Ok je comprends tout à fait c’est une question de timing et de lecture du code. C’est très clair et très logique !

Merci bcp !

Répondre

Revenir vers « Scripting »