[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

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

Message par Rhadamenthis » 08 Août 2022 16:25

Bonjour à tous,

j'en appelle encore a vos conseils d'expert.
J'ai récupéré le code de déplacement suivant :

Code : Tout sélectionner

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

public class PlayerMouvement : MonoBehaviour
{//Camera
    public Camera playerCamera;
 
    //Composant qui permet de faire bouger le joueur
    CharacterController characterController;
 
    //Vitesse de marche
    public float walkingSpeed = 7.5f;
 
    //Vitesse de course
    public float runningSpeed = 15f;
 
    //Vitesse de saut
    public float jumpSpeed = 8f;
 
    //Gravité
    float gravity = 20f;
 
    //Déplacement
    Vector3 moveDirection;
 
    //Marche ou court ?
    private bool isRunning = false;
 
    //Rotation de la caméra
    float rotationX = 0;
    public float rotationSpeed = 2.0f;
    public float rotationXLimit = 45.0f;
 
 
    // Start is called before the first frame update
    void Start()
    {
        //Cache le curseur de la souris
        Cursor.visible = false;
        characterController = GetComponent<CharacterController>();
    }
 
    // Update is called once per frame
    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;
 
 
        //Est-ce qu'on appuie sur le bouton pour courir (ici : Shift Gauche) ?
        if (Input.GetKey(KeyCode.LeftShift))
        {
            //En train de courir
            isRunning = true;
        }
        else
        {
            //En train de marcher
            isRunning = false;
        }
 
        // Est-ce que l'on court ?
        if (isRunning)
        {
            //Multiplie la vitesse par la vitesse de course
            speedX = speedX * runningSpeed;
            speedZ = speedZ * runningSpeed;
        }
        else
        {
            //Multiplie la vitesse par la vitesse de marche
            speedX = speedX * walkingSpeed;
            speedZ = speedZ * walkingSpeed;
        }
 
 
 
        //Calcul du mouvement
        //forward = axe arrière/avant
        //right = axe gauche/droite
        moveDirection = forward * speedZ + right * speedX;
 
 
        // Est-ce qu'on appuie sur le bouton de saut (ici : Espace)
        if (Input.GetButton("Jump") && characterController.isGrounded)
        {
 
            moveDirection.y = jumpSpeed;
        }
        else
        {
            moveDirection.y = speedY;
        }
 
 
        //Si le joueur ne touche pas le sol
        if (!characterController.isGrounded)
        {
            //Applique la gravité * deltaTime
            //Time.deltaTime = Temps écoulé depuis la dernière frame
            moveDirection.y -= gravity * Time.deltaTime;
        }
 
 
        //Applique le mouvement
        characterController.Move(moveDirection * Time.deltaTime);
 
 
 
        //Rotation de la caméra
 
        //Input.GetAxis("Mouse Y") = mouvement de la souris haut/bas
        //On est en 3D donc applique ("Mouse Y") sur l'axe de rotation X 
        rotationX += -Input.GetAxis("Mouse Y") * rotationSpeed;
 
        //La rotation haut/bas de la caméra est comprise entre -45 et 45 
        //Mathf.Clamp permet de limiter une valeur
        //On limite rotationX, entre -rotationXLimit et rotationXLimit (-45 et 45)
        rotationX = Mathf.Clamp(rotationX, -rotationXLimit, rotationXLimit);
 
 
        //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);
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.name == "Cube")
        {
            //moveDirection.y = 30;           
            moveDirection.z = 1000f;          
            characterController.Move(moveDirection *Time.deltaTime);
 
        }
    }
}
J'ai ajouté au script d'origine la partie concernant le trigger.
Si j'enlève les // devant le movedirection.y,

Code : Tout sélectionner

private void OnTriggerEnter(Collider other)
    {
        if (other.name == "Cube")
        {
            moveDirection.y = 30;           
            moveDirection.z = 1000f;          
            characterController.Move(moveDirection *Time.deltaTime);
 
        }
...le Player saute bien au contact du trigger
Par contre, en ce qui concerne d'avancer, il avant mais de quelques mètres seulement. Rien a voir avec le saut malgré les 2 valeurs bien différentes.
Le but est que le joueur soir propulsé vers l'avant et un peu en hauteur.
Une âme charitable peut être...
Merci d'avance

Unity 2021.3.4.1f
Windows 10
Dernière édition par Rhadamenthis le 19 Août 2022 06:56, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8677
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 08 Août 2022 18:01

Bonjour,

en règle générale on ne met pas de Collider en Trigger directement sur le player (les détections de passage se faisant au niveau de la scène), mais bon techniquement parlant, cela devrait être fonctionnel.
Ce qui m’interpelle c'est la différence de valeur entre tes deux axes, ainsi que le fait que le saut se fera toujours dans la même directions, quelque soit l'orientation de ton Player.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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 » 09 Août 2022 01:29

Ce qui m’interpelle c'est la différence de valeur entre tes deux axes
En fait, vu que mon perso n'avance pas ou peu, j'ai boosté la valeur pour voir si cela changé quelque chose...en vain.
le saut se fera toujours dans la même directions
encore une fois, c'est pour tester, je voulais voir si mon perso était bien éjecté..
Quand j'aurais trouvé la solution à ce problème, je chercherai à ce que la propulsion se fasse dans le bon sens.

J'ai suivi la formation d'Anthony CARDINAl sur Udemy (environ 60h de cours) mais ca fait quelques mois que je n'y suis plus retourné, je suis un peu rouillé 8|

Merci pour ton aide.

Avatar de l’utilisateur
Max
Messages : 8677
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 09 Août 2022 12:45

Rhadamenthis a écrit :
09 Août 2022 01:29
Ce qui m’interpelle c'est la différence de valeur entre tes deux axes
En fait, vu que mon perso n'avance pas ou peu, j'ai boosté la valeur pour voir si cela changé quelque chose...en vain.
sur l'axe des Y tu as monté la valeur ? Parce que 30, affecté par le deltaTime (à 60 fps ça fait autour de 0.16, peut-être pas totalement imperceptible :mrgreen: )
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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 » 09 Août 2022 14:55

C'est plus que perceptible.
Ci-dessous la video de ce que j'ai avec 30 :

https://youtu.be/vMe1JM-R2U8

Je me demande si l'erreur ne viendrait pas du script de déplacement et qui bloquerait "mon 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 » 10 Août 2022 09:27

Bonjour, le problème vient sûrement du fait que tu utilises "void Update()" pour déplacer ton personnage qui est appelé une fois par Frame et qui est du code exécuté séquentiellement alors que pour sauter "OnTriggerEnter" est du code qui est exécuté événementiellement . Les deux codes rentre en compétition :

"moveDirection.y = speedY;" et "moveDirection.y -= gravity * Time.deltaTime;" => 30 fois par seconde

"moveDirection.y = 30;" => 1seule fois dans le trigger

Entre 30 fois par seconde et 1 seule fois, qui gagne?

A la fin de ton "void Update()" tu pourrais afficher avec "debug" la valeur de "moveDirection.y" pour 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 » 10 Août 2022 17:20

Alors, j'en ai ajouter 2 : à la fin de l'Update et dans le trigger, histoire d'être sur.
Les résultats
Dans le Update, moveDirection.y équivaut à la valeur -0,4
Dans le Update, moveDirection.y équivaut à la valeur -0,8
Dans le Update, moveDirection.y équivaut à la valeur -7,466667
Dans le Update, moveDirection.y équivaut à la valeur -8,067908
Dans le Update, moveDirection.y équivaut à la valeur -8,217444
Dans le Update, moveDirection.y équivaut à la valeur -8,366131
Dans le Update, moveDirection.y équivaut à la valeur -8,465927
Dans le Update, moveDirection.y équivaut à la valeur -8,595341
Dans le Update, moveDirection.y équivaut à la valeur -8,689388
Dans le Update, moveDirection.y équivaut à la valeur -8,77651
Dans le Update, moveDirection.y équivaut à la valeur -8,876367
Dans le Update, moveDirection.y équivaut à la valeur -8,963849
Dans le Update, moveDirection.y équivaut à la valeur -9,043881
Dans le Update, moveDirection.y équivaut à la valeur -9,12332
Dans le Update, moveDirection.y équivaut à la valeur -9,201502
Dans le Update, moveDirection.y équivaut à la valeur -9,28055
Dans le Update, moveDirection.y équivaut à la valeur -9,35836
Dans le Update, moveDirection.y équivaut à la valeur -9,443694
Dans le Update, moveDirection.y équivaut à la valeur -9,525754
Dans le Update, moveDirection.y équivaut à la valeur -9,605414...

Les valeurs affichées en dessous correspondent toutes à -9,605414

Dans le Trigger, moveDirection.y équivaut à la valeur 30
on s'en doutait...

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 » 10 Août 2022 20:52

Dés que ton personnage est dans les airs, il n'est plus "grounded" et donc ton code séquentiel passe mainte et mainte fois pour donner la valeur 9.6 à y. La valeur évènementielle 30 n’aura été appliquée qu'une fraction de seconde avant d'être remplacée par 9.6...

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 00:42

Je suis d'accord.
Si je comprends bien, mon script de déplacement de mon player multiplié par 1000 dans le trigger se noie dans le script de déplacement géré par l'update, c'est bien ca le problème ?

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 09:11

Oui et non. Le problème réel n'est pas la quantité dans Update(). Le problème c'est l’accès à une même donnée par deux codes en même temps. C'est comme si deux programmes voulaient imprimer en même temps, l'imprimante dit non. Et bha là c'est pareil. L'Update() et le Trigger donne chacun une valeur à "moveDirection.y". Et comme cette variable ne peut être affectée que par un seul code à la fois et qu'elle "ne dit pas non", le résultat est qu'elle prend la valeur du code qui a "parlé" (qui s'est exécuté) en dernier. Et donc l'Update() prend le dessus sur le Trigger parce que l'Update() fonctionne en continu.

Répondre

Revenir vers « (C#) CSharp »