c# - 编辑器中的 Unity 自定义类
问题描述
我在二进制保存系统中保存自定义类时遇到问题。
这是我的 SaveLoadManager.cs 进行二进制保存:
public static class SaveLoadManager
{
private static string saveFileName = "/SpaceClicker.sav";
public static bool Save(PlayerData data)
{
BinaryFormatter binaryFormatter = GetBinaryFormatter();
FileStream stream = File.Create(Application.persistentDataPath + saveFileName);
binaryFormatter.Serialize(stream, data);
stream.Close();
return true;
}
public static PlayerData Load()
{
if (!File.Exists(Application.persistentDataPath + saveFileName))
{
return null;
}
BinaryFormatter binaryFormatter = GetBinaryFormatter();
FileStream stream = new FileStream(Application.persistentDataPath + saveFileName, FileMode.Open);
try
{
PlayerData data = binaryFormatter.Deserialize(stream) as PlayerData;
stream.Close();
return data;
}
catch
{
Debug.LogErrorFormat("Failed to load file at {0}", Application.persistentDataPath + saveFileName);
stream.Close();
return null;
}
}
private static BinaryFormatter GetBinaryFormatter()
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
return binaryFormatter;
}
SaveLoadHandler.cs:在这里我只是保存和加载。
这里也是我的自定义类“UpgradeClass”和我的公共变量 factoryUpgradeClass,它有 UpgradeClass。
public PlayerData data;
void Awake()
{
if (SaveLoadManager.Load() != null)
{
data = SaveLoadManager.Load();
}
}
void Update()
{
SaveLoadManager.Save(data);
}
}
[Serializable]
public class UpgradeClass
{
public GameObject ob;
public string upname;
public bool bought;
public UpgradeClass(GameObject ob, string upname, bool bought)
{
this.ob = ob;
this.upname = upname;
this.bought = bought;
}
}
[Serializable]
public class PlayerData
{
//Lots of values
public List<UpgradeClass> factoryUpgradeClass;
}
问题是当我开始游戏时出现以下 2 个错误:
- 错误:
SerializationException: Type 'UnityEngine.GameObject' in Assembly 'UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (System.RuntimeType type) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.FormatterServices+<>c__DisplayClass9_0.<GetSerializableMembers>b__0 (System.Runtime.Serialization.MemberHolder _) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Collections.Concurrent.ConcurrentDictionary`2[TKey,TValue].GetOrAdd (TKey key, System.Func`2[T,TResult] valueFactory) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.FormatterServices.GetSerializableMembers (System.Type type, System.Runtime.Serialization.StreamingContext context) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo () (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize (System.Object obj, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter converter, System.Runtime.Serialization.Formatters.Binary.ObjectWriter objectWriter, System.Runtime.Serialization.SerializationBinder binder) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize (System.Object obj, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter converter, System.Runtime.Serialization.Formatters.Binary.ObjectWriter objectWriter, System.Runtime.Serialization.SerializationBinder binder) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write (System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo objectInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo memberNameInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo typeNameInfo) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (System.Object graph, System.Runtime.Remoting.Messaging.Header[] inHeaders, System.Runtime.Serialization.Formatters.Binary.__BinaryWriter serWriter, System.Boolean fCheck) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers, System.Boolean fCheck) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
SaveLoadManager.Save (PlayerData data) (at Assets/Scripts/DataSaving/SaveLoadManager.cs:22)
SaveLoadHandler.Update () (at Assets/Scripts/Handlers/SaveLoadHandler.cs:33)
- 错误:
IOException: Sharing violation on path C:\Users\mmorp\AppData\LocalLow\DefaultCompany\SpaceClicker\SpaceClicker.sav
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
(wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,int)
System.IO.File.Create (System.String path, System.Int32 bufferSize) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.IO.File.Create (System.String path) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
SaveLoadManager.Save (PlayerData data) (at Assets/Scripts/DataSaving/SaveLoadManager.cs:20)
SaveLoadHandler.Update () (at Assets/Scripts/Handlers/SaveLoadHandler.cs:33)
它指的是行:“SaveLoadManger.Save(data)”。结果是无法加载保存文件。
我搜索了很多,也许我需要做一个自定义编辑器?谁能帮我解决这个问题?
提前致谢!
解决方案
推荐阅读
- html - 如何在由宽度定义的元素下响应式放置 Div
- javascript - 未捕获的语法错误:意外的标识符 game.js:25
- jackson - 如何在 Ktor 中配置 jackson-modules-java8
- wordpress - wordpress 下一篇文章链接没有按预期工作
- sql - 在一个查询中使用两次嵌套查询 - 用于 FROM 和 WHERE
- java - 界面管理eclipse
- websocket - Websocket 客户端在连接数超过 7k 时收到 RST 数据包
- php - 使用 PHPMailer 发送邮件后如何进行重定向
- react-native - 当遍历地图以显示所有图像时,我收到警告:列表中的每个孩子都应该有一个唯一的“关键”道具
- android - firebase signInWithEmailLink 删除 firebase 帐户中的电话号码