Unity游戏保存加载脚本编译错误排查求助
编译错误汇总
SaveData.cs 初始错误
Assets\Scripts\Save System\SaveData.cs(62,40): error CS0246: 找不到类型或命名空间名称“StreamingContext”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveData.cs(13,31): error CS0246: 找不到类型或命名空间名称“PlaceableObjectData”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveData.cs(61,6): error CS0246: 找不到类型或命名空间名称“OnDeserializedAttribute”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveData.cs(61,6): error CS0246: 找不到类型或命名空间名称“OnDeserialized”(是否缺少using指令或程序集引用?)
补充错误(SaveSystem.cs + SaveData.cs)
Assets\Scripts\Save System\SaveSystem.cs(17,13): error CS0103: 当前上下文中不存在名称“Directory”
Assets\Scripts\Save System\SaveSystem.cs(20,13): error CS0103: 当前上下文中不存在名称“Directory”
Assets\Scripts\Save System\SaveData.cs(26,21): error CS0246: 找不到类型或命名空间名称“placeableObjectDatas”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveSystem.cs(31,28): error CS0246: 找不到类型或命名空间名称“JsonSerializerSettings”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveSystem.cs(32,42): error CS0103: 当前上下文中不存在名称“ReferenceLoopHandling”
Assets\Scripts\Save System\SaveSystem.cs(34,29): error CS0103: 当前上下文中不存在名称“JsonConvert”
Assets\Scripts\Save System\SaveSystem.cs(36,19): error CS1061: “string”不包含“WriteAllText”的定义,并且找不到可接受第一个“string”类型参数的可访问扩展方法“WriteAllText”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveData.cs(48,21): error CS0246: 找不到类型或命名空间名称“placeableObjectDatas”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveSystem.cs(42,22): error CS1061: “string”不包含“Exists”的定义,并且找不到可接受第一个“string”类型参数的可访问扩展方法“Exists”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveSystem.cs(45,42): error CS1061: “string”不包含“ReadAllText”的定义,并且找不到可接受第一个“string”类型参数的可访问扩展方法“ReadAllText”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveSystem.cs(47,13): error CS0246: 找不到类型或命名空间名称“saveData”(是否缺少using指令或程序集引用?)
Assets\Scripts\Save System\SaveSystem.cs(47,31): error CS0103: 当前上下文中不存在名称“JsonConvert”
Assets\Scripts\Save System\SaveSystem.cs(47,61): error CS0246: 找不到类型或命名空间名称“saveData”(是否缺少using指令或程序集引用?)
修复后的代码
1. SaveData.cs
using System; using System.Collections.Generic; using UnityEngine; using System.Runtime.Serialization; [Serializable] public class SaveData { public static int IdCount; public Dictionary<string, PlaceableObjectsData> placeableObjectDatas = new Dictionary<string, PlaceableObjectsData>(); public static string GenerateId() { IdCount++; return IdCount.ToString(); } public void AddData(Data data) { // 修正:把变量名换成正确的类名 if (data is PlaceableObjectsData plObjData) { if (placeableObjectDatas.ContainsKey(plObjData.ID)) { placeableObjectDatas[plObjData.ID] = plObjData; } else { placeableObjectDatas.Add(plObjData.ID, plObjData); } } } public void RemoveData(Data data) { // 同上,修正类型名 if (data is PlaceableObjectsData plObjData) { if (placeableObjectDatas.ContainsKey(plObjData.ID)) { placeableObjectDatas.Remove(plObjData.ID); } } } [OnDeserialized] internal void OnDeserializedMethod(StreamingContext context) { placeableObjectDatas ??= new Dictionary<string, PlaceableObjectsData>(); } } // 补充缺失的基类Data(若项目中未定义) [Serializable] public class Data { public string ID; }
2. PlaceableObjectsData.cs
using System; using UnityEngine; [Serializable] // 添加序列化特性,确保能被序列化 public class PlaceableObjectsData : Data { public string assetName; public Vector3 position; }
3. SaveSystem.cs(修复版本)
using UnityEngine; using System.IO; using Newtonsoft.Json; // 需先在Unity包管理器安装Newtonsoft.Json public class SaveSystem { private static string SavePath => Path.Combine(Application.persistentDataPath, "saves"); private static string SaveFilePath => Path.Combine(SavePath, "savefile.json"); public static void Save(SaveData data) { // 创建存档目录(不存在则创建) if (!Directory.Exists(SavePath)) { Directory.CreateDirectory(SavePath); } // 配置Json序列化参数 var settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, Formatting = Formatting.Indented }; // 序列化并写入文件 string json = JsonConvert.SerializeObject(data, settings); File.WriteAllText(SaveFilePath, json); } public static SaveData Load() { if (File.Exists(SaveFilePath)) { string json = File.ReadAllText(SaveFilePath); return JsonConvert.DeserializeObject<SaveData>(json); } // 无存档时返回新实例 return new SaveData(); } }
关键修复点说明
SaveData.cs修复点
- 类型名混淆:将
data is placeableObjectDatas中的变量名改为类名PlaceableObjectsData,类名需首字母大写。 - 补充基类:添加带
[Serializable]特性的Data基类,确保子类能正常继承并序列化。 - 序列化依赖:保留
System.Runtime.Serialization命名空间,若仍报错需将Unity的.NET API兼容级别设置为.NET Framework。
SaveSystem.cs修复点
- 添加必要命名空间:
using System.IO;:解决Directory、File相关方法找不到的问题。using Newtonsoft.Json;:解决Json序列化相关类找不到的问题,需先安装对应Unity包。
- 修正方法调用:将
string.WriteAllText()改为File.WriteAllText(),Exists、ReadAllText同理为File类的静态方法。 - 类名大小写:将
saveData改为SaveData,遵循C#类名命名规范。
PlaceableObjectsData.cs修复点
- 添加
[Serializable]特性:确保该类能被Unity或Json序列化工具识别。
内容的提问来源于stack exchange,提问作者kylorius beno

