Unity保存加载功能:使用Application.persistentDataPath

Posted

技术标签:

【中文标题】Unity保存加载功能:使用Application.persistentDataPath【英文标题】:Unity Save Load Function: Using Application.persistentDataPath 【发布时间】:2021-11-24 12:30:41 【问题描述】:

我是一名初学者 Unity 开发人员。 我使用支持存储功能的资产制作了保存和加载功能。 常用的保存方式是在Application.personDataPath/文件夹下创建一个Json形式的文件。

问题在于它在 Unity 编辑器中运行良好,但当我将它构建为一个完整的游戏时就不行了。当我在目标文件夹 Application.persistantDataPath/ 中查找时,没有创建任何内容。

是否有您经常使用的解决方案或诊断方法?

​更多信息,请看下面的代码。 我使用了从 Unity Asset Store 购买的名为“Corgi Engine”的资源。

设置文件路径

/// the method to use when saving and loading files (has to be the same at both times of course)

public static IMMSaveLoadManagerMethod saveLoadMethod = new MMSaveLoadManagerMethodBinary();

/// the default top level folder the system will use to save the file

private const string _baseFolderName = "/MMData/";

/// the name of the save folder if none is provided

private const string _defaultFolderName = "MMSaveLoadManager";

​

/// <summary>

/// Determines the save path to use when loading and saving a file based on a folder name.

static string DetermineSavePath(string folderName = _defaultFolderName)



string savePath;

// depending on the device we're on, we assemble the path

if (Application.platform == RuntimePlatform.IPhonePlayer)



savePath = Application.persistentDataPath + _baseFolderName;

 

else 



savePath = Application.persistentDataPath + _baseFolderName;



#if UNITY_EDITOR

savePath = Application.dataPath + _baseFolderName;

#endif

​

savePath = savePath + folderName + "/";

return savePath;


创建目录并保存

/// <summary>

/// Save the specified saveObject, fileName and foldername into a file on disk.

public static void Save(object saveObject, string fileName, string foldername = _defaultFolderName)



string savePath = DetermineSavePath(foldername);

string saveFileName = DetermineSaveFileName(fileName);

// if the directory doesn't already exist, we create it

if (!Directory.Exists(savePath))



Directory.CreateDirectory(savePath);



// we serialize and write our object into a file on disk

​

FileStream saveFile = File.Create(savePath + saveFileName);

​

saveLoadMethod.Save(saveObject, saveFile);

saveFile.Close();


转换为 Json 并保存

/// <summary>

/// Saves the specified object at the specified location after converting it to json

public void Save(object objectToSave, FileStream saveFile)



string json = JsonUtility.ToJson(objectToSave);

// if you prefer using NewtonSoft's JSON lib uncomment the line below and commment the line above

//string json = Newtonsoft.Json.JsonConvert.SerializeObject(objectToSave);

StreamWriter streamWriter = new StreamWriter(saveFile);

streamWriter.Write(json);

streamWriter.Close();

saveFile.Close();

Debug.Log(objectToSave.GetType());


【问题讨论】:

没用过StreamWriter,但是对于Unity我一般只用System.IO.File.WriteAllText ( pathWhereToStore, JsonUtility.ToJson ( objectToSave ) ) 【参考方案1】:

正如您的代码所说,您在编辑器模式下使用 Application.dataPath(资产文件夹),而在 androidios 中使用 Application.persistentDataPath。这就是结果不同的原因。

请参阅 first 和 second 的文档。查看每种情况下文件的存储位置。

如果您仍然无法在 Android 中找到您的文件,请尝试运行时调试 - 运行 Debug.Log(Application.persistentDataPath); 或将其分配给场景中的某个文本对象

【讨论】:

以上是关于Unity保存加载功能:使用Application.persistentDataPath的主要内容,如果未能解决你的问题,请参考以下文章

unity怎么知道一个场景是不是加载完成

(Unity3D) 保存/加载玩家库存

Unity C# 从字节加载图像

Unity资源加载路径及加载方式小结

在 Unity 中保存/加载数据

在 IOS 中保存和加载 XML 文件会在我的 Unity 项目中产生问题