Jump to content
UnitySpain
Sign in to follow this  
Lancelot

guardar y cargar Array en unity

Recommended Posts

muy buenas a todos , estoy intentando guardar algunos datos de juego en unity como int, float etc , pero no se como guardar un array para despues poder cargarlo al iniciar nuevamente el juego , estoy serializando y usando la clase BinaryFormatter pero e intentado hacer lo mismo que hice con los int con un array solo que no e encontrado la forma no quiero usar Playerprefab ni Json. aqui les paso lo que si me a salido con los int.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class GameController : MonoBehaviour
{
    public  int puntos = 0;

    public int EnemigosMuertos = 0;

    public static GameController gamecontroller;
  
  [Header("Enemigos y config")]
    public GameObject [] Hazards;// ARRAY QUE QUIERO GUARDAR y VOLVER A CARGAR
  
  private void Awake()
    {
        gamecontroller = GetComponent<GameController>();
        RutaDeArchivo = Application.persistentDataPath + "/datos.dat";
    }
  
  void Start()
    {
        Cargar();//llamo al metodo para cargar los puntajes y los enemigos del array al iniciar nuevamente el juego
  }
  
  //metodos para guardar y cargar partida
  
  public void Guardar()
    {
        gamecontroller.puntos = puntos;//update puntos
        gamecontroller.EnemigosMuertos = EnemigosMuertos;//update enemydeaths
        gamecontroller.Hazards = Hazards;//update array anemy

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = new FileStream(RutaDeArchivo, FileMode.Create);

        DatosAGuardar datos = new DatosAGuardar();
        datos.puntos = puntos; // guardando puntaje
        datos.muertes = EnemigosMuertos;//guardando num enemigos muertos
        //datos.enemigos = Hazards;  //NO SE COMO GUARDARLO NO ME SALE COMO LOS DEMAS VARIABLES
        bf.Serialize(file, datos);

        file.Close();
    }
  
   void Cargar()
    {
        if (File.Exists(RutaDeArchivo)) //si existe el archivo lo carga
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(RutaDeArchivo, FileMode.Open);

            DatosAGuardar datos = (DatosAGuardar)bf.Deserialize(file);//deserializamos el archivo

            puntos = datos.puntos; // actualizamos los datos de la partida que esta guardada
            EnemigosMuertos = datos.muertes;//actualiza al enemy deaths

            file.Close();
        }
        else
        {
            puntos = 0;
        }

    }
  
  // la clase que uso
  
  [System.Serializable]
  
class DatosAGuardar 
{
    public int puntos;
    public int muertes;
    public int[] enemigos;// QUIZA ESTE MAL
}
}

 

Share this post


Link to post
Share on other sites

Tienes que copiar el contenido del array origen (entiendo que Hazards) sobre el array destino (entiendo enemigos). El Array tiene un Array.Copy para ésto. Además tienes que inicializarlo antes con "new int[(tamaño)", siendo "tamaño" como el tamaño del array origen.

Share this post


Link to post
Share on other sites

hola gracias por contestar.. me di cuenta que en la clase de abajo queria usar un array de tipo int en ves de Gameobject... entonces lo acomode asi

public void Guardar()
    {
        SaveButton.SetActive(false);
        gamecontroller.puntos = puntos;//update puntos
        gamecontroller.EnemigosMuertos = EnemigosMuertos;//update enemydeaths
        gamecontroller.Hazards = Hazards;//update array anemy

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = new FileStream(RutaDeArchivo, FileMode.Create);

        DatosAGuardar datos = new DatosAGuardar();
        datos.puntos = puntos; // guardando puntaje
        datos.muertes = EnemigosMuertos;//guardando num enemigos muertos
        datos.enemigos = Hazards;  //guardando harray de enemigos
        bf.Serialize(file, datos);

        file.Close();
    }

    void Cargar()
    {
        if (File.Exists(RutaDeArchivo)) //si existe el archivo lo carga
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(RutaDeArchivo, FileMode.Open);

            DatosAGuardar datos = (DatosAGuardar)bf.Deserialize(file);//deserializamos el archivo

            puntos = datos.puntos; // actualizamos los datos de la partida que esta guardada
            EnemigosMuertos = datos.muertes;//actualiza al enemy deaths

            Hazards = datos.enemigos; //actualiza el array de hazards

            file.Close();
        }
        else
        {
            puntos = 0;
        }

    }

}

[System.Serializable]
class DatosAGuardar 
{
    public int puntos;
    public int muertes;
    public GameObject [] enemigos;
}

y no me tiro ningun error en C# pero en el unity me dio esto 

Quote

SerializationException: Type 'UnityEngine.GameObject' in Assembly 'UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
System.Runtime.Serializ 

creo que no puedo serializar una clase MonoBehaviour.

Share this post


Link to post
Share on other sites

Los Gameobjects no son serializables. Solamente las clases puras o que crees tu propia serialización.

Share this post


Link to post
Share on other sites

Este error sucede por que no estas siguiendo un patrón de Datos->Comportamiento. 

Intenta definir que información es necesaria para guardar, por ejemplo la posición y rotación, luego deberás programar algo que se ajuste a esto.

Share this post


Link to post
Share on other sites

Y si le pegas un ojo a los Addressables verás que es mucho más fácil realizar serialización con ellos. Con los addressables puedes serializar prefabs.

Share this post


Link to post
Share on other sites
2 hours ago, iRobb said:

Y si le pegas un ojo a los Addressables verás que es mucho más fácil realizar serialización con ellos. Con los addressables puedes serializar prefabs.

Tenia entendido que Addressables es para crear reglas de construcción. Volveré a leer al respecto.

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...