Aquí la demostración con un demo: Link al demo
Aquí el link al proyecto para que analicen como está hecho : Link al proyecto
Debido a que el demo es web y no me deja guardar archivos en el computador del usuario, usé 2 métodos de serialización que vimos en el articulo pasado, PlayerPrefs y JSON.
Si por alguna razón no puedes abrir el proyecto, o por algún otro inconveniente dejaré el script más importante escrito aquí y lo dejaré comentado paso a paso:
using UnityEngine;
using UnityEngine.SceneManagement;
public class PlayerPosition : MonoBehaviour {
//llave usada para guardar los datos en PlayerPrefs
const string PositionKey = "PlayerPosition";
void OnGUI ()
{
//Titulo del demo
GUILayout.Label("Serialization Example");
//Espacio en la GUI
GUILayout.Space(20);
//Instrucciones para mover el control
GUILayout.Label("Use WASD or arrow keys to move");
//Botón que llama al método de guardar posición
if (GUILayout.Button("Save Position",GUILayout.Width(120)))
{
SavePosition();
}
//Botón que llama al método cargar posición
if (GUILayout.Button("Load Position", GUILayout.Width(120)))
{
LoadPosition();
}
//Botón que llama al método recargar escena
if (GUILayout.Button("Reload Scene", GUILayout.Width(120)))
{
Reset();
}
}
public void SavePosition()
{
//Creamos un objeto de tipo PositionData (Clase personalizada que está más abajo) y la inicializamos con la posición y rotación de nuestro personaje
PositionData pd = new PositionData(transform.position, transform.rotation);
//Serializamos y guardamos en PlayerPrefs el string que nos devuelve la serialización a JSON
PlayerPrefs.SetString(PositionKey, JsonUtility.ToJson(pd));
}
public void LoadPosition ()
{
//Deserializamos el string obtenido de PlayerPrefs y lo guardamos en un objeto de tipo PositionData (Clase personalizada que está más abajo)
PositionData pd = JsonUtility.FromJson<PositionData>(PlayerPrefs.GetString(PositionKey));
//Verificamos que el objeto no sea nulo (en el caso que se trate de cargar antes de haber guardado al menos 1 vez
if(pd!=null)
{
//Asignamos la posición guardada a nuestra posición actual
transform.position = pd.Position;
//Asignamos la rotación guardada a nuestra rotación actual
transform.rotation = pd.Rotation;
}
}
public void Reset ()
{
//Recargamos la escena actual
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
//Simple clase personalizada usada para serializar la posicion y rotacion de nuestro personaje
[System.Serializable]
public class PositionData
{
//Posición a serializar
public Vector3 Position;
//Rotación a serializar
public Quaternion Rotation;
//Dejamos un constructor vacío porque algunos tipos de serializacion así lo requieren
public PositionData (){}
//Creamos un constructor custom para inicializar fácilmente nuestra clase
public PositionData (Vector3 pos, Quaternion rot)
{
Position = pos;
Rotation = rot;
}
}
Básicamente lo que hace este script es que cuando se presiona el botón de guardar la posición, serializamos la posición y la rotación de nuestro personaje y como la serialización a JSON nos devuelve un string este lo guardamos usando PlayerPrefs y para cargar la posición hacemos el proceso inverso, de esta manera aunque recarguemos la escena o cerremos el juego y lo volvamos a abrir en otra ocasión, la posición que guardamos la podemos volver a cargar.

Es muy util muchas gracias!!
ResponderEliminarHe ocupado el script y tabien uno parecido y mi problema es que si me guarda la pocicion y al momento de cargar la pocicion me lleva a la pocicion guardada y me regresa a la anterior. La consola no me marca ningun error. Que podria ser?
ResponderEliminar