[RESOLU] [DB-AL] Animation JavaScript

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] Animation JavaScript

Message par CreamyDelux » 21 Mai 2016 15:53

Salut a tous,
Je suis actuellement sur un jeu de plateforme, comme la plupart des jeux de ce type j'aimerai que certaines pièces de monnaies puissent se déplacer de gauche a droite par exemple.

Dans un premiers temps j'ai créé l'animation avec la fenêtre Animation. Mais lorsque j'ai voulu mettre l'animation sur tout les pièces a animer, je me suis rendu compte que les valeur de position étaient enregistrés, j'ai compris que je devrais faire une animation pour chaque pièce, ce qui va être assez long et surtout gourmand en ressource par rapport au rendu.

Du coup, je me suis dit que j'allais faire un script que je placerai sur les éléments a animer et ainsi écrire 1 script pour plusieurs dizaine de pièces de monnaies. J'ai donc ma pièce sur la scene avec des objet transparent qui sont Trigger et qui représentent le point A et le point B que j'ai tag respectivement Sens1 et ContreSens.

Voici mon problème, lorsque je lance la scène, la pièce se déplace avec mon point B et lorsqu'elle le touche elle s'arrête sur place au lieu de repartir dans le sens inverse. En bidouillant les valeur de vitesse je me rends compte que l'animation marche mais les valeur s'emballent. Je m'en remet donc a vos conseil pour me dire comment faire en sorte que la pièce reparte correctement vers le point A et ainsi de suite.

Voici le code en JavaScript que j'ai écrit :

Code : Tout sélectionner

#pragma strict

// GameObjects
var piece : GameObject;		//L'objet ou est placé ce script
var objetInfo : GameObject;	// L'objet percuté, ici mes point A et B

// Constante
var vitesse : int = 10;		


function AnimerPiece(){
	piece.gameObject.GetComponent.<Rigidbody>().AddForce(vitesse, 0, 0);
	print("La piece se deplace vers" + vitesse);
}

AnimerPiece();

function OnTriggerEnter(objetInfo : Collider){

	if(objetInfo.gameObject.tag == "Sens1" && vitesse < 0){
	vitesse = vitesse * -1;
	AnimerPiece();
}

	if(objetInfo.gameObject.tag == "ContreSens" && vitesse > 0){
    vitesse = vitesse * -1;
    AnimerPiece();
}
}
Merci d'avance pour votre aide.
Creamydelux
Dernière édition par CreamyDelux le 22 Mai 2016 08:51, édité 1 fois.

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

Re: [DB-AL] Animation JavaScript

Message par Moi 1971 » 21 Mai 2016 17:16

Bonjour,
Deux choses :
1-> La fonction "AnimerPiece()" est appelée dans ton script une fois ici :

Code : Tout sélectionner

function AnimerPiece(){
   piece.gameObject.GetComponent.<Rigidbody>().AddForce(vitesse, 0, 0);
   print("La piece se deplace vers" + vitesse);
}

AnimerPiece();

function OnTriggerEnter(objetInfo : Collider){
Cet appel doit se faire dans une fonction! Le code ne peut pas exister en dehors de fonction. Soit tu mets cette ligne dans la fonction "Start()" pour appeler la fonction "AnimerPiece()" une fois au départ. Soit tu mets cet appel dans la fonction "FixedUpodate()" pour appeler la fonction "AnimerPiece()" à intervalle régulier(quelque soit le FPS)

2-> Mets des "Degug.Log()" dans ton "Ontrigger" et dis nous ce qui s'affiche.

Code : Tout sélectionner

function OnTriggerEnter(objetInfo : Collider){

   Debug.Log("objetInfo.gameObject.tag = "+objetInfo.gameObject.tag);
   Debug.Log("vitesse  = "+vitesse );
   
   if(objetInfo.gameObject.tag == "Sens1" && vitesse < 0){
   vitesse = vitesse * -1;
   AnimerPiece();
}

   if(objetInfo.gameObject.tag == "ContreSens" && vitesse > 0){
    vitesse = vitesse * -1;
    AnimerPiece();
}
}
PS : "vitesse" n'est pas une constante mais une variable.

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

Re: [DB-AL] Animation JavaScript

Message par CreamyDelux » 21 Mai 2016 19:38

Salut,
Du coup j'ai mit le AnimerPiece(); dans la fonction Start.

J'ai mit les Debug.Log() comme tu m'a conseillé et voila exactement ce que me renvoi la console :

objetInfo.gameObject.tag = ContreSens
UnityEngine.MonoBehaviour:print(Object)
AnimPiece:OnTriggerEnter(Collider) (at Assets/AnimPiece.js:22)

vitesse = 10
UnityEngine.MonoBehaviour:print(Object)
AnimPiece:OnTriggerEnter(Collider) (at Assets/AnimPiece.js:23)

objetInfo.gameObject.tag = ContreSens
UnityEngine.MonoBehaviour:print(Object)
AnimPiece:OnTriggerEnter(Collider) (at Assets/AnimPiece.js:22)

vitesse = -10
UnityEngine.MonoBehaviour:print(Object)
AnimPiece:OnTriggerEnter(Collider) (at Assets/AnimPiece.js:23)

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

Re: [DB-AL] Animation JavaScript

Message par Moi 1971 » 21 Mai 2016 20:22

Et donc? Tu ne vois où est le problème?
Premier contact :
tag = ContreSens
vitesse = 10
Donc ton code passe dans le deuxième if, inverse la vitesse.
Deuxième contact :
tag = ContreSens
vitesse = -10

"tag" ne change pas? Quand et où ce fait le deuxième contact? Si tu analyses par toi même, tu vas trouver d'où vient le problème.

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

Re: [DB-AL] Animation JavaScript

Message par CreamyDelux » 22 Mai 2016 08:20

Salut,

J'ai un peu de mal a comprendre. Enfait au début de ma scène la pièce est placée entre mes Trigger. J'ai oublié de dire que j'ai un autre script qui est placé sur cette meme pièce et qui lui permet de faire une rotation sur elle meme.

Enfait ContreSens ne change pas car la pièce n'a pas le temps d'aller vérifier mon point A puisqu'elle s'arrête sur place. La deuxième interaction que me renvoi la console est toujours celle de la pièce avec le point B étant donné qu'elle s'arrête au niveau du point B, la rotation de la pièce fait qu'elle rentre dans le point B chaque 180° de rotation. Si je laisse la scène se dérouler je remarque bien que la console me renvoi le message a chaque demi tour de la pièce sur elle même et donc a chaque collision avec mon point B.

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

Re: [DB-AL] Animation JavaScript

Message par Moi 1971 » 22 Mai 2016 08:38

Bonjour,
Tes explications sont claires. Mais je n'arrive pas à saisir si tu as toujours un problème ou non? Ta pièce fait bien des aller/retour, non?

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

Re: [DB-AL] Animation JavaScript

Message par CreamyDelux » 22 Mai 2016 08:50

Salut,

Enfait non justement, la pièce fait un arrêt sur elle meme au moment ou elle touche le point B. Elle fait donc 1 aller et pas de retour.

En mettant des Debug.Log(); de partout et en inversant les vitesse, je me suis rendu compte que la console me renvoi toujours les bonne valeurs, j'ai remarqué qu'il lui manque juste l'impulsion pour repartir.

Enfait c'est comme si ma fonction AnimerPiece(); fait faire un arrêt net a ma pièce. Du coup j'ai appelé ma fonction une deuxième fois juste après la première et la un miracle s'est produit !! Aller retour a gogo !!

Voici un bout de code pour mieux comprendre :

Code : Tout sélectionner

function OnTriggerEnter(objetInfo : Collider){

	if(objetInfo.gameObject.tag == "Sens1" && vitesse < 0){
	vitesse = vitesse * -1;
	AnimerPiece();	
	AnimerPiece();
}
Mon problème est donc résolu. Merci énormément a Moi 1971 pour ton aide, c'est souvent toi qui me permet de comprendre mes problèmes.

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

Re: [RESOLU] [DB-AL] Animation JavaScript

Message par Moi 1971 » 22 Mai 2016 10:04

Attention!
Tu as identifié le problème, c'est super. Est ce que tu comprends pourquoi tu dois utiliser deux ".AddForce(vitesse, 0, 0);" de suite?
Au départ ta pièce se déplace a une vitesse de 10 sur l'axe des x. Puis, tu fais un AddForce.x = -10
La vitesse sur x étant déjà à 10 on a :10 - 10 = 0. Ta pièce s’arrête sur elle même, il n'y a plus de force pour la bouger. En suite tu rajoutes un AddForce.x = -10 pour la faire se déplacer. On a la vitesse sur x à 0 => 0 - 10 = -10. Ta pièce se déplace.
Après, il se passe la même chose en symétrique sur l'autre point.
Premier AddForce.x = 10 => -10 + 10 = 0
Deuxième AddForce.x = 10 => 0 +10 = 10

Ça semble bien compliqué pour juste faire un demi tour à une pièce...

PS : Si ton problème est résolu, édite ton premier poste et modifies le titre pour y rajouter [Résolu]

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

Re: [RESOLU] [DB-AL] Animation JavaScript

Message par CreamyDelux » 22 Mai 2016 10:58

Oui j'ai très bien compris.

En mettant des Debug.Log() sur presque chaque ligne j'ai compris qu'elle s'arrête car elle passe a 0 et qu'il lui manquais donc une nouvelle impulsion.

Quand tu dit, sa a l'air bien compliqué pour un simple aller retour ... Tu veut dire qu'il y a une solution d'arriver a mes fin de façon plus simple ?

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

Re: [RESOLU] [DB-AL] Animation JavaScript

Message par Moi 1971 » 22 Mai 2016 16:15

J'ai pas regardé sur le net pour voir s'il n'y avait pas des tutos sur le sujet. Je pense que tu l'as fait de ton côté. Et puis si pour toi c'est bon, il n'y a pas forcément besoin de changer.
Le seul point que tu peux optimiser facilement c'est le double appel à la fonction "AnimerPiece()"
Tu pourrais créer une fonction "RetournerPiece()" qui ferait le travail en une fois, et utiliser "AnimerPiece()" que pour l'animer.

Code : Tout sélectionner

function RetournerPiece(){
   piece.gameObject.GetComponent.<Rigidbody>().AddForce((vitesse+vitesse), 0, 0);
   print("La piece se deplace vers" + vitesse);
}
En suite, le code fait appel "GetComponent.<>()" sur lui même! Dans la Doc unity, il y a un exemple ici : http://docs.unity3d.com/ScriptReference ... Force.html que j'ai adapté par ça :

Code : Tout sélectionner

#pragma strict
// GameObjects
var rb_piece : Rigidbody;      //L'objet ou est placé ce script
// => Cette ligne ne sert à rien => var objetInfo : GameObject;   // L'objet percuté, ici mes point A et B

// Force de déplacement (en FLOAT et non en  INT)
var vitesse : float= 10;

function Start() {
	// Au dépar on recherche le Rigibody et on le conserve en mémoire pour ne pas avoir à le rechercher à chaque fois
	rb_piece = GetComponent.<Rigidbody>(); // Recherche son propre Rigidbody
}

function RetournerPiece() {
	rb.AddForce((vitesse+vitesse), 0, 0);
}
C'est écrit sans test mais c'est pour montrer le principe.

EDIT : Pour le float à la place du int, c'est peut-être pas une bonne idée. Le int force à avoir 10,0000000.... Le float ne te garantit pas d'avoir 10 tout rond. Il se peut qu'il y ait 10.000005 et plus tard 10.0000006. Pour une force qui doit s'annuler pile-poil, ça peut jouer.
Laisse le en int pour l'instant. Mais il faut savoir que les vecteurs utilisés ici avec les "AddForce", s'expriment en float et que c'est le compilateur qui transforme le int en float.

Verrouillé

Revenir vers « (Js) Javascript »