Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不允许从MonoBehavior调用persistentDatapath_C#_Unity3d - Fatal编程技术网

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,它工作得很好。