Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

guardar y cargar Array en unity

Iniciado por Lancelot, Noviembre 27, 2019, 04:53:28 PM

Tema anterior - Siguiente tema
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
}
}

 
 

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.

Noviembre 27, 2019, 11:02:36 PM #2 Ultima modificación: Noviembre 28, 2019, 05:15:19 AM por pioj
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 
 



   
      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 
   

[/quote]
 
creo que no puedo serializar una clase MonoBehaviour.

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

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.

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.

Cita de: iRobb date=1574962933Y 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.

Te paso la desc 
 
https://blogs.unity3d.com/es/2019/07/15/addressable-asset-system/
 
Desde luego es más sofisticado que serializar a mano, ya que soporta hasta patches sobre un objeto previamente serializado.

Etiquetas: