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

解决方法
- 删掉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
相关产品推荐
相关产品推荐

