【发布时间】:2019-12-12 22:48:22
【问题描述】:
保存状态类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public class SaveState
{
public float RotationX { set; get; }
public float RotationY { set; get; }
public float RotationZ { set; get; }
public DateTime LastSaveTime { set; get; }
}
存档管理器:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System;
using System.IO;
public class SaveManager : MonoBehaviour
{
#region Instance
private static SaveManager instance;
public static SaveManager Instance
{
get
{
if (instance == null)
{
instance = FindObjectOfType<SaveManager>();
if (instance == null)
{
instance = new GameObject("Spawned SaveManager", typeof(SaveManager)).GetComponent<SaveManager>();
}
}
return instance;
}
set
{
instance = value;
}
}
#endregion
[Header("Logic")]
[SerializeField] private string saveFileName = "data.dat";
[SerializeField] private bool loadOnStart = true;
private BinaryFormatter formatter;
private SaveState state;
public SaveState State { get => state; set => state = value; }
private void Start()
{
// Init the formatter.
formatter = new BinaryFormatter();
DontDestroyOnLoad(this.gameObject);
// If loadOnStart is true try to load the saved file.
if (loadOnStart == true)
{
Load();
}
}
public void Save()
{
// If no state
if (state == null)
{
state = new SaveState();
}
//Set the time when trying to save.
state.LastSaveTime = DateTime.Now;
//Open the file.
var file = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);
formatter.Serialize(file, state);
file.Close();
}
public void Load()
{
// Open file
try
{
var file = new FileStream(saveFileName, FileMode.Open, FileAccess.Read);
// Read file.
state = (SaveState)formatter.Deserialize(file);
file.Close();
}
catch
{
Debug.Log("No save file found, creating a new entry");
Save();
}
}
}
还有一个测试脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SaveTest : MonoBehaviour
{
private void Update()
{
SaveManager saveManager = SaveManager.Instance;
if(Input.GetKeyDown(KeyCode.T))
{
var player = GameObject.Find("Player");
saveManager.State.RotationX = player.transform.position.x;
saveManager.State.RotationY = player.transform.position.y;
saveManager.State.RotationZ = player.transform.position.z;
saveManager.Save();
}
if(Input.GetKeyDown(KeyCode.L))
{
SaveManager.Instance.Load();
}
}
}
当我按下 T 键时,我使用了一个断点,它会在那里找到玩家。 但是当按下 L 键时它什么也不做,它不会将玩家旋转更改为已保存的内容。
我可以看到创建的文件是data.dat 256字节大小。
【问题讨论】:
-
您的
Load方法没有尝试在player上设置任何值 -
这能回答你的问题吗? What is the best way to save game state?