[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

Moi 1971
Messages : 727
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 15:15

Bha moi je ne peux pas te donner la solution parce qu'il y en a plusieurs possibles. Je peux juste te dire ce que je fairais à ta place.

Code : Tout sélectionner

private void OnTriggerEnter(Collider other)
    {
        if (other.name == "Cube")
        {
            => EstPropulse = True;
            => Jouer animation de la propulsion
            => Jouer le son de la propulsion
            moveDirection.y = 30;           
            moveDirection.z = 1000f;          
            => //characterController.Move(moveDirection *Time.deltaTime);
            => Timer de 1 seconde pour attendre => genre "yield return new WaitForSeconds(1);"
            => EstPropulse = False;
            => Si animation de la propultion est toujours en cours => arret animation
            => Si le son de la propulsion est toujours en cours => arret du son
        }
Et dans "PlayerMouvement" création d'un booléen EstPropulse qui va servire à conditionner le mouvement du joueur

Code : Tout sélectionner

public class PlayerMouvement : MonoBehaviour
{//Camera
    ...
    ..
    .
    //Marche ou court ?
    private bool isRunning = false;
    // Propulse ou on
    public bool Estpropulse = false; // <= Attention à la portée de la variable peut-être privat fonctionnerait aussi.
    ...
    ..
    .

Et dans l'Update()

Code : Tout sélectionner

  // 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 que le joueur est propulse ou non? Si le joueur est propulsé => rien à faire; sinon :
if (!Estpropulse){
 
        //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;
        }
} // FIN DE if (!Estpropulse)
	//Applique le mouvement
        characterController.Move(moveDirection * Time.deltaTime);
        
        //Rotation de la caméra
        ...
        ..
        .
Voilà c'est comme ça que je fairais. Mais ce n'est qu'une solution pamis d'autres.
Le mieux serait que ce soit toi qui trouve la solution... Ce qui compte, ce n'est pas la destination mais le chemin. ;-)

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 » 19 Août 2022 06:55

J'ai essayé mais cela ne marchait pas au début.
J'avais l"erreur :
Erreur CS1624 Le corps de 'PlayerMouvement.OnTriggerEnter(Collider)' ne peut pas être un bloc itérateur, car 'void' n'est pas un type d'interface itérateur

Du coup, j'ai cherché un peu et j'ai vu que le probleme venait de :

Code : Tout sélectionner

yield return new WaitForSeconds(1);
Du coup, j'ai du remplacer :

Code : Tout sélectionner

private void OnTriggerEnter(Collider other)
par

Code : Tout sélectionner

IEnumerator OnTriggerEnter(Collider other)
Et la ça fonctionne à merveille.

Je vais garder ce code pour le moment car c'est exactement le résultat escompté.
De mon côté, j'avais pensé à utiliser une autre variable de déplacement dans le trigger histoire de décharger le "moveDirection".
Est ce pour toi une façon de faire ou bof ?

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

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

Message par Moi 1971 » 19 Août 2022 08:22

Cool :super:
En revanche, je n'ai rien compris à ton histoire de "autre variable" pour décharger le "move". Moi dans mon exemple j'avais mis en commentaire le "move" pour une question de cohérence et d'organisation du code => Le "move" du personnage ne doit se faire qu'à un seul endroit du code dans le "Update()". Maintenant tu peux faire des tests et voir si ça marche ou pas, faut pas hésiter. Avec des sauvegardes du projet y a pas à avoir peur de tout casser, il suffit de revenir en arrière.
Bon code.

Répondre

Revenir vers « (C#) CSharp »