[RESOLU][DB-AL] Ralentissement après un Addforce

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
CreamyDelux
Messages : 36
Inscription : 01 Mars 2016 19:44

[RESOLU][DB-AL] Ralentissement après un Addforce

Message par CreamyDelux » 30 Mai 2016 13:09

Salut a tous,
Je viens aujourd'hui avec un nouveau problème, je travaille toujours sur un jeux de plateforme. Une balle représente mon joueur. J'ai mit un script de déplacement qui marche mais qui me dérange énormément dans le sens ou lorsque j'utilise un Addforce sur ma balle, celle-ci met énormément de temps a s'arrêter. Enfait, je pense même qu'elle ne s'arrête jamais, du moins pas tant que je n'utilise pas ma flèche dans le sens opposé pour freiner la course.

Mon désir est que lorsque le joueur n'appuie plus sur le flèches directionnelles, le balle s'arrête progressivement en quelques secondes
Après plusieurs essais et des recherches infructueuse sur le net, j'ai un code qui en effet arrête la balle mais l'arrête net lorsque le joueur n'appuie plus sur la touche. Hors cet arrêt et tout de même très brutal, absolument pas progressif. Je remarque aussi que alors que les réglage du RigidBody et de la Physique sont les mêmes, la balle réagit différemment d'une scène a l'autre.

De plus, cela a fait bugguer ma fin de niveau. J'ai une porte que le joueur doit traverser, et lorsqu'il la traverse j'utilise un Addforce sur la balle pour la propulser a travers la porte et ainsi empêcher que le joueur passe la porte et revienne en arrière.

Voici mon code de déplacement de la balle :

Code : Tout sélectionner

#pragma strict

// Boolean
var Saut : boolean = false;			// Deviens true, quand le balle est en l'air.
var Push : boolean = false;			
var UnPush : boolean = true;

// Variables
static var vitesseDeplacement = 20.0;
var vitesseMaxA = 40;
var vitesseMaxB = 22;

// Component
var rb: Rigidbody;


function Start(){
	UnPush = true;
	Push = false;
	rb = GetComponent.<Rigidbody>();
	timerScript.tempsUp = false;
}

function StopBalle(){
	rb.velocity = Vector3(0,-1,0);		// J'ai du metre (0,-1,0) sinon la balle tombe très lentement en sortant du plateau de jeux.
	rb.angularVelocity = Vector3.zero;
}

function Update(){

	if(Input.GetButtonDown("Submit") && IsGrounded.IsGrounded == true && timerScript.tempsUp == false && vitesseDeplacement < vitesseMaxA){
	Push = true;
	UnPush = false;
	IsGrounded.IsGrounded = false;			 //Variable d'un autre Script qui deviens true lorsque j'appuie sur la touche ENTRER						
	GetComponent.<Rigidbody>().AddForce(0, vitesseDeplacement * 7, 0);
}

	if(Input && timerScript.tempsUp == false && IsGrounded.IsGrounded == true && vitesseDeplacement < vitesseMaxB){
	GetComponent.<Rigidbody>().AddForce(0,0, Input.GetAxis("Vertical") * 0.45 * vitesseDeplacement);
	GetComponent.<Rigidbody>().AddForce(Input.GetAxis("Horizontal") * 0.45 * vitesseDeplacement, 0, 0);
	Push = true;
    UnPush = false;
}	

	if(IsGrounded.IsGrounded == false){
	Saut = true;
} 
	if(IsGrounded.IsGrounded == true){
	Saut = false;
}
	if(Input.anyKey == false){
	UnPush = true;
	Push = false;
}
	if(UnPush == true && Saut == false){
	StopBalle();
} 
}
Je peut si besoin envoyer le code que j'utilisait précédemment et qui me permettait juste de faire avance la balle sans la stopper.
Merci d'avance de vos réponses.
Creamydelux
Dernière édition par CreamyDelux le 03 Juin 2016 07:46, édité 1 fois.

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

Re: [DB-AL] Ralentissement après un Addforce

Message par Moi 1971 » 30 Mai 2016 14:16

Bonjour,
tu utilises la physique dans Unity. Unity gère très bien la physique. Mais toi!? Est-ce que tu y comprends quelque chose? L'attraction de la terre? Isaac Newton ? La pomme? etc.. Est-ce que tu comprends?
Pour faire simple : La balle ne s’arrête pas parce qu'il n'y a aucune force qui l'oblige à s’arrêter. Dans la réalité, une balle qui roule, ralentie parce qu'il y a des frottements qui s'opposent à son déplacement (l'air à la surface de la balle, le sol, etc le tout régi par l'attraction terrestre ).
Pour ton cas, tu déplaces la balle dans la focntion Update() avec des "AddForce" qui ajoutent des forces et donc déplace la balle.
La fonction update() est appelée à intervalle régulier, et à chaque passage tu rajoute une certaine quantité de force ce qui accélère ta balle. Mais pour l’arrêter tu n'utilises pas les Addforce(). Tu utilises "velocity" qui est le vecteur vitesse résultant de la somme des 3 vecteurs forces sur les trois axes x, y et z. De plus, tu forces la "velocity" directement avec une valeur. Donc c'est normale que la balle s’arrête net! Pour ralentir le mouvement de la balle tu devrais utiliser des AddForce() en utilisant ta variable "vitesseDeplacement" avec le signe "-" . Et évidemment il faudra rajouter un test sur la vitesse de déplacement de ta balle pour que la vitesse de la balle ne passe pas en négatif et qu'elle ne reparte en arrière.

CreamyDelux
Messages : 36
Inscription : 01 Mars 2016 19:44

Re: [DB-AL] Ralentissement après un Addforce

Message par CreamyDelux » 01 Juin 2016 11:23

Salut et merci de ta réponse.
Enfait je pensait que les frotements avec le sol du a la gravité suffirait a stopper la balle.

J'ai changé mon code comme tu m'a dit en mettant des Addforce avec ma variable et non une valeur. Je me retrouve face a un autre problème, vu que le joueur n'appuie sur aucune touche au début de la scène, les valeur s'inverse vu que j'ai fait vitesseDeplacement * -1 mais du coup cela inverse aussi les touches directionnelles. Je veut dire que quand j'appuie sur avancer, je recule vu que la valeur est passé a - vitesseDeplacement. Du coup j'ai quand meme testé le script en jouant avec les flèche inversé et la balle ne s'arrête pas, elle ne ralentit pas non plus.

Je pense donc qu'il me faudrait récupérer la vitesse de l'objet et mettre un addforce qui contre cette vitesse la. Car ma variable vitesseDeplacement n'est pas la vitesse réelle de déplacement juste la force que je lui inflige a chaque frame. J'ai pas réussi a trouver de doc précise sur le fait de récupérer la vitesse d'un objet a un instant T, saura-tu peut être m'éclairer.

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

Re: [DB-AL] Ralentissement après un Addforce

Message par Moi 1971 » 01 Juin 2016 17:32

Bonjour,
Enfait je pensait que les frottements avec le sol du a la gravité suffirait a stopper la balle.
En principe Unity sait le faire. Il faut mettre les bons paramètres dans le RigidBody pour la "Mass" et "Drag". Drag est important. La doc ici explique : http://docs.unity3d.com/Manual/class-Rigidbody.html
les valeur s'inverse vu que j'ai fait vitesseDeplacement * -1
J'avais écrit :
Et évidemment il faudra rajouter un test sur la vitesse de déplacement de ta balle pour que la vitesse de la balle ne passe pas en négatif et qu'elle ne reparte en arrière.
Mais peut-être n'as tu pas besoin de "freiner" avec du code si tu mets les bons paramètres de Mass et Drag.

CreamyDelux
Messages : 36
Inscription : 01 Mars 2016 19:44

Re: [DB-AL] Ralentissement après un Addforce

Message par CreamyDelux » 02 Juin 2016 08:41

Salut,
J'ai regardé le lien que tu m'a envoyé de la doc. Du coup j'ai réussi a régler mon problème avec le Drag et AngularDrag du Rigidbody.
J'ai du coup repris le code d'origine sans le code pour freiner la balle et sa fonctionne plutôt pas mal. La balle ralentit rapidement. Donc de ce coté la tout va bien.

J'aurais aimer aller plus loin en faisant en sorte que lorsque la balle avance lentement elle s'arrête totalement. Seulement je ne sait pas trop comment tester la vitesse de la balle pour qu'elle s'arrête lorsque sa vitesse est < a 1 par exemple. Disons que je saurai émettre les conditions mais je ne sait pas récupérer la vitesse de la balle.

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

Re: [DB-AL] Ralentissement après un Addforce

Message par Moi 1971 » 02 Juin 2016 10:57

Bonjour,
il faut que tu prenne l’habitude de chercher dans la doc avant de poser une question :
ICI : https://docs.unity3d.com/ScriptReference/Rigidbody.html
Variable "Velocity"

CreamyDelux
Messages : 36
Inscription : 01 Mars 2016 19:44

Re: [DB-AL] Ralentissement après un Addforce

Message par CreamyDelux » 03 Juin 2016 07:46

Salut,
J'ai réussi a régler le problème en utilisant du coup la variable vélocity comme tu m'a dit et aussi la variable vélocity.magnitude.
J'ai eu un problème lorsque j'ai écrit ce code a savoir que des le lancement de la scène, vu que le joueur n'appuie sur aucune touche, il était impossible de mettre la balle en mouvement car l'ordinateur considérait que la velocitée était trop faible pour mettre la balle en mouvement. J'ai donc modifié mes condition afin de régler ce problème.

Je bascule le sujet en résolu. Merci pour ton aide.
A bientôt

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

Re: [RESOLU][DB-AL] Ralentissement après un Addforce

Message par Moi 1971 » 03 Juin 2016 10:20

Bravo à toi ! ;-)

Verrouillé

Revenir vers « (Js) Javascript »