Conseils 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

Conseils JavaScript

Message par CreamyDelux » 02 Mars 2016 18:13

Bonjour,

Après plusieurs recherche sur le net et plusieurs visionnage de vidéo, je ne trouve pas la solution pour avoir mon script fonctionnel

Voila le principe : J'ai un canon sur une île, une tour sur une autre île, le but étant que quand le boulet du canon touche la tour.
Je veut que quand le boulet touche la tour une premiere fois, il lui enlève 1 point de vie et lance l'effet1. Je veut qu'au 2eme boulet de canon la tour perde encore 1 point de vie et lance l'effet2 enfin je veut que le troisième boulet lance l'effet3 et détruise la tour.

Pour plus de facilité j'ai tague "red" l'objet dont je veut qu'il soit transpercé

Après plusieurs tentative j'ai le code suivant en javascript

Code : Tout sélectionner

var objetInfo : GameObject;
var effet1 : Transform;
var effet2 : Transform;
var effet3 : Transform;
var vie : int = 3;

function OnTriggerEnter(objetInfo : Collider){
	
	if(objetInfo.gameObject.tag == "red") {
	if(vie == 3)
	Instantiate(effet1, transform.position, transform.rotation);
	vie -= 1;
	
	print (vie);
	
}

	if(objetInfo.gameObject.tag == "red") {
	if(vie == 2)
	Instantiate(effet2, transform.position, transform.rotation);
	vie -= 1;
	
	print (vie);
	
}

	if(objetInfo.gameObject.tag == "red") {
	if(vie == 1)
	Instantiate(effet3, transform.position, transform.rotation);
	vie = 0;
	Destroy(...)
	
	print ("Vous avez gagné !");
	
	}
}	
(Balises 'Code' SVP)

Au niveau de la scene, le boulet déclenche bien la perte de 1 point de vie, et il déclenche aussi l'effet1 qui est un effet de fumée.
En revanche lorsque je tire le second boulet, il n'y a pas de perte de point de vie et l'effet2 qui est un effet de flamme ne se lance pas.
De plus, j'ai du mal a savoir comment indiquer a mon script que je veut qu'il détruise la tour après le troisième boulet d'ou le Destroy(...)

Je travaille depuis peu sur Unity
J'imagine donc que le script doit être tout simple et pourtant je suis dessus depuis un bon moment

A défaut d'y arriver je me tourne vers vous. D'avance Merci !
CreamyDelux

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

Re: Conseils JavaScript

Message par Moi 1971 » 02 Mars 2016 18:25

Si le script est sur le boulet?
Tu as oublié des {} pour tes if.. tu répètes les mêmes tests sur les tag.. inutile une fois suffit.

Code : Tout sélectionner

var objetInfo : GameObject;
var effet1 : Transform;
var effet2 : Transform;
var effet3 : Transform;
var vie : int = 3;

function OnTriggerEnter(objetInfo : Collider){

if(objetInfo.gameObject.tag == "red") {
	if(vie == 3){
		Instantiate(effet1, transform.position, transform.rotation);
		vie -= 1;
	}
	if(vie == 2){
		Instantiate(effet2, transform.position, transform.rotation);
		vie -= 1;
	}

	if(vie == 1){
		Instantiate(effet3, transform.position, transform.rotation);
		vie = 0;
		objetInfo.destroy... un truc du genre
		print ("Vous avez gagné !");
	}
	print (vie);

}// FIN DE if(objetInfo.gameObject.tag == "red") {


}// FIN DE function 

 
Pour le destroy je ne connais pas javaScript, mais il faut y accéder par "objetInfo."

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

Re: Conseils JavaScript

Message par CreamyDelux » 02 Mars 2016 18:42

Bonsoir,

Merci pour ta réponse rapide.
Oui le script est sur le boulet désolé j'ai oublié de préciser.

Merci pour les précisions que tu a put me donner

J'ai fait un copié collé du script que tu ma donné, le problème c'est que les 3 effet se lance maintenant en meme temps, des le premier boulet et les points de vie de la tour descendent directement à 0 :/

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

Re: Conseils JavaScript

Message par Moi 1971 » 02 Mars 2016 18:51

Forcément... tu ne détruits pas le boulet quand il touche la tour.. il rentre dans la tour, enlève un point, il est toujours dans la tour, enlève un autre point, il est encore dans la tour et enlève le dernier point...

Pour détruire boulet et Tour => http://docs.unity3d.com/ScriptReference ... stroy.html

avec ça peut-être

// Kills the game object
Destroy (gameObject);

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

Re: Conseils JavaScript

Message par Moi 1971 » 02 Mars 2016 18:55

CreamyDelux a écrit : J'ai fait un copié collé du script que tu ma donné,
FAUT PAS ! Je ne connais pas le javaScript (enfin si, mais pas autant que le C#) J'ai copié collé ton code juste pour les erreurs de {}.. mais la série de if n'est pas bonne.. il faut, soit faire un

Code : Tout sélectionner

switch (expression) {
  case valeur1:" ...
ou faire une série de if else... à toi de trouver la bonne solution

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

Re: Conseils JavaScript

Message par CreamyDelux » 02 Mars 2016 19:56

J'ai réfléchi a ce que vous m'avez dit et j'ai un petit peu bidouillé

Je dois préciser que la tour est un modele 3D importé et le Collider de base a un problème d'après Unity. J'ai alors créé une Capsule au dimension de la tour et j'ai désactivé le MeshRenderer. J'ai fait un glissé déposé de ma tour dans ma capsule. Seule la capsule est Trigger et seule la capsule et tag "red".
J'ai deja un script sur mon boulet qui l'autodétruit au bout de 1 sec, cad juste au moment de l'impact.

Du coup mon boulet se détruit pile en meme temps que ma tour donc logiquement il ne devrait déclenché qu'une animation et ne retirer qu'un seul point

J'ai essayé une sérié de else if de tout les façon que je pouvais faire mais sa me remet a la situation de depart a savoir le premier point et retiré le premier effet lancé et puis le second boulet lance le meme effet et ne retire pas de point

Désolé mais je suis débutant en programmation et je ne connais pas la fonction

switch (expression) {
case valeur1:" ...
Je ne sait ni se qu'elle représente ni comment l'utiliser.
Je pense que c'est l'ultime solution ^^

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

Re: Conseils JavaScript

Message par Moi 1971 » 02 Mars 2016 20:07

Code : Tout sélectionner

if(objetInfo.gameObject.tag == "red") {
   if(vie == 3){
      Instantiate(effet1, transform.position, transform.rotation);
      vie -= 1;
   } else    if(vie == 2){
      Instantiate(effet2, transform.position, transform.rotation);
      vie -= 1;
   }else  if(vie == 1){
      Instantiate(effet3, transform.position, transform.rotation);
      vie = 0;
      objetInfo.destroy... un truc du genre // ICI IL FAUT DÉTRUIRE LA TOUR
      print ("Vous avez gagné !");
   }
   print (vie);
  // ICI IL FAUT DÉTRUIRE LE BOULET !!!
}// FIN DE if(objetInfo.gameObject.tag == "red") {
Il faut détruire le boulet quand il rentre en contact.. tu peux laisser la destruction du boulet au bout de 1 seconde en plus de la destruction du boulet quand il rentre en contacte avec la tour... La partie de ton code avec les if est exécutée plusieurs fois par seconde (voir dizaine de fois pas seconde).
Imagine, tu tir ton boulet, il rate la tour, au bout de une seconde il est détruit. Il rentre en contact avec la tour au bout de 0.5 seconde, il lui reste 0.5 seconde de vie. Largement suffisant pour passer des dizaines de fois dans ta série de if.
De plus tu devrais inverser les if, pour tester en premier vie == 1, puis vie == 2 et en dernier vie == 3.

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

Re: Conseils JavaScript

Message par CreamyDelux » 02 Mars 2016 20:42

Je comprends effectivement ce que tu veut me dire par rapport au boulet. En gros meme si je le vois disparaitre il y a tellement de FPS qu'il touche encore ma tour et déclenche l'action suivante.

J'ai essayé le code que tu ma montré en inversant les if pour tester la vie. Sa ne marche toujours pas :(

Code : Tout sélectionner

 var objetInfo : GameObject;
var effet1 : Transform;
var effet2 : Transform;
var effet3 : Transform;
var vie : int = 3;
var boulet2 : GameObject;
 

function OnTriggerEnter(objetInfo : Collider){

	if(objetInfo.gameObject.tag == "red") {
    if(vie == 1){
       Instantiate(effet3, transform.position, transform.rotation);
       Destroy(objetInfo.gameObject);
       print ("Vous avez gagné :");
   	   Destroy (boulet2.gameObject);

}   
   
   		else if(vie == 2){
        Instantiate(effet2, transform.position, transform.rotation);
        vie -= 1;
        print(vie);
        Destroy(boulet2.gameObject);
   
}
  
   	 		 else if(vie == 3){
    	     Instantiate(effet1, transform.position, transform.rotation);
        	 vie -= 1;
      		 print (vie);
  
}
  				Destroy(boulet2.gameObject);
  				
	}
}
Deuxième fois ce soir que je dois m'occuper des balises codes à ta place.
Le prochain message sans effort de ta part passe à la trappe

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

Re: Conseils JavaScript

Message par Moi 1971 » 02 Mars 2016 21:26

Qu'est ce qui ne marche pas? Le boulet se détruit-il?
Sinon :
..qu'il touche encore ma tour et déclenche l'action suivante.
Normalement non parce que tu utilises "OnTriggerEnter()" qui ne doit se déclencher qu'une seule fois quand le boulet rentre dans le collider.. mais des fois cette fonction est appelée plusieurs fois, donc dans le doute, il faut détruire le boulet.
De plus, tu as codé en mettant 3 fois " Destroy (boulet2.gameObject);" Alors que dans mon exemple il n'apparaitre qu'une seule fois.
Écrire 3 fois la même chose complique le code. A la lecture déjà . A la compilation, ton code source sera plus gros. Et enfin pour la maintenance de ton code en cas d'évolution. Si tu dois changer cette fonction, tu devras la changer 3 fois au lieu d'une. C'est plus long et ça multiplie les risques d'erreur. Et puis enfin, ça montre que tu ne comprends pas comment "séquentiellement" ton code se déroule.
Pour comprendre comment ton code s'exécute mets des " Debug.Log(""); " un peu partout du genre :

Code : Tout sélectionner

if(objetInfo.gameObject.tag == "red") {
   Debug.Log("Dans le if : objetInfo.gameObject.tag ==  red");
   if(vie == 3){
      Debug.Log("Dans le if : vie ==3");
      Instantiate(effet1, transform.position, transform.rotation);
      vie -= 1;
      Debug.Log("Dans le if : vie = "+ vie);
   } else    if(vie == 2){
       Debug.Log("Dans le if : vie ==2");
      Instantiate(effet2, transform.position, transform.rotation);
      vie -= 1;
      Debug.Log("Dans le if : vie = "+ vie);
   }else  if(vie == 1){
      Debug.Log("Dans le if : vie ==1");
      Instantiate(effet3, transform.position, transform.rotation);
      vie = 0;
      Debug.Log("Destruction de la tour");
      Destroy(objetInfo.gameObject);
     
      print ("Vous avez gagné !");
   }
   print (vie);
  Debug.Log("Avant destruction du boulet");
  Destroy(boulet2.gameObject);
}

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

Re: Conseils JavaScript

Message par Moi 1971 » 03 Mars 2016 11:48

Je crois que quelqu'un a parlé hier soir, très justement, d'optimiser le code. A ce sujet, il faut savoir que tu vas forcément y passer et que quand tu y seras, il faudra que tu effaces tout et recommence ton code. :/
Le problème, c'est que logiquement, le boulet ne doit pas gérer la vie du château... C'est le château lui-même qui doit le faire (ou un GestionneDeJeu == GammeManager). Le boulet doit appeler une fonction qui doit être public dans le script du château. Cette fonction recevrait en paramètre le nombre de point à enlever à la variable "vie" déclarée dans le script du château.
Bon courage ;-)

Verrouillé

Revenir vers « (Js) Javascript »