6 votes

Est-il possible de sérialiser des sprites dans unity ?

Je travaille sur des jeux qui sont censés communiquer entre eux par le biais d'un fichier. L'une des choses que j'essaie d'envoyer entre les jeux est un sprite et un audioclip mais cela ne semble pas fonctionner. J'utilise la classe suivante.

[Serializable]
class Data
{
    public Sprite spriteToSend;
    public AudioClip clipToSend;
}

J'utilise également BinaryFormatter pour enregistrer mes données comme suit

BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath +"/Data.dat");
Data data = new ;
bf.Serialize(file, data);
file.Close();

et de le charger comme suit

BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + "\\Data.dat", FileMode.Open);
Data data = (Data)bf.Deserialize(file);
file.Close();

mais quand je l'exécute, j'obtiens une erreur qui dit que les sprites et les audioclips ne peuvent pas être sérialisés.

Est-ce que je fais quelque chose de mal ou comment puis-je résoudre ce problème ?

6voto

Dmitri Veselov Points 102

Si vous voulez sérialiser, alors vous devez le faire avec la texture

public class TEST : MonoBehaviour {

[SerializeField]
Sprite m_InSprite;

SerializeTexture exportObj = new SerializeTexture();
SerializeTexture importObj = new SerializeTexture();

[ContextMenu("serialize")]
public void SerializeTest()
{
    Texture2D tex = m_InSprite.texture;
    exportObj.x = tex.width;
    exportObj.y = tex.height;
    exportObj.bytes = ImageConversion.EncodeToPNG(tex);
    string text = JsonConvert.SerializeObject(exportObj);
    File.WriteAllText(@"d:\test.json", text);
}
[ContextMenu("deserialize")]
public void DeSerializeTest()
{
    string text = File.ReadAllText(@"d:\test.json");
    importObj = JsonConvert.DeserializeObject<SerializeTexture>(text);
    Texture2D tex = new Texture2D(importObj.x, importObj.y);
    ImageConversion.LoadImage(tex,importObj.bytes);
    Sprite mySprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), Vector2.one);
    GetComponent<Image>().sprite = mySprite;
}
[Serializable]
public class SerializeTexture
{
    [SerializeField]
    public int x;
    [SerializeField]
    public int y;
    [SerializeField]
    public byte[] bytes;
}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X