- Home /
Question by
Tehokiller299 · Jun 26, 2020 at 07:46 PM ·
saveloadloadingsaving
Problem with saving the transform of the player
I'am making a horror game with a lot of movement and saving and loading is pretty important, now I followed a tutorial of Brackeys, but it didn't work for me. I have had this problem for so long. Here is the code:
Player.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
[System.Serializable]
public class Player : MonoBehaviour
{
public void SavePlayer ()
{
SaveSystem.SavePlayer(this);
}
public void LoadPlayer ()
{
PlayerData data = SaveSystem.LoadPlayer();
Vector3 position;
position.x = data.position[0];
position.y = data.position[1];
position.z = data.position[2];
transform.position = position;
}
}
PlayerData.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
[System.Serializable]
public class PlayerData
{
public float[] position;
public PlayerData (Player player)
{
position = new float[3];
position[0] = player.transform.position.x;
position[1] = player.transform.position.y;
position[2] = player.transform.position.z;
}
}
SaveSystem.cs:
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public static class SaveSystem
{
public static void SavePlayer (Player player)
{
BinaryFormatter formatter = new BinaryFormatter();
string path = Application.persistentDataPath + "/player.sod";
FileStream stream = new FileStream(path, FileMode.Create);
PlayerData data = new PlayerData(player);
formatter.Serialize(stream, data);
stream.Close();
}
public static PlayerData LoadPlayer ()
{
string path = Application.persistentDataPath + "/player.sod";
if(File.Exists(path))
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(path, FileMode.Open);
PlayerData data = formatter.Deserialize(stream) as PlayerData;
stream.Close();
return data;
} else
{
Debug.LogError("File not found in" + path);
return null;
}
}
}
Comment
Answer by CodesCove · Jun 26, 2020 at 09:29 PM
Add default constructor to PlayerData class:
public PlayerData ()
{
position = new float[3];
}
In the LoadPlayer create the PlayerData instance with "new" before trying to write the stream to it.
PlayerData data = new PlayerData();