J'ai des scènes avec un terrain dedans (objectif : entre 10 000 et 100 000 de scènes) (le : "je sais ... oui ... je sais ..." de CloudAtlas).
Mes terrains sont setEnabled = false;
Sur les terrains, il y a des "Objects" (parapluies, parasols, ...), chacun ont un component partagé : script ObjetMap.cs.
Ses objets ont un tag "ObjetMap".
Il n'y a pas de caméra dans mes scènes.
Sur chaque scène, j'ai un prefab, vide, où il y a un script LoadSaveScene.cs.
Pour détailler le contexte :
J'ai une scène principale qui va load (a l'intérieur d'elle même) 9 scènes autour de ma caméra.
Si la camera se déplace, les scènes ajoutées s'unload et se load en fonction de la distance autour de ma caméra.
La caméra est accroché au Player qui spawn via MLAPI.
Mon problème est de faire la 1er sauvegarde de mes GamesObjects sur mes terrains.
(après, je les supprime, et je les instances à l'ouverture InGame de la scène)
Tout cela ... ça marche un peu ... des fois ...
Donc le problème est :
1 Je souhaite faire le tour de tous mes scènes terrains (donc ouvrir chacune de mes scènes)
2 Parcourir les Objects ou GameObjects de la scène, récupérer le Transform de mes objets et les valeurs de mon script ObjetMap.
3 Pour chaque terrain mettre tout ça dans un json sauvegardé sur le disque (ou autre).
J'ai commencé par faire un script Editor qui fonctionne bien :
J'ajoute un bouton sur l'inspecteur, je clic, il envoie la fonction, la fonction ouvre terrain (après terrain), et tente de chercher mes objets.
C'est là où j'ai des problèmes : à la différence du GameObject, l'Object (on n'est pas en RunTime) n'a pas de Tag, manque cruellement de fonctions et n'est pas facile à prendre en main.
Donc, je prend tous les objets, et là, je n'ai pas trouvé comment : filtrer les objets
- soit par tag,
- soit par type,
- soit par prefab,
et encore moins récupérer le component script ObjetMap et ses valeurs ...
Y'a t-il une solution ?
Du coup, je me suis lancé dans le même type d'architecture mais en RunTime pour récupérer des GameObjects.
Mais ... C'est affreux à faire, j'ai pleins de problèmes ...
Y a t-il une solution à partir des Objets en Editor pour récupérer les valeurs d'un component ?
ou pour les filtrer ?
Voici le code :
Code : Tout sélectionner
public void RunCreationSauvegarde()
{
int compteurX = 0;
int compteurY = 0;
string nomSceneTerrain = "";
while (compteurX < NombreTuileX)
{
compteurY = 0;
while (compteurY < NombreTuileY)
{
nomSceneTerrain = PathHDD+ "Terrain_" + compteurX + "_" + compteurY + ".unity";
Debug.Log("Traitement de " + nomSceneTerrain);
EditorSceneManager.OpenScene(nomSceneTerrain);
Debug.Log("-------------------------------"+ allObjects.Length);
int compteur = 0;
// TerrainObjet : est une class conteneur simple de "ObjetMapSerial" pour créer le json.
TerrainObjet myTerrain = new TerrainObjet ();
foreach (UnityEngine.Object objet in allObjects)
{
Debug.Log("XXXXXXXXXXXXXXXXXX OBJET TROUVE : "+objet.name);
ObjetMapSerial objetConstruction = new ObjetMapSerial();
/* impossible car nous ne sommes pas sur des GameObject :
objetConstruction.PositionX= objet.GetComponent<Transform>().position.x;
objetConstruction.PositionY = objet.GetComponent<Transform>().position.y;
objetConstruction.PositionZ = objet.GetComponent<Transform>().position.z;
objetConstruction.RotationX = objet.GetComponent<Transform>().rotation.x;
objetConstruction.RotationY = objet.GetComponent<Transform>().rotation.y;
objetConstruction.RotationZ = objet.GetComponent<Transform>().rotation.z;
objetConstruction.ScaleX = objet.GetComponent<Transform>().localScale.x;
objetConstruction.ScaleY = objet.GetComponent<Transform>().localScale.y;
objetConstruction.ScaleZ = objet.GetComponent<Transform>().localScale.z;
// OBJET POSITION
///objetConstruction.Parent = objet.GetComponent<Transform>().parent; // Conteneur de l'objet (où il est
objetConstruction.PrefabNom = objet.GetComponent<ObjetMap>().PrefabNom;
objetConstruction.Auteur = objet.GetComponent<ObjetMap>().PrefabNom;
objetConstruction.DesignationPersonnel = objet.GetComponent<ObjetMap>().DesignationPersonnel; // Nom personnalisé
objetConstruction.Auteur = objet.GetComponent<ObjetMap>().Auteur; // Nom de l'auteur
// OBJET SAC A DOS
objetConstruction.Poids = objet.GetComponent<ObjetMap>().Poids;
// OBJET VIE
objetConstruction.PointsVieMax = objet.GetComponent<ObjetMap>().PointsVieMax; // Point de vie max de l'objet SAUVEGARDE
objetConstruction.PointsVieValeur = objet.GetComponent<ObjetMap>().PointsVieValeur; // Point de vie actuel de l'objet SAUVEGARDE
objetConstruction.DicoDeDegats = objet.GetComponent<ObjetMap>().DicoDeDegats; // <Type Dégats , Valeur dégats> Dégat de l'objet SAUVEGARDE
objetConstruction.DicoDeResistances = objet.GetComponent<ObjetMap>().DicoDeResistances; // <Type Résistance, Valeur résistrance> Résistance de l'objet SAUVEGARDE
// OBJET RECETTE
objetConstruction.TabRecetteSupp = objet.GetComponent<ObjetMap>().TabRecetteSupp;
objetConstruction.TabRecetteSuppNombre = objet.GetComponent<ObjetMap>().TabRecetteSuppNombre;
myTerrain.DicoObjetTerrain.Add(compteur, objetConstruction);
*/
Debug.Log("---------------"+ objet + compteur);
compteur++;
}
string sauvegardeJson = JsonUtility.ToJson(myTerrain);
File.WriteAllText(pathSaveTerrain + "\\" + "Terrain_" + compteurX + "_" + compteurY + ".json", sauvegardeJson);
Debug.Log("fin");
compteurY++;
}
compteurX++;
}
EditorSceneManager.OpenScene("Assets/Scene/EditorTools.unity");
}