Serialisation et arrays
Publié : 26 Fév 2021 21:03
Bonjour à tous !
Je suis actuellement en train de concevoir un petit programme qui doit me permettre de gérer un inventaire et des configurations de vaisseaux spatiaux pour un JDR (irl).
Ca tourne bien, j'ai mes différents équipements dans l'inventaire que je peux attribuer à mon vaisseau tout ça, et actuellement j'en suis à l'étape de mettre en place un système de sauvegarde pour enregistrer l'inventaire des joueur et ce qu'il contient (en gros mon inventaire est composé de 8 arrays (1 pour chaque classe d'objets à enregistrer).
J'ai un objet Player qui contient un int et un string pour l'ID et le nom du groupe de joueur afin de pouvoir gérer différents groupes.
Jme suis donc attelé à la sérialisation pour sauvegarder tout ça dans un fichier. Lorsque je clique sur mon bouton de sauvegarde avec seulement Player à serialiser, aucun pb, je retrouve mon fichier et je vois même dedans qu'il m'a pris l'ID et le Nom du groupe.
En revanche, dès que j'ajoute l'inventaire dans l'histoire, j'ai un message d'erreur dans Unity...
Alors vous l'aurez surement deviné mais je tatonne sur Unity depuis environ 1 an (à un rythme tranquille)et en général je fini toujours par aboutir à ce que je cherchais mais du coup y a certainement des notions qui m'échappent :
Est-ce que c'est possible de serialiser de multiples arrays d'objets (j'ai vu que c'était pas possible de le faire avec des éléments propres à Unity, genre Vector3, mais pour des class customs ça me semblerait un peu abusé)?
Si non (ce qui me semblerait quand même vachement étrange) comment s'y prendre, est-ce qu'un array d'integer retenant les ID des objets contenus dans l'inventaire passerait (mais dans ce cas enregistrer un objet qui contient lui-même des objets me semble être une vraie galère)?
Si oui, est-ce que vous pourriez m'aider à comprendre ce que je fais de travers ?
le code :
inventory
MyData
SaveScript
Je suis actuellement en train de concevoir un petit programme qui doit me permettre de gérer un inventaire et des configurations de vaisseaux spatiaux pour un JDR (irl).
Ca tourne bien, j'ai mes différents équipements dans l'inventaire que je peux attribuer à mon vaisseau tout ça, et actuellement j'en suis à l'étape de mettre en place un système de sauvegarde pour enregistrer l'inventaire des joueur et ce qu'il contient (en gros mon inventaire est composé de 8 arrays (1 pour chaque classe d'objets à enregistrer).
J'ai un objet Player qui contient un int et un string pour l'ID et le nom du groupe de joueur afin de pouvoir gérer différents groupes.
Jme suis donc attelé à la sérialisation pour sauvegarder tout ça dans un fichier. Lorsque je clique sur mon bouton de sauvegarde avec seulement Player à serialiser, aucun pb, je retrouve mon fichier et je vois même dedans qu'il m'a pris l'ID et le Nom du groupe.
En revanche, dès que j'ajoute l'inventaire dans l'histoire, j'ai un message d'erreur dans Unity...
En voyant ça jme suis dit "bon ben jvais rendre Inventory serialisable" mais du coup il me fait le même coup, disant que MonoBehaviour n'est pas serialisable. Donc je retire le MonoBehaviour et... ben rien ne va plus ! (je précise que les arrays que je souhaite enregistrer peuvent contenir des lignes "vides", je sais pas si ça a une influence...)SerializationException: Type 'Inventory' in Assembly 'Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
Alors vous l'aurez surement deviné mais je tatonne sur Unity depuis environ 1 an (à un rythme tranquille)et en général je fini toujours par aboutir à ce que je cherchais mais du coup y a certainement des notions qui m'échappent :
Est-ce que c'est possible de serialiser de multiples arrays d'objets (j'ai vu que c'était pas possible de le faire avec des éléments propres à Unity, genre Vector3, mais pour des class customs ça me semblerait un peu abusé)?
Si non (ce qui me semblerait quand même vachement étrange) comment s'y prendre, est-ce qu'un array d'integer retenant les ID des objets contenus dans l'inventaire passerait (mais dans ce cas enregistrer un objet qui contient lui-même des objets me semble être une vraie galère)?
Si oui, est-ce que vous pourriez m'aider à comprendre ce que je fais de travers ?
le code :
inventory
Code : Tout sélectionner
[System.Serializable]
public class Inventory : MonoBehaviour
{
public Chassis[] hulls;
public Generateur[] generators;
public Computer[] computers;
public Propulseur[] engines;
public Equipement[] equips;
public Composant[] comps;
public SystemExploit[] systems;
public Vaisseau[] hangar; // enregistre toutes les configurations de vaisseau de l'équipage
Code : Tout sélectionner
[System.Serializable]
public class MyData
{
public int profilID;
public string groupName;
public Inventory playerInventory;
public MyData(Player Joueur, Inventory inventaire)
{
groupName = Joueur.name;
profilID = Joueur.playerID;
playerInventory = inventaire;
}
}
Code : Tout sélectionner
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public static class SaveScript
{
public static void SavePlayer(Player joueur, Inventory inventaire)
{
BinaryFormatter formatter = new BinaryFormatter();
string path = Application.persistentDataPath + "/player.strshp";
Debug.Log(path);
FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
MyData data = new MyData(joueur, inventaire);
formatter.Serialize(stream, data);
stream.Close();
}
public static MyData LoadFile()
{
string path = Application.persistentDataPath + "/player.strshp";
if(File.Exists(path))
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(path, FileMode.Open);
MyData data = formatter.Deserialize(stream) as MyData;
stream.Close();
return data;
}
else
{
Debug.LogError("fichier introuvable");
return null;
}
}
}