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;
}
}
}
Le principe:
Tous mes textes sont constitués de ceci: Le GameObject 'Texte" est juste un empty.
Voilà ce que dit l'inspector à propos de English et French: 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).