[Résolu]Problème de gravité avec CharacterController

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
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
Pjarcos78
Messages : 48
Inscription : 06 Jan 2015 19:33

Re: [Résolu]Problème de gravité avec CharacterController

Message par Pjarcos78 » 24 Sep 2015 17:08

Bonjour,
C'est encore moi !
Après avoir régler le problème de la gravité, je suis confronté à un problème avec le saut : lorsque je saute en utilisant

Code : Tout sélectionner

if(Input.GetKeyDown(KeyCode.Space)){
		moveDirection.y = jumpSpeed;
	}	
je saute et retombe tout de suite se qui fait qu'il n'est pas du tout fluide !
Mes test :
J'ai d'abord pensé que cela venait de la gravité trop haute (40) donc je l'ai descendu, ça réduit un petit peu le problème mais très peu et en plus de cela je saute dans les pentes.
J'ai donc essayer de comparer avec le script du CharacterController de l'asset de base mais je ne suis pas encore assez expérimenté et je ne comprend pas ce qu'ils font.
J'ai donc questionner Google et personne n'a le même problème que moi dans mes recherches.
Pouvez vous m'éclairez SVP
Pjarcos78


Avatar de l’utilisateur
@RLG
Messages : 367
Inscription : 17 Jan 2015 00:13
Localisation : Rennes

Re: [Résolu]Problème de gravité avec CharacterController

Message par @RLG » 28 Sep 2015 11:17

Juste pour comprendre, pourquoi avoir une gravité de 40 ? Normalement elle est à 9.81 non?
Everything happens for a reason. Sometimes the reason is that you're stupid and make bad decisions.

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: [Résolu]Problème de gravité avec CharacterController

Message par Titan » 28 Sep 2015 17:55

La gravité pour un sidescroller est en général significativement augmenté. Les perso sont petits et ils font des sauts disproprotionné. C'est pourquoi une gravité plus élevé parrait en fait naturel.

Si un moveDirection.y -= gravity est fait à chaque FixedUpdate et moveDirection.y = jumpSpeed est fait lors d'un saut ça devrait marcher... si la velocité verticale n'était pas écrasé dans le calcule de la vélocité horizontale.
edit: en fait le IsGrounded empéche peut être cette bétise d'être la cause de ton probléme, mais essai quand même au cas où il soit déclencher à la frame suivante
____________________________________________
Hop Boy

Pjarcos78
Messages : 48
Inscription : 06 Jan 2015 19:33

Re: [Résolu]Problème de gravité avec CharacterController

Message par Pjarcos78 » 28 Sep 2015 18:46

J'ai beaux essayer, rien ne fonctionne.
Cependant je viens d'avoir une idée mais je ne suis pas assez bon pour la concrétiser, pourriez-vous m'aider ?
Je voudrais décomposer le saut en plusieurs parties :
1_la gravité normale est enlevée (je pensait le faire avec une variable boolean)
2_une force progressive jumpSpeed est appliquée au personnage (c'est ici que j'ai un problème c 'est pour que la force soit progressive)
3_une seconde force progressive de gravité est appliquée après celle de jumpSpeed
4_la gravité normale est remise
Qu'en pensez-vous ?

Merci de votre aide précieuse,
Pjarcos78

Pjarcos78
Messages : 48
Inscription : 06 Jan 2015 19:33

Re: [Résolu]Problème de gravité avec CharacterController

Message par Pjarcos78 » 28 Sep 2015 18:51

@RLG a écrit :Juste pour comprendre, pourquoi avoir une gravité de 40 ? Normalement elle est à 9.81 non?
Pourquoi à 40, tout simplement parce que si je mets une gravité plus basse le personnage saute dans les pentes lorsqu'il descend.

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: [Résolu]Problème de gravité avec CharacterController

Message par Iwa » 29 Sep 2015 08:45

Pjarcos78 a écrit : 2_une force progressive jumpSpeed est appliquée au personnage (c'est ici que j'ai un problème c 'est pour que la force soit progressive)
Je sais pas si ça résoudra ton soucis mais du coup pour ton soucis courant tu pourrais utilisé un Mathf.Lerp :)

http://docs.unity3d.com/ScriptReference/Mathf.Lerp.html

Ca permet de modifier une valeur progressivement jusqu'à ce qu'elle atteigne son seuil :)
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: [Résolu]Problème de gravité avec CharacterController

Message par Titan » 29 Sep 2015 11:05

Essai pas des solution tordu comme ça, au mieu tu aura un résultat bizarre au pire tu aura des bug.
Applique les forces tel que tu les a étudier en physique et tu aura un résultat réaliste: position, vitesse, force.
T'es boutons applique des forces sur la vitesse. la vitesse modifie la position.
Pjarcos78 a écrit :
@RLG a écrit :Juste pour comprendre, pourquoi avoir une gravité de 40 ? Normalement elle est à 9.81 non?
Pourquoi à 40, tout simplement parce que si je mets une gravité plus basse le personnage saute dans les pentes lorsqu'il descend.
Dans ce cas tu devrait plutot essayer d'appliquer un déplacement parralélle à la normal de ton point de contact.

Ca devrait te rapeller quelque chose:
Image
____________________________________________
Hop Boy

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

Re: [Résolu]Problème de gravité avec CharacterController

Message par Moi 1971 » 29 Sep 2015 14:11

Je suis d'accord avec Titan sur le respect des règles de physique ... mais :
T'es boutons applique des forces sur la vitesse. la vitesse modifie la position.
Non. La vitesse est le déplacement en fonction du temps. C'est une force qui peu modifier une position, pas une vitesse.
En gros, un objet est immobile quand toutes les forces qui s'appliquent en son centre de gravité s'annulent. Une force supplémentaire vient déséquilibrer le tout, il y a déplacement. Ce déplacement en fonction du temps donne la vitesse. La vitesse en fonction du temps donne l'accélération.
Dans ce cas tu devrait plutot essayer d'appliquer un déplacement parralélle à la normal de ton point de contact.
Dans la réalité et dans ton schéma, c'est perpendiculaire à la normale et non parallèle.

Pour le problème du personnage qui rebondit quand il touche le sol, c'est que l'objet "personnage" est dur comme de la pierre! Un corps humain est "mou" et donc absorbe les choques (par l’intermédiaire des tissus, muscles et articulations). Il faut garder une gravité à 9.81 comme le dit Titan. La gravité ne doit jamais changer. C'est la force appliquée au personnage qu'il faut "amortir" artificiellement pour simuler la réalité. La solution de Iwa me semble correcte.

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: [Résolu]Problème de gravité avec CharacterController

Message par Titan » 29 Sep 2015 18:56

Effectivement, Perpendiculaire à la normal. Par contre je maintient ce que j'ai dis pour l'applicaiton des forces dans un simulateur physique.
Ce que tu dit n'est pas faut d'un point de vue stictement physique mais ça risque pas d'aider l'OP beaucoup, je serais curieux de voir ton implémentation si elle différe:

Code : Tout sélectionner

CharacterController controller = GetComponent<CharacterController>();
Vector3 speed = Vector3.zero;
float moveForce = 10.0f;
float jumpSpeed = 10.0f;
float fallMaxSpeed = 10.0f;
float moveMaxSpeed = 2.0f;


void FixedUpdate()
{
   speed += GetAcceleration();
   if (Input.GetKey(KeyCode.Space) && !controller.IsGrounded)
      speed.y = jumpSpeed;
   speed = ClampSpeed(); 
   controller.Move(speed);
}

// définir la vitesse maximum de chute et de course
Vector3 ClampSpeed(Vector3  speed)
{
   speed.z = Mathf.Clamp(speed.z, -moveMaxSpeed , moveMaxSpeed);
   speed.y = Mathf.Clamp(speed.y, -fallMaxSpeed , float.MaxValue);
}

// Acceleration = somme des forces
Vector3 GetAcceleration()
{
   Vector3 output = Vector3.zero;
   if (controller.IsGrounded)
   {
      // à modifier avec la perpendiculaire à la normale
      Vector3 output += Vector3(0,0,Input.GetAxis("Vertical") * moveForce);
   }
   else
   {
      Vector3 output += Vector3(0, -gravity, 0);
   }
   return output ;
}
On remarquera le saut, qui modifie directement la vitesse plutot que de passer par une acceleration ainsi que la limitiation de vitesse, qui ne correspondent à rien de physique mais qui sont toujours présent dans les controles de jeu video.
On voit bien apparaitre force => vitesse => position
____________________________________________
Hop Boy

Verrouillé

Revenir vers « (Js) Javascript »