[Résolu][DB-AL] remplir un Array de script de GameObjects

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

[Résolu][DB-AL] remplir un Array de script de GameObjects

Message par Pjarcos78 » 25 Août 2016 16:51

Bonjour à tous,
Simple question de curiosité, j'ai créer deux Arrays (des builtins enfait).
Je les ais remplis l'un avec une série de gameObject et l'autre avec le script attaché à chacun des objets (tous les scripts étant -à la base- identiques).
Existe-t-il un autre moyen qu'une boucle de GetComponent pour remplir le 2ème ?
Merci d'avance :mrgreen:

[EDIT] :
Mon code :

Code : Tout sélectionner

#pragma strict
private var a_objs : GameObject[4];
private var a_script_objs : MonoScript[4];


function Start () {
	//Remplir l'Array objs
	a_objs = GameObject.FindGameObjectsWithTag("Obj");
	
	//Remplir l'Array script_objs
	 for(var compte : int = 0; compte > 4; compte++);
    {
        a_script_objs[compte] = a_obj[compte].GetComponent("script");
    }

}

function Update(){
//Tester les deux Arrays
	if(Input.GetKey(KeyCode.A)){
		Debug.Log(a_objs[4].transform.name);
	}
	if(Input.GetKey(KeyCode.B)){
		Debug.Log(a_script_objs[4]);
	}
}
Mais finalement ma simple question de curiosité est devenu un problème puisqu'il m'affiche
UCE0001: ';' expected. Insert a semicolon at the end

A la ligne 2 et 3
Et si je convertis tout les builtins il me mets que
transform is note a membre of 'Object'
Dernière édition par Pjarcos78 le 31 Août 2016 09:56, édité 3 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] remplir un Array de script de GameObjects

Message par boubouk50 » 25 Août 2016 17:06

Ton code stp. Voir ce que tu fais.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Moi 1971 » 25 Août 2016 18:20

Bonjour,
Ton erreur :
UCE0001: ';' expected. Insert a semicolon at the end
Vient d'ici :

Code : Tout sélectionner

//Remplir l'Array script_objs
    for(var compte : int = 0; compte > 4; compte++);
    {
        a_script_objs[compte] = a_obj[compte].GetComponent("script");
    }
Il y a un " ; " en trop à la fin de ta ligne "for(var compte : int = 0; compte > 4; compte++);"

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Pjarcos78 » 25 Août 2016 20:19

Merci bcp, je ne savais pas qu'il ne fallait pas en mettre ici :?
Cependant il persiste avec le même erreur, toujours sur les lignes 2 et 3

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Iwa » 26 Août 2016 10:05

Salut à toi,

Alors étape par étape, je suis pas une pro javascript mais le code que tu as écris ne fonctionnera pas quoi qu'il arrive.

Explications :
Pjarcos78 a écrit :

Code : Tout sélectionner

#pragma strict
private var a_objs : GameObject[4];
private var a_script_objs : MonoScript[4];
Explication de ceci : pragma strict est une instruction pour forcer le dev à typer ces paramètres.

Comme expliquer ici : http://answers.unity3d.com/questions/20 ... trict.html il réagit au typage de retour d'une fonction ainsi qu'au typage sur les fonctions telles que GetComponent.

En lisant https://developer.mozilla.org/fr/docs/W ... trict_mode tu as des explications sur comment corriger les erreurs de mauvais code que strict lève. C'est pour ça que tu peux avoir l'erreur
transform is note a membre of 'Object'
.

Ensuite pour ton erreur de semicolon manquant c'est à cause de ta déclaration de tableau. Tu veux faire un tableau de taille 4. Soit, mais cela ne s'écrit pas comme ça en javascript.

Code : Tout sélectionner

#pragma strict
private var a_objs : GameObject[];
private var a_script_objs : MonoScript[];
Ceci te permet de créer un tableau, et de ce que je lis on s'en fiche pas mal de la taille. Si tu veux cependant une taille bien fixe, tu peux te créer une variable length et remplir ta boucle fort avec ce length en limite. CEPENDANT, je te déconseille de faire ça. Pourquoi limites-tu ce tableau à 4? Après tout, un jour il y en aura 5 ou 6 ou 12 ou 42!
Donc, ne mets pas de limites, javascript semble s'en charger tout seul.

Bon maintenant tu vas voir que ça ne compile toujours pas! Attention aux noms de tes variables, tu trouveras des erreurs. Ensuite, si ton script "script.js" existe bien et que c'est un MonoScript, tout ce monde compile à priori.

Mais ça ne marchera toujours pas. Relis bien la méthode pour faire une boucle for, il y a des erreurs dans ta compréhension ou juste une faute de frappe ;).

Et enfin le clou du pestacle :
Pjarcos78 a écrit :

Code : Tout sélectionner

function Update(){
//Tester les deux Arrays
	if(Input.GetKey(KeyCode.A)){
		Debug.Log(a_objs[4].transform.name);
	}
	if(Input.GetKey(KeyCode.B)){
		Debug.Log(a_script_objs[4]);
	}
}
Aïe! Attention aussi à bien comprendre comment fonctionne un tableau. En informatique on est un peu bizarre, on sait pas compter à partir de 1. Nous on compte à parti de 0, parce que le 0 on l'aime tu vois, c'est le début du binaire, c'est l’inséparable poto de 1! Du coup quand il y a 4 éléments dans un tableau, le dernier élement de ce tableau c'est (0, 1, 2, 3....) 3! OUI, parce que 3 est le quatrième élément (et donc le dernier). Donc pas zaper ça non plus ;).

Bon courage pour la suite, tu as toutes les clés pour finir.
"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 ;)

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Pjarcos78 » 26 Août 2016 11:08

Ouuups ... 2 mois sans coder et je mélange tout :?
Encore désolé pour le dérangement et un grand merci de m'avoir remis dans les rails !

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Pjarcos78 » 27 Août 2016 16:38

Voilà donc à quoi j'en suis arrivé (un grand merci à Iwa :-D ) :

Code : Tout sélectionner

private var a_objs : GameObject[];
private var a_script_objs : MonoScript[];


function Start () {
	//Remplir l'Array objs
	a_objs = GameObject.FindGameObjectsWithTag("Obj");
	
	//Remplir l'Array script_objs
	 for(var compte : int = 0; compte < 5; compte++){
        a_script_objs[compte] = a_objs[compte].GetComponent("script").MonoScript; //.MonoScript evite l'erreur BCE0022: Cannot convert 'UnityEngine.Component' to 'UnityEditor.MonoScript'
    }

}

function Update(){
//Tester les Arrays
	if(Input.GetKeyDown(KeyCode.A)){
		Debug.Log(a_objs[0].transform.name);
	}
	if(Input.GetKeyDown(KeyCode.Z)){
		Debug.Log(a_objs[1].transform.name);
	}
	if(Input.GetKeyDown(KeyCode.E)){
		Debug.Log(a_objs[2].transform.name);
	}
	if(Input.GetKeyDown(KeyCode.R)){
		Debug.Log(a_objs[3].transform.name);
	}
	if(Input.GetKeyDown(KeyCode.T)){
		Debug.Log(a_objs[4].transform.name);
	}
	
	if(Input.GetKeyDown(KeyCode.B)){
		Debug.Log(a_script_objs[2]);
	}
}
Aucune erreur dans la console jusqu'à ce que je lance le jeu :
NullReferenceException: Object reference not set to an instance of an object
(wrapper stelemref) object:stelemref (object,intptr,object)
Tests.Start () (at Assets/Tests.js:11)
J'en conclu que

Code : Tout sélectionner

a_script_objs[compte] = a_objs[compte].GetComponent("script").MonoScript;
est mauvais mais je ne trouve pas où.

Et enfin, comme je pouvais m'y attendre :

Code : Tout sélectionner

//Tester les Arrays
	if(Input.GetKeyDown(KeyCode.A)){
		Debug.Log(a_objs[0].transform.name);  //Retourne obj5
	}
	if(Input.GetKeyDown(KeyCode.Z)){
		Debug.Log(a_objs[1].transform.name);  //Retourne obj4
	}
	if(Input.GetKeyDown(KeyCode.E)){
		Debug.Log(a_objs[2].transform.name);  //Retourne obj3
	}
	if(Input.GetKeyDown(KeyCode.R)){
		Debug.Log(a_objs[3].transform.name);  //Retourne obj1
	}
	if(Input.GetKeyDown(KeyCode.T)){
		Debug.Log(a_objs[4].transform.name);  //Retourne obj2
	}
Existe-t-il une manière de les trier qui m'échappe ?
Merci d'avance :)

PS :
Iwa a écrit :En lisant https://developer.mozilla.org/fr/docs/W ... trict_mode tu as des explications sur comment corriger les erreurs de mauvais code que strict lève. C'est pour ça que tu peux avoir l'erreur
transform is note a membre of 'Object'
Je ne suis pas sur d'avoir tout compris, faut-t-il donc que je type par un .gameObject mon appelle du tableau alors qu'il n'est composé que de GameObject :? ?

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Pjarcos78 » 30 Août 2016 18:58

Et me revoilà après avoir pas mal bidouiller :D
J'ai donc résolu l'erreur
NullReferenceException: Object reference not set to an instance of an object
(wrapper stelemref) object:stelemref (object,intptr,object)
Tests.Start () (at Assets/Tests.js:11)
C'était bien

Code : Tout sélectionner

a_script_objs[compte] = a_objs[compte].GetComponent("script").MonoScript;
qui était mauvais mais ce n'était pas entièrement de sa faute ; j'avais mal saisi comment utiliser GetComponent pour un script en JavaScript et l'utilisation des builtins.
Ce qui nous donne après rectifications :

Code : Tout sélectionner

#pragma strict
private var a_objs : GameObject[];
private var a_script_objs : Info[];


function Start () {
   //Remplir l'Array objs
   a_objs = GameObject.FindGameObjectsWithTag("Obj");
   
   //Remplir l'Array script_objs
   a_script_objs = new Info[5];
    for(var compte : int = 0; compte < 5; compte++){
        a_script_objs[compte] = a_objs[compte].GetComponent(Info);
    }

}
Et enfin, pour trier a_obj[] j'ai trouver la fonction .Sort mais qui ne fonctionne que sur des Arrays ce qui me donne donc :

Code : Tout sélectionner

#pragma strict
private var a_objs : Array;
private var a_script_objs : Info[];


function Start () {
   //Remplir l'Array objs
   a_objs = GameObject.FindGameObjectsWithTag("Obj");
   a_objs.Sort();
   var  a_objs : GameObject[] =  a_objs.ToBuiltin(GameObject) as GameObject[]; //reconvertir en builtin
   
   //Remplir l'Array script_objs
   a_script_objs = new Info[5];
    for(var compte : int = 0; compte < 5; compte++){
        a_script_objs[compte] = a_objs[compte].GetComponent(Info);
    }

}
Mais Unity me retourne les erreurs lier au #pragma strict (à savoir Assets/Tests.js(31,38): BCE0019: 'transform' is not a member of 'Object'. )
Et sans #pragma stric, lorsque je lance le programme, il me retourne
InvalidOperationException: No IComparable or IComparable<System.Object> interface found.
J'en conclu qu'il faut donc lui fournir une fonction de comparaison mais je ne sais pas comment la remplir

Merci de votre aide fournie afin que j'arrive jusqu'ici et merci d'avance pour celle qui me ferra aller encore plus loin :mrgreen:

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

Re: [DB-AL] remplir un Array de script de GameObjects

Message par Pjarcos78 » 31 Août 2016 09:55

Et me revoilà (normalement c'est la dernière fois ;-) )
Il ne me restais qu'à trier l'Array ; j'ai trouvé une fonction qui convient au built-in et comment remplir la fonction de comparaison ce qui donne :

Code : Tout sélectionner

 System.Array.Sort(a_objs, function(g1,g2) String.Compare(g1.name, g2.name));
Pour ceux que ça intéresse, voici le script complet :

Code : Tout sélectionner

#pragma strict
private var a_objs : Array;
private var a_script_objs : Info[];


function Start () {
   //Remplir l'Array objs
   a_objs = GameObject.FindGameObjectsWithTag("Obj");
   //Le trier
  System.Array.Sort(a_objs, function(g1,g2) String.Compare(g1.name, g2.name));
   
   //Remplir l'Array script_objs
   a_script_objs = new Info[5];
    for(var compte : int = 0; compte < 5; compte++){
        a_script_objs[compte] = a_objs[compte].GetComponent(Info);
    }

}

function Update () {
//Tester les Arrays
   if(Input.GetKeyDown(KeyCode.A)){
      Debug.Log(a_objs[0].transform.name);  //Retourne obj1
   }
   if(Input.GetKeyDown(KeyCode.Z)){
      Debug.Log(a_objs[1].transform.name);  //Retourne obj2
   }
   if(Input.GetKeyDown(KeyCode.E)){
      Debug.Log(a_objs[2].transform.name);  //Retourne obj3
   }
   if(Input.GetKeyDown(KeyCode.R)){
      Debug.Log(a_objs[3].transform.name);  //Retourne obj4
   }
   if(Input.GetKeyDown(KeyCode.T)){
      Debug.Log(a_objs[4].transform.name);  //Retourne obj5
   }

 if(Input.GetKeyDown(KeyCode.B)){
      Debug.Log(a_script_objs[2]);  //Retourne obj3 (Info)
   }
}

Encore un grand merci à tous !

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

Re: [Résolu][DB-AL] remplir un Array de script de GameObjects

Message par Moi 1971 » 31 Août 2016 10:56

Merci à toi de partager ta solution. ;-)

Verrouillé

Revenir vers « (Js) Javascript »