Noticias

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

Clase serializable

Iniciado por Siam, Enero 19, 2017, 12:19:32 PM

Tema anterior - Siguiente tema
Buenos días.
 
Tengo una clase serializable. La intento utilizar desde otro script para agregar valores a sus propiedades.
 


[System.Serializable]
public class salvarPartida {
public static salvarPartida salPar;
public string escena;
public Vector3 checkPoint;
public salvarPartida ()
{
   escena = "";
   checkPoint = new Vector3();
}


public class save : MonoBehaviour {
 
void OnTriggerEnter2D(Collider2D col)
{
   if (col.gameObject.tag == "Player")
   {
      guardarPartida ();
   }
}
 
public void guardarPartida ()
{
   salvarPartida.salPar.escena = SceneManager.GetActiveScene().name;
   salvarPartida.salPar.checkPoint = gameObject.transform.position;
}
}

 
Pero al llegar a la linea salvarPartida.salPar.escena = SceneManager.GetActiveScene().name; me da un error.
 



   
      NullReferenceException: Object reference not set to an instance of an object
   

[/quote]
 
¿Al ser una clase serializada no deberia poder acceder directamente?
 
He probado a inicializarla
 

salvarPartida sal = new salvarPartida();

 
Pero me dice que las clases serializadas no pueden ser instanciadas. Entonces ¿por que me da el null reference exception?

Enero 19, 2017, 02:11:37 PM #1 Ultima modificación: Enero 19, 2017, 10:15:36 PM por lightbug
Hola, te recomiendo este tutorial es genial para aprender este tema bien , sencillo y completo.
 
https://unity3d.com/es/learn/tutorials/topics/scripting/persistence-saving-and-loading-data
 
En resumen lo que hace es:
 
1 - crear la clase serializable (Aca no hay monobehaviour claro). No hay razon para que sea publica, podes declararla solo con "class ..."
 
Fijate que vos colocas Vector3 , de movida no es posible serializar esa clase de datos por defecto (me refiero con C#) y Unity no ofrece nada al respecto. (Por eso empecé a usar xml). Proba solo con floats a ver si anda correctamente.
 
2 - crear en el mismo script (por comodidad y por que la clase serialziable no es public) el SaveManager, basicamente la clase que se encarga de dar la orden de guardar, vos la tenes hecha ya.
 
Un Lindo diseño seria algo asi:
 
SaveManager.cs
 

[System.Serializable]
class SaveData
{
// variables publicas
}
public Class SaveManager : Monobehaviour
{
//No lo escribo como va, si queres verlo con mas detalle chequea el tutorial
public void SaveGame()
{
   //crear el binaryformater      
   //crear archivo y abrir para escritura
      
   //instanciar el objeto de la clase serializable
   SaveData data = new SaveData();   
   // -----> Aca le pasas alos miembros de data los valores que quieras
   //Serializar
   //cerrar el archivo
}
}

 
 
 
Lo que veo en tu caso es que la clase serializable debe tener lo minimo e indispensable, ahi tenes metido un public static y un metodo tambien. Que solo esten los datos necesarios. Por experiencia te diria que un juego se hace casi pensando en el metodo de Save (por mas raro que suene xD) por eso es vital tener en cuenta el tema de los datos.
 
Otra cosa, al final, en el momento de interactuar con los datos a guardar es en la funcion SaveGame() que puse arriba, mientras tanto podes ir llevando registro de los valores a guardar en cualquier otro lugar, y en el momento de la verdad que el manager pida esos valores. Ejemplo:
 
 
 

public class Registro : Monobehaviour
{
public static float monedas = 0;
//
//   ...
//
}

 
Y en SaveGame()
 

public void SaveGame()
{
//...
SaveData data = new SaveData();
data.monedas = Registro.monedas;
//...

}

 
No creo que porque sea serializable puedas acceder desde cualquier lado, en Unity se da que las variables publicas son serializables porque el usuario las puede modificar en el inspector y quedan serializadas en la escena cuando se guardan y actualiza este.
 
Saludos

Me vino de perlas el tutorial, muchas gracias

Etiquetas: