Пока ваше сохранение работает, проблема в вашем Load
методе.
obj = bf.Deserialize(fs);
это изменение применяется только локально внутри метода, но фактически не меняет значение вызывающего ex
в
ex.Load("asd", ".dat", SaveExtension.Path.PersistentDataPath);
Неудобно ref
и out
недопустимы в методах расширения, поэтому один обходной путь мог бы дать методу правильное возвращаемое значение вместо этого (я также внес некоторые изменения в остальную частьВаш код):
[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
Подсказка: вам никогда не следует использовать Debug.Log
внутри Update
... для отладки, просто переключите Inspector в Unity на Debug
режим , чем вы можете напрямуюсмотреть приватные поля.