Noticias

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

Serializar objetos( Resuelto)

Iniciado por ramunda, Septiembre 09, 2018, 11:00:23 PM

Tema anterior - Siguiente tema
Septiembre 09, 2018, 11:00:23 PM Ultima modificación: Septiembre 10, 2018, 01:47:38 PM por ramunda
Buenas a todos, sere lo mas claro posible, empece un proyecto al estilo witcher3 , un mago con echizos etc.
 
Consegui que se guardara la posición de el personaje y los valores de vida y  mana, pero ahora me encuentro que ese echizo que aprendio el personaje ayer hoy no esta aprendido porque no se guarda(canvas imagenes etc).
 
La pregunta es, alguien me da una idea de como implementar estos objetos y que se guarden como lo del mana y la vida?, mire tutos y cofeccione esto por mi cuenta satisfactoriamente.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class GameControl : MonoBehaviour
{
    public static GameControl control;
    public float vida;
    public float mana;
   
    //public GameObject ballfire;
    void Awake()
    {
        if (control == null)
        {
            DontDestroyOnLoad(gameObject);
            control = this;
        }
        else if (control != this)
        {
            Destroy(gameObject);
        }
    }
    public void Save()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat");
        PlayerData data = new PlayerData();
       
        data.vida = vida;
        data.mana = mana;
       
        bf.Serialize(file, data);
        file.Close();
    }
    public void Load()
    {
        if (File.Exists(Application.persistentDataPath + "/playerInfo.dat"))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
            PlayerData data = (PlayerData)bf.Deserialize(file);
            file.Close();
            vida = data.vida;
            mana = data.mana;
           
           
        }
 
    }
}
[System.Serializable]
public class PlayerData
{
    public float vida;
    public float mana;
    //public GameObject ballfire;
   
 
}
 

 
con esto lo llamo desde cualquier parte y me guarda los valores vida y mana, pero como meto aqui los objetos, por ejemplo el mago encuentra un libro el cual le otorga un nuevo echizo que aparece en su barra de echizos(imagenes canvas que se ativan etc)??
 
O debo de meter el script aqui dentro? usando updates y voids starts?
 
 
 
gracias de antemano

Cita de: ramunda date=1536526823La pregunta es, alguien me da una idea de como implementar estos objetos y que se guarden como lo del mana y la vida?
   

Cita de: ramunda date=1536526823con esto lo llamo desde cualquier parte y me guarda los valores vida y mana, pero como meto aqui los objetos, por ejemplo el mago encuentra un libro el cual le otorga un nuevo echizo que aparece en su barra de echizos(imagenes canvas que se ativan etc)??
   


Los gráficos no se "guardan", tendrías que tener tu lógica que automáticamente ponga o quite los elementos gráficos en base a los datos, si tenés 23 de maná aparecerá un 23 al lado del ícono de maná, si tenés el hechizo X aparecerá el gráfico X, que sale de alguna base de datos que tengas (propia del juego y no de la partida). Estas cosas ya las tenés definidas e identificadas, cuando vos tenés el hechizo X quizás figura con un dado id único (por ej un int que guardás), en la base de datos este objeto tiene icono, prefab asociado, nombre, descripción, etc, pero simplemente guardás el id. Quizás tengas permitas tener más de un hechizo, entonces decidís guardar id y cantidad por ej, y así.

Septiembre 10, 2018, 12:05:56 AM #2 Ultima modificación: Septiembre 10, 2018, 10:33:49 AM por BAMF
gracias lighbug , creo que entiendo lo que me quieres decir , y si por ejemplo tengo un libro en la pantalla que al colisionar me añade la función y el icono de lightbolt por ejemplo.
 
ese icono se queda en la pantalla y se activa un script el cuel me permite tirar ese lightball.
 
pero , si salgo de la partida ese icono y ese lighbolt no esta , solo queda guardado el mana y la vida, a eso me refiero.
 
Para guardar la partida como aun no he conseguido hacerlo con serialización lo ago asi:
 

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
 
public class Player : MonoBehaviour
{
    public float pX;
    public float pY;
    public float pZ;
 
    void Start()
    {
        // Check if the values have been saved
        if (PlayerPrefs.GetInt("Saved") == 1)
        {
            pX = PlayerPrefs.GetFloat("p_x");
            pY = PlayerPrefs.GetFloat("p_y");
            pZ = PlayerPrefs.GetFloat("p_z");
            transform.position = new Vector3(pX, pY, pZ);
            // Reset, so that the save will be used only once
            PlayerPrefs.SetInt("Saved", 0);
            PlayerPrefs.Save();
        }
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            position_save();
            Debug.Log("Save");
        }
        if (Input.GetKeyDown(KeyCode.L))
        {
            position_load();
            Debug.Log("Load");
        }
    }
    void position_save()
    {
        PlayerPrefs.SetFloat("p_x", transform.position.x);
        PlayerPrefs.SetFloat("p_y", transform.position.y);
        PlayerPrefs.SetFloat("p_z", transform.position.z);
        PlayerPrefs.SetInt("Saved", 1);
        // You need to actually save the values!
        PlayerPrefs.Save();
    }
    void position_load()
    {
        SceneManager.LoadScene("cofres");
    }
}

 
que evidentememte esto es pasajero porque no lo guarda en disco pero ese es otro tema.
 
he intentado agregar el objetoque hace esas cosas(lo del lightbol etc) el la serializacion:
 

public GameObject player;
public GameObject librofirebolt;

 
etc etc
 
y despues agegarlos al script existente:
 

public void Save()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat");
        PlayerData data = new PlayerData();
        
        data.player = player;
        data.librofirebolt= librofirebolt;
    
       
        bf.Serialize(file, data);
        file.Close();
    }

 
 
 
etc pero nada , sigue sin guardarlos :(
 
 
 
 
 
 

Cita de: ramunda date=1536530756etc pero nada , sigue sin guardarlos :(
   


No se puede serializar un GameObject por ese método, podés hacerlo con cosas simples y genericas de C# (int, string, float etc), por ej al guardar una escena en Unity sí estás serializando todo dentro de un .unity, pero eso lo hace Unity, tu herramienta es el System.Serializable y el SerializableField,  si querés algo más avanzado tenés assets que manejan esto con GameObjects y te permiten cargar/guardar los resultados en binario. Ahora tenés que pensar, para que queres guardar ese GameObject? por que mejor no guardas su posición (tres floats) y al cargarlo lo instancias (de tu base de datos)?, yo hacía esto. Empezá a pensar como hacen estas cosas los juegos y vas a ver que todo es una ilusión, pocas cosas se guardan tal cual, una por tiempos de guardado, otra puede ser por tamaño, pero en realidad supongo que se hace para aprovechar la repetitividad de la partida, dependerá del tipo de juego.

Cita de: lightbug date=1536540609No se puede serializar un GameObject por ese método, podés hacerlo con cosas simples y genericas de C# (int, string, float etc), por ej al guardar una escena en Unity sí estás serializando todo dentro de un .unity, pero eso lo hace Unity, tu herramienta es el System.Serializable y el SerializableField,  si querés algo más avanzado tenés assets que manejan esto con GameObjects y te permiten cargar/guardar los resultados en binario. Ahora tenés que pensar, para que queres guardar ese GameObject? por que mejor no guardas su posición (tres floats) y al cargarlo lo instancias (de tu base de datos)?, yo hacía esto. Empezá a pensar como hacen estas cosas los juegos y vas a ver que todo es una ilusión, pocas cosas se guardan tal cual, una por tiempos de guardado, otra puede ser por tamaño, pero en realidad supongo que se hace para aprovechar la repetitividad de la partida, dependerá del tipo de juego.
   


Gracias de nuevo lightbug , hora lo veo de otro enfoque y partire desde este punto de vista.
 
Muchas gracias por la ayuda y el tiempo.
 
Saludos cordiales!!

Etiquetas: