You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity游戏保存加载脚本编译错误排查求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:36:28