[RÉSOLU][MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Rhadamenthis
Messages : 52
Inscription : 17 Août 2014 01:46

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Rhadamenthis » 12 Août 2022 19:30

Du coup, faudrait que je mette le trigger sur un autre script ? Pas forcément lié au joueur ?

Moi 1971
Messages : 722
Inscription : 29 Sep 2015 13:38

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Moi 1971 » 12 Août 2022 21:56

Déplacer le code ne devrait pas être ton soucis pour le moment. Tu feras ça à la fin pour l’optimisation.
Ton problème c'est d'adapter ton code actuel. Le code est bon dans le sens où il n'y a pas de Bug. Mais fonctionnellement il ne fait pas ce que tu attends. Tu dois te poser la question de comment faire pour rajouter au code actuel la possibilité au personnage d'être propulsé sans nuire au fonctionnement du reste.

Sans vouloir te donner une solution, il y a deux approches. Soit tu adaptes les valeurs de y pour te rapprocher d'un fonctionnement correct, soit tu changes le code lui même. La première approche est la plus facile, commence par ça. Tu peux tester de remplacer la valeur "30" par "1000 f", comme pour Z (n'oublies pas le f, c'est un float) pour voir ce que ça donne. parce que si cela se trouve ça peut donner quelque chose de pas trop mal. C'est ce qu'a vu Max au début de ce poste.

Rhadamenthis
Messages : 52
Inscription : 17 Août 2014 01:46

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Rhadamenthis » 13 Août 2022 03:13

Alors, en mettant, dans mon trigger, "moveDirection.y = 1000f;", le player n'est pas encore redescendu... :-D
Il monte jusqu'à une position y à un peu plus de 24 000 puis redescend.

Moi 1971
Messages : 722
Inscription : 29 Sep 2015 13:38

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Moi 1971 » 13 Août 2022 08:51

Donc le problème n'est pas lié à l'axe y mais bien à l'axe z. Dans ton Update() le déplacement sur z est lié à Input.GetAxis("Vertical");
Est-ce que tu appuis sur la touche pour avancer pendant le saut?
Tu peux faire un debug de la valeur de speedZ pour suivre son évolution au cours du temps et ainsi comprendre ce qui se passe.

Rhadamenthis
Messages : 52
Inscription : 17 Août 2014 01:46

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Rhadamenthis » 13 Août 2022 17:46

Code : Tout sélectionner

Dans le Update, speedZ = 0
Dans le Update, speedZ = 0
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 14,16617
Dans le Update, speedZ = 13,91974
Dans le Update, speedZ = 13,64887
Dans le Update, speedZ = 13,21765
Dans le Update, speedZ = 12,88105
Dans le Update, speedZ = 12,56306
Dans le Update, speedZ = 12,07262
Dans le Update, speedZ = 11,75422
Dans le Update, speedZ = 11,28324
Dans le Update, speedZ = 10,9765
Dans le Update, speedZ = 10,51476
Dans le Update, speedZ = 10,28885
Dans le Update, speedZ = 9,957096
Dans le Update, speedZ = 9,702163
Dans le Update, speedZ = 9,521896
Dans le Update, speedZ = 9,31073[..]
Dans le Update, speedZ = 14,94995
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15[..]

Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
Dans le Trigger, moveDirection.y équivaut à la valeur 30
Dans le Update, speedZ = 15
Dans le Update, speedZ = 15
"Est-ce que tu appuis sur la touche pour avancer pendant le saut?"
Oui et speedZ égal 15 si je bouge pendant le saut

Moi 1971
Messages : 722
Inscription : 29 Sep 2015 13:38

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Moi 1971 » 13 Août 2022 19:53

Et donc ? Ton personnage avance mais il n'est pas propulsé, c'est ça?
Il y a bien dans le trigger "moveDirection.z = 1000f; " et ça n’apparaît pas les log du debug. C'est ça?
A mon avis, encore une fois, la valeur 1000 est écrasée par la valeur 15 quelques milliseconde après, ça n'a pas le temps d’apparaître dans les log parce que ton Debug est en fin de Update..
Il faut rajouter des debug :
Un au début de l'Update et un à la fin de l'update
Un au début du trigger et un à la fin
ça doit en faire 4 et donner ce genre de résultat dans les logs :
1 = Début Update, speedZ = 15
2 = Fin le Update, speedZ = 15
3 = Début Trigger, speedZ = 15
4 = Fin Trigger, speedZ = 1000
1 = Début Update, speedZ = 1000
2 = Fin le Update, speedZ = 15
1 = Début Update, speedZ = 15
2 = Fin le Update, speedZ = 15
...
..
.

Rhadamenthis
Messages : 52
Inscription : 17 Août 2014 01:46

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Rhadamenthis » 15 Août 2022 16:57

Le but n'est pas que je puisse bouger le player quand il saute mais, oui, qu'il soit propulsé au contact du Trigger

Le speedZ n'est pas reconnu dans le trigger du coup je ai du le déclarer, avant le Start, en public
"Assets\Script\PlayerMouvement.cs(161,57): error CS0103: The name 'speedY' does not exist in the current context"

Voila ou j'ai placé les debug :
Dans l'update :
-début :

Code : Tout sélectionner

 void Update()
    {
        //Calcule les directions
        //forward = avant/arrière
        //right = droite/gauche
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);

        //Est-ce qu'on appuie sur un bouton de direction ?

        // Z = axe arrière/avant
        float speedZ = Input.GetAxis("Vertical");

        // X = axe gauche/droite
        float speedX = Input.GetAxis("Horizontal");

        // Y = axe haut/bas
        float speedY = moveDirection.y;

        Debug.Log("Debut de l'Update, speedZ = " + speedZ);
-fin :

Code : Tout sélectionner

  //Applique la rotation haut/bas sur la caméra
        playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);


        //Input.GetAxis("Mouse X") = mouvement de la souris gauche/droite
        //Applique la rotation gauche/droite sur le Player
        transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * rotationSpeed, 0);
        //Debug.Log("Dans le Update, moveDirection.x équivaut à la valeur "+moveDirection.x);
        Debug.Log("Fin de l'Update, speedZ = " + speedZ);
    }
-Dans le trigger :

Code : Tout sélectionner

  private void OnTriggerEnter(Collider other)
    {
        if (other.name == "Cube")
        {
            Debug.Log("Debut du Trigger, speedZ vaut " + speedZ);
            moveDirection.y = 20f;           
            moveDirection.z = 1000f;          
            characterController.Move(moveDirection *Time.deltaTime);
            Debug.Log("Fin du Trigger, speedZ vaut " + speedZ);
        }
    }
Résultats :
Dans le trigger :
Fin de l'Update, speedZ = 9,083139
Debut du Trigger, speedZ vaut 0
Fin du Trigger, speedZ vaut 0
Debut de l'Update, speedZ = 0,5914897

Concernant l'Upate, plusieurs valeurs différentes :
Debut de l'Update, speedZ = 0
Fin de l'Update, speedZ = 0

Ensuite différentes valeurs se succédent ::
Fin de l'Update, speedZ = 0
Debut de l'Update, speedZ = 0,0330657
Fin de l'Update, speedZ = 0,4959855
Debut de l'Update, speedZ = 0,0533466
Fin de l'Update, speedZ = 0,800199...

et se stabilite à 1 et 15 :
Fin de l'Update, speedZ = 14,69793
Debut de l'Update, speedZ = 0,9960237
Fin de l'Update, speedZ = 14,94036
Debut de l'Update, speedZ = 1
Fin de l'Update, speedZ = 15
Debut de l'Update, speedZ = 1
Fin de l'Update, speedZ = 15

puis, a nouveau des valeurs :
Debut de l'Update, speedZ = 1
Fin de l'Update, speedZ = 15
Debut de l'Update, speedZ = 0,9464671
Fin de l'Update, speedZ = 14,19701
Debut de l'Update, speedZ = 0,9295534
Fin de l'Update, speedZ = 13,9433
Debut de l'Update, speedZ = 0,9152917
Fin de l'Update, speedZ = 13,72937

pour finir à 0 :
Debut de l'Update, speedZ = 0,008919737
Fin de l'Update, speedZ = 0,1337961
Debut de l'Update, speedZ = 0
Fin de l'Update, speedZ = 0
Debut de l'Update, speedZ = 0

j'ai fait au mieux pour les résultats

Moi 1971
Messages : 722
Inscription : 29 Sep 2015 13:38

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Moi 1971 » 16 Août 2022 00:41

Mince.. désolé j'ai fait une erreur en faisant un copier/coller. Ce n'était pas "speedZ" qu'il fallait débuguer mais "moveDirection.z" !!
Il faut remettre la déclaration de speedZ comme avant et changer tous les speedZ par "moveDirection.z" dans les debug.
Le but est de comprendre l'évolution de la valeur de la variable "moveDirection.z" au cours du temps et de voir combien de temps elle conserve la valeur 1000f et où elle la perd.
Et met 1 = ,2 = ,3 = et 4 = en début de débug, c'est plus lisible que "début de..."
======
1 = Début Update, moveDirection.z = 15
2 = Fin le Update, moveDirection.z = 15
3 = Début Trigger, moveDirection.z = 15
4 = Fin Trigger, moveDirection.z = 1000
1 = Début Update, moveDirection.z = 1000
2 = Fin le Update, moveDirection.z = 15
1 = Début Update, moveDirection.z = 15
2 = Fin le Update, moveDirection.z = 15
...
comme ça dans la liste des log c'est plus simple de rechercher un 3 ou un 4 noyés dans les 1 et 2

Rhadamenthis
Messages : 52
Inscription : 17 Août 2014 01:46

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Rhadamenthis » 16 Août 2022 20:37

Alors, voila grosso modo ce que j'ai obtenu (je dois faire le tri dans les 999 messages de la console...) :

1 = Debut de l'Update, moveDirection.z = 5,944254
2 = Fin de l'Update, moveDirection.z = 6,118098
3 = Debut du Trigger, moveDirection.z = 6,118098
4 = Fin du Trigger, moveDirection.z = 1000
1 = Debut de l'Update, moveDirection.z = 1000
2 = Fin de l'Update, moveDirection.z = 6,29276
1 = Debut de l'Update, moveDirection.z = 0,08760933
2 = Fin de l'Update, moveDirection.z = 0

Moi 1971
Messages : 722
Inscription : 29 Sep 2015 13:38

Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté

Message par Moi 1971 » 17 Août 2022 00:00

Donc le code récursif de l'Update prend le pas sur le code évènementiel du Trigger.
moveDirection.z = 1000 en sortie du trigger et en début de l'Update. Puis 1000 est remplacé.

1 : speedZ = Input.GetAxis("Vertical"); => Donc si le joueur n'appuie pas sur la touche avancer alors speedZ = 0f
2 : if (isRunning) => Non => speedZ = speedZ * walkingSpeed; => 0f fois 7.5f = 0f
3 : moveDirection = forward * speedZ + right * speedX; => forward fois 0f = 0f => Donc moveDirection.z = 0f

Répondre

Revenir vers « (C#) CSharp »