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

Unity调用Application.persistentDataPath触发MonoBehaviour报错如何解决?

问题原因

报错的核心原因是你在MonoBehaviour的字段初始化阶段调用了Application.persistentDataPath,该阶段Unity运行时环境还未完成初始化,不允许调用任何Unity引擎API,和你是否将逻辑放在Awake/Start无关,你之前修改没有命中问题点。

报错截图

error.

解决方法
  • 删掉SavePath字段的初始赋值,改在Awake生命周期函数中赋值即可
  • 补充缺失的命名空间引用,避免其他编译报错
修改后的完整代码
using UnityEngine;
using System.IO;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;

public class SaveManager : MonoBehaviour
{
    private string SavePath; // 仅声明,不做初始化

    private void Awake()
    {
        // Awake属于Unity合法生命周期阶段,可正常调用引擎API
        SavePath = $"{Application.persistentDataPath}/save.text";
    }

    public void Save()
    {
        var state = LoadFile();
        CaptureState(state);
        SaveFile(state);
    }

    public void Load()
    {
        var state = LoadFile();
        RestoreState(state);
    }

    private Dictionary<string, object> LoadFile()
    {
        if(!File.Exists(SavePath))
        {
            return new Dictionary<string, object>();
        }
        using(FileStream stream = File.Open(SavePath, FileMode.Open))
        {
            var formatter = new BinaryFormatter();
            return(Dictionary<string, object>)formatter.Deserialize(stream);
        }
    }

    private void SaveFile(object state)
    {
        using(var stream = File.Open(SavePath, FileMode.Create))
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, state);
        }
    }

    private void CaptureState(Dictionary<string, object> state)
    {
        foreach(var saveable in FindObjectsOfType<Entity>())
        {
            state[saveable.Id] = saveable.CaptureState();
        }
    }

    private void RestoreState(Dictionary<string, object> state)
    {
        foreach(var saveable in FindObjectsOfType<Entity>())
        {
            if(state.TryGetValue(saveable.Id, out object value))
            {
                saveable.RestoreState(value);
            }
        }
    }
}
额外注意点
  • BinaryFormatter在新版.NET中已被标记为不安全类型,后续迭代建议换成Json序列化、ScriptableObject存储等更安全的方案
  • 如果修改后还有其他报错,可检查Entity类的Id字段、CaptureState/RestoreState方法是否正常实现

内容的提问来源于stack exchange,提问作者Shykes G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 08:24:06