[Résolu]Problème de gravité avec CharacterController
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
Re: [Résolu]Problème de gravité avec CharacterController
Ce que j'ai expliqué, comme tu le dis, c'est la physique réelle. Je n'ai pas dit d'utiliser l'accélération ni la vitesse pour déplacer un personnage. C'est bien une force qu'il faut utiliser.
Re: [Résolu]Problème de gravité avec CharacterController
Bonjour,
Tout d'abord merci pour toutes ces réponses et désolé de répondre si tard car j'ai du faire beaucoup de tests qui m'ont pris du temps.
J'ai cependant certain problèmes:
De plus, je ne comprend pas tout à fait pourquoi appliquer un mouvement perpendiculaire à la normale car si je fait ainsi, logiquement je devrai remonter la pente que j'essaie de descendre
soit réellement progressive car elle m'apparait comme aussi rapide que si je mettait simplement "= jumpSpeed" ; je pense donc que c'est à cause de t (ici: Time.time) qui doit être trop rapide pour arriver à 1 mais je ne sais pas comment le ralentir - une idée ? -
Cependant tout n'est pas perdu car j'ai fini par remettre la gravité à 9.81 sous vos conseil et tout fonctionne pour les pentes (il y a juste un léger tremblement mais j'ai aussi dissocier la caméra du personnage et on ne le remarque plus).
J'espère avoir été clair et je suis désolé de vous importuner par mon statut de débutant,
Encore merci pour vos réponses,
Pjarcos78
Tout d'abord merci pour toutes ces réponses et désolé de répondre si tard car j'ai du faire beaucoup de tests qui m'ont pris du temps.
J'ai cependant certain problèmes:
J'avoue ne pas savoir comment appliquer ce déplacementTitan a écrit :Pjarcos78 a écrit :Pourquoi à 40, tout simplement parce que si je mets une gravité plus basse le personnage saute dans les pentes lorsqu'il descend.@RLG a écrit :Juste pour comprendre, pourquoi avoir une gravité de 40 ? Normalement elle est à 9.81 non?
De plus, je ne comprend pas tout à fait pourquoi appliquer un mouvement perpendiculaire à la normale car si je fait ainsi, logiquement je devrai remonter la pente que j'essaie de descendre
C'est là dessus que j'ai fait pas mal de tests et qui ne sont finalement pas très concluants, je n'arrive pas à ce que la vitesse appliqué grâce àIwa a écrit :Je sais pas si ça résoudra ton soucis mais du coup pour ton soucis courant tu pourrais utilisé un Mathf.LerpPjarcos78 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)
http://docs.unity3d.com/ScriptReference/Mathf.Lerp.html
Ca permet de modifier une valeur progressivement jusqu'à ce qu'elle atteigne son seuil
Code : Tout sélectionner
moveDirection.y = Mathf.Lerp(0,jumpSpeed,Time.time);
Là par contre je n'ai pas fait de test du tout car je n'ai pas bien -voir pas du tout- compris le code (en plus de coder en javascript, je suis encore un trop gros débutant pour comprendre les fonctions utilisé ici ).Titan a écrit :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:
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.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 voit bien apparaitre force => vitesse => position
Cependant tout n'est pas perdu car j'ai fini par remettre la gravité à 9.81 sous vos conseil et tout fonctionne pour les pentes (il y a juste un léger tremblement mais j'ai aussi dissocier la caméra du personnage et on ne le remarque plus).
J'espère avoir été clair et je suis désolé de vous importuner par mon statut de débutant,
Encore merci pour vos réponses,
Pjarcos78
Re: [Résolu]Problème de gravité avec CharacterController
Bonjour,
En faisant des recherches sur internet et beaucoup de test j'ai fini par régler mon problème, je ne pense pas que ce soit la meilleure solution mais je n'ai pas trouvé mieux :
Le mouvement est donc plutôt fluide et je pourrais mettre toute ces lignes de codes dans une fonction pour que ce soit plus lisible.
Dites-moi ce que vous en pensez,
Pjarcos78
En faisant des recherches sur internet et beaucoup de test j'ai fini par régler mon problème, je ne pense pas que ce soit la meilleure solution mais je n'ai pas trouvé mieux :
Code : Tout sélectionner
var jumpSpeed:float;
var smooth:float;
var jumpTime:float;
private var jump:boolean;
private var currentTime:float;
[...]
//Saut
if(Input.GetKeyDown(KeyCode.Space)){
jump = true;
currentTime = Global.fixedTime;
}
if(currentTime + jumpTime < Global.fixedTime){
jump = false;
}
if(jump){
moveDirection.y = Mathf.Lerp(0,jumpSpeed,Global.deltaTime * smooth);
}
Dites-moi ce que vous en pensez,
Pjarcos78