[RÉSOLU][MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté
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
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
-
- Messages : 52
- Inscription : 17 Août 2014 01:46
Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté
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.
Et dans "PlayerMouvement" création d'un booléen EstPropulse qui va servire à conditionner le mouvement du joueur
Et dans l'Update()
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.
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
}
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.
...
..
.
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
...
..
.
Le mieux serait que ce soit toi qui trouve la solution... Ce qui compte, ce n'est pas la destination mais le chemin.

-
- Messages : 52
- Inscription : 17 Août 2014 01:46
Re: [MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté
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 :
Du coup, j'ai du remplacer :
par
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 ?
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);
Code : Tout sélectionner
private void OnTriggerEnter(Collider other)
Code : Tout sélectionner
IEnumerator OnTriggerEnter(Collider other)
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 ?
Re: [RÉSOLU][MY-AL] Propulsion de joueur de quelques mètres au lieu d'être éjecté
Cool
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.

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.