【发布时间】:2021-02-02 06:57:01
【问题描述】:
我的游戏中有两个场景 - 主菜单和游戏。我已经使用二进制格式化程序和序列化使玩家的位置和旋转在 2 个场景之间保持不变。但是,我很难让游戏场景中的时间在两个场景(和游戏会话)之间持续存在。简单来说:
- 游戏开始 - 时间是“x”。
- 我在一段时间后保存游戏并离开/转到菜单 - 时间是“x + 已过时间”。
- 我加载了游戏 - 时间是“x + 时间过去”而不是“x”。
我粘贴了一些代码(保存和加载 pos & rot),以便您了解发生了什么。
public static class DataSerializer
{
public static void SerializeData(Player player)
{
BinaryFormatter bf = new BinaryFormatter();
string dataPath = Application.persistentDataPath + "/data.txt";
FileStream stream = new FileStream(dataPath, FileMode.Create);
PlayerData data = new PlayerData(player);
bf.Serialize(stream, data);
stream.Close();
}
public static float[] DeserializeData()
{
string dataPath = Application.persistentDataPath + "/data.txt";
if (File.Exists(dataPath))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream stream = new FileStream(dataPath, FileMode.Open);
PlayerData data = bf.Deserialize(stream) as PlayerData;
stream.Close();
return data.stats;
}
else
{
Debug.LogError("File does not exist.");
return new float[6];
}
}
}
[Serializable]
public class PlayerData
{
public float[] stats;
public PlayerData(Player player)
{
stats = new float[6];
stats[0] = player.transform.position.x;
stats[1] = player.transform.position.y;
stats[2] = player.transform.position.z;
stats[3] = player.transform.eulerAngles.x;
stats[4] = player.transform.eulerAngles.y;
stats[5] = player.transform.eulerAngles.z;
}
}
public class Player : MonoBehaviour
{
public GameObject player;
void Start()
{
float[] loadedStats = DataSerializer.DeserializeData();
Vector3 position = new Vector3(loadedStats[0], loadedStats[1], loadedStats[2]);
Vector3 rotation = new Vector3(loadedStats[3], loadedStats[4], loadedStats[5]);
player.transform.position = position;
player.transform.rotation = Quaternion.Euler(rotation);
}
public void Save()
{
DataSerializer.SerializeData(this);
}
}
如果您能以同样的方式帮助我保存和加载游戏时间,我将不胜感激。
谢谢!
【问题讨论】:
标签: c# unity3d serialization time