[MY] FindGameObjectsWithTag qui ne fonctionne pas avec certains tags ou dans certains cas

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
Litorax
Messages : 67
Inscription : 07 Juin 2017 14:59

[MY] FindGameObjectsWithTag qui ne fonctionne pas avec certains tags ou dans certains cas

Message par Litorax » 19 Avr 2018 14:28

Bonjour à tous, je me lance dans un pavé, pour un problème qui je le sens va me faire perdre des heures de travail sur mon jeu :pleur4: ...

Bon premièrement, le script:

Code : Tout sélectionner

#pragma strict

var English : GameObject[];
English = GameObject.FindGameObjectsWithTag("English");
var French : GameObject[];
French = GameObject.FindGameObjectsWithTag("French");

function Start () {

	//Définition des languages

	if (PlayerPrefs.HasKey("OptionLanguage")) {
		ChangeLanguage();
		Debug.Log("Language changed");
	}else{
		if (Application.systemLanguage == SystemLanguage.French) {
			PlayerPrefs.SetString("OptionLanguage", "French");
		}
		if (Application.systemLanguage == SystemLanguage.English) {
			PlayerPrefs.SetString("OptionLanguage", "English");
		}
		if (PlayerPrefs.HasKey("OptionLanguage") == false) {
			PlayerPrefs.SetString("OptionLanguage", "English");
		}
	}

	/////////////////////////
}

function ChangeLanguage () {
	var i = 0;

	if (PlayerPrefs.GetString("OptionLanguage") == "French") {
		i = 0;
		while (i < French.length) {
			French[i].SetActive(true);
			i += 1;
		}
	}else{
		i = 0;
		while (i < French.length) {
			French[i].SetActive(false);
			i += 1;
		}
	}

	if (PlayerPrefs.GetString("OptionLanguage") == "English") {
		i = 0;
		while (i < English.length) {
			English[i].SetActive(true);
			i += 1;
		}
	}else{
		i = 0;
		while (i < English.length) {
			English[i].SetActive(false);
			i += 1;
		}
	}

}
Voilà ce que j'utilise comme code pour gérer mes langages. Je sais que ce que je fais n'est pas forcément la meilleure méthode mais bon, tous mes textes sont déjà prêts donc je ne changerai pas.

Le principe:
Tous mes textes sont constitués de ceci:
Capture d’écran 2018-04-19 à 14.02.27.png
Capture d’écran 2018-04-19 à 14.02.27.png (5.44 Kio) Consulté 2629 fois
Le GameObject 'Texte" est juste un empty.

Voilà ce que dit l'inspector à propos de English et French:
Capture d’écran 2018-04-19 à 14.02.35.png
Capture d’écran 2018-04-19 à 14.02.35.png (40.5 Kio) Consulté 2629 fois
Capture d’écran 2018-04-19 à 14.02.43.png
Capture d’écran 2018-04-19 à 14.02.43.png (43.11 Kio) Consulté 2629 fois
Vous l'aurez compris, le principe est simple:
Mes textes en français ont le tag "French" et en anglais "English". Au démarrage je désactive les textes qui ne sont pas dans la langue choisie.

Avec exactement ce code, tout marchait parfaitement... mais je me suis rendu compte que c'était uniquement lorsque je lançais la scène directement après play. Si je la redémarrais, que j'allais sur le menu ou que je démarrais le jeu depuis le menu... les variables French et English ne trouvaient aucun tag correspondant. Je n'y comprenais rien. Et un jour après (aujourd'hui) plus rien ne marche, même quand je démarre depuis ma scène de jeu, aucun GameObject avec le tag "French" ou "English" n'est trouvé. Si je cherche avec le tag" Audio" (que j'utilise pour mes audios ^^) dans le même code, il va bien désactiver tous les audios, et la liste est remplie. Mais avec les tags French et English de mes textes il ne se passe rien.

Alors ce ne sont pas les tags qui ne vont pas car si je remplace le tag "Audio" de mes audios par "English" la variable English va se remplir avec mes audios...

Alors qu'est-ce que ça peut bien être ?

Bon en écrivant ce post j'ai fait des tests:
Quand mon text English est en dehors de mon canvas, le tag marche, dedans aussi, mais le truc c'est qu'après je le mets dans un empty nommé "Menu". Je me demandais si le FindGameObjectWithTags marchait sur des objets inactifs, malheureusement non. Mais Menu n'est pas inactif, il est désactivé au démarrage par un autre script. Je me demande donc si cet autre script n'est pas effectué avant mon script languages et désactive Menu avant que le FindGameObjectWithTags ne cherche mes textes. J'ai clairement trouvé une solution d'une manière dont je suis plutôt fier pour un p'tit dev de niveau intermédiaire comme moi. Au début de ce post, je n'avais pas la solution. Pour vous aider (et ne pas avoir écrit ça pour rien, je vous donne la solution):

Si vous utilisez (ou voulez utiliser) la même technique que moi pour vos langages et que vos menus se désactivent au démarrage, dans votre fenêtre project, sélectionnez le script qui gère vos langues et en haut dans l'inspector cliquez sur Execution Order. Glissez votre script Languages juste avant Default Time et il s'exécutera en premier, et donc avant que les autres scripts désactivent vos menus. Ceci pourra aussi vous (et me) servir si comme moi vous mélangez parfois JavaScript et C#, car pour accéder aux variables de certains scripts de C# à JS l'exécution order peut aider (si je dis pas de conneries).
Pourquoi essayer de comprendre si on ne sait pas ce que l'on cherche ?

Verrouillé

Revenir vers « (Js) Javascript »