如何加载保存在Unity C#中的对象数据?



我想在Unity C#中创建一个通用存储系统。 我的代码不起作用?对象无法定义还是我写错了?

如果不使用SaveExtensions中的函数,那么一切都会正常工作。

https://drive.google.com/open?id=1hLFRB2rHj7XcJT6et7TskEa7sLwdmJhP

虽然您的保存有效,但问题出在您的Load方法上。

obj = bf.Deserialize(fs);

此更改仅在方法内部本地应用,但实际上不会更改调用ex的值

ex.Load("asd", ".dat", SaveExtension.Path.PersistentDataPath);

不幸的是,扩展方法中不允许使用refout,因此一种解决方法可能是为该方法提供适当的返回值(我还对其余代码进行了一些更改):

[System.Serializable]
internal static class SaveExtension
{
public enum Path 
{ 
PersistentDataPath, 
TemporaryCachePath 
}
public static void Save(this object obj, string name, string type, Path path)
{
var pathString = "";
switch (path)
{
case Path.PersistentDataPath:
pathString = Application.persistentDataPath;
break;
case Path.TemporaryCachePath:
pathString = Application.temporaryCachePath;
break;
}
// There is no need to create the file 
// in a dedicated if block since it will be created anyway
// Additionally: You did only create a new file but due to
// if-else you didn't write to it the first time
Debug.Log("[SaveSystem]: File " + name + type + " already exist!");
Debug.Log("[SaveSystem]: Location: " + pathString + "/" + name + type);
var bf = new BinaryFormatter();
using (var fs = File.Open(pathString + "/" + name + type, FileMode.Open, FileAccess.Write))
{
bf.Serialize(fs, obj);
}
Debug.Log("[SaveSystem]: Object succesful serialized!");
}
public static T Load<T>(this T obj, string name, string type, Path path)
{
var output = default(T);
var pathString = "";
switch (path)
{
case Path.PersistentDataPath:
pathString = Application.persistentDataPath;
break;
case Path.TemporaryCachePath:
pathString = Application.temporaryCachePath;
break;
}
if (!File.Exists(pathString + "/" + name + type))
{
Debug.LogFormat("File " + pathString + "/" + name + type + " not found! returning default value.");
return output;
}
var bf = new BinaryFormatter();
using (var fs = File.Open(pathString + "/" + name + type, FileMode.Open))
{
output = (T)bf.Deserialize(fs);
}
Debug.Log("[SaveSystem]: Object succesful deserialized!");
return output;
}
}

并像使用它一样使用

ex = ex.Load("asd", ".dat", SaveExtension.Path.PersistentDataPath);

这样,this T obj仅用于定义类型T


只是一个提示:你永远不应该在Update里面使用Debug.Log......对于调试,只需将 Unity 中的检查器切换到Debug模式,即可直接看到私有字段。

最新更新