C# 不允许从MonoBehavior调用persistentDatapath
我也试着像错误所说的那样把它放在启动和唤醒状态,但我得到的只是更多的错误C# 不允许从MonoBehavior调用persistentDatapath,c#,unity3d,C#,Unity3d,我也试着像错误所说的那样把它放在启动和唤醒状态,但我得到的只是更多的错误 public class SaveManager : MonoBehaviour { private string SavePath = $"{Application.persistentDataPath}/save.text"; public void Save() { var state = LoadFile(); CaptureStat
public class SaveManager : MonoBehaviour
{
private string SavePath = $"{Application.persistentDataPath}/save.text";
public void Save()
{
var state = LoadFile();
CaptureState(state);
SaveFile(state);
}
public void Load()
{
var state = LoadFile();
RestoreState(state);
}
private Dictionary<string, object> LoadFile()
{
if(!File.Exists(SavePath))
{
return new Dictionary<string, object>();
}
using(FileStream stream = File.Open(SavePath, FileMode.Open))
{
var formatter = new BinaryFormatter();
return(Dictionary<string, object>)formatter.Deserialize(stream);
}
}
private void SaveFile(object state)
{
using(var stream = File.Open(SavePath, FileMode.Create))
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, state);
}
}
private void CaptureState(Dictionary<string, object> state)
{
foreach(var saveable in FindObjectsOfType<Entity>())
{
state[saveable.Id] = saveable.CaptureState();
}
}
private void RestoreState(Dictionary<string, object> state)
{
foreach(var saveable in FindObjectsOfType<Entity>())
{
if(state.TryGetValue(saveable.Id, out object value))
{
saveable.RestoreState(value);
}
}
}
}
公共类SaveManager:monobhavior
{
私有字符串SavePath=$“{Application.persistentDataPath}/save.text”;
公共作废保存()
{
var state=LoadFile();
CaptureState(州);
保存文件(状态);
}
公共空荷载()
{
var state=LoadFile();
恢复不动产(国家);
}
专用字典加载文件()
{
如果(!File.Exists(SavePath))
{
返回新字典();
}
使用(FileStream-stream=File.Open(保存路径,FileMode.Open))
{
var formatter=新的二进制格式化程序();
返回(字典)格式化程序。反序列化(流);
}
}
私有void保存文件(对象状态)
{
使用(var stream=File.Open(SavePath,FileMode.Create))
{
var formatter=新的二进制格式化程序();
序列化(流、状态);
}
}
私有无效CaptureState(字典状态)
{
foreach(变量可保存在FindObjectsOfType()中)
{
state[saveable.Id]=saveable.CaptureState();
}
}
私有财产(字典状态)
{
foreach(变量可保存在FindObjectsOfType()中)
{
if(state.TryGetValue(saveable.Id,out对象值))
{
可保存。可恢复的不动产(价值);
}
}
}
}
正如错误所示,您应该这样做
private string SavePath;
private void Awake ()
{
SavePath = $"{Application.persistentDataPath}/save.text";
}
通常情况下,应根据平台使用正确的路径分隔符
SavePath = Path.Combine(Application.persistentDataPath, "save.text");
或者也可以将其设置为属性,但每次都会返回一个新字符串
private string SavePath => Path.Combine(Application.persistentDataPath, "save.text");
尝试在Awake或Start中而不是在字段初始值设定项中初始化SavePath。谢谢sir@derHugo,它工作得很好。