Android Unity c#:UnauthorizedAccessException写保存游戏数据

我在Android中调试Unity游戏,一切都在Unity编辑器中运行。 我在Android上保存当前游戏数据时收到UnauthorizedAccessException。

我写的是persistentDataPath,所以我不明白为什么访问被阻止。

这是使用Logcat的控制台日志:

AndroidPlayer(motorola_Moto_G_(5)@192.168.0.26) UnauthorizedAccessException: Access to the path "/current.sg" is denied. at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x0028a] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/FileStream.cs:320 at System.IO.FileStream..ctor (System.String path, FileMode mode) [0x00000] in :0 at SaveLoadManager.SaveGame (.Game currentGame) [0x0002a] in F:\Work\Magister\Magister\Magister\Assets\Scripts\SaveLoadManager.cs:16 at PlayerController.FixedUpdate () [0x0058e] in F:\Work\Magister\Magister\Magister\Assets\Scripts\PlayerController.cs:244 

来自在FixedUpdate()循环中运行的PlayerController的相关代码:

 if (!gameSaved) { SaveLoadManager.SaveGame(gameManager.GetComponent()); gameSaved = true; } 

SaveLoadManager的SaveGame函数:

 public static void SaveGame(Game currentGame) { string saveGameFileName = Path.DirectorySeparatorChar + "current.sg"; string filePath = Path.Combine(Application.persistentDataPath, saveGameFileName); BinaryFormatter bf = new BinaryFormatter(); FileStream file = new FileStream(filePath, FileMode.Create); GameData data = new GameData(currentGame); bf.Serialize(file, data); file.Close(); } 

AndroidManifest.xml中的读/写权限:

   

在写入该路径之前,您必须检查目录是否存在Directory.Exists 。 如果没有,请使用Directory.CreateDirectory创建它。

请注意,将文件直接保存到Application.persistentDataPath不是一个好主意。 您必须先在其中创建一个文件夹,然后将文件保存在该文件夹中。 所以Application.persistentDataPath/yourcreatedfolder/yourfile.extension很好。 通过这样做,您的代码也可以在iOS上运行。

这就是代码应该是这样的:

 string saveGameFileName = "current"; string filePath = Path.Combine(Application.persistentDataPath, "data"); filePath = Path.Combine(filePath, saveGameFileName + ".sg"); //Create Directory if it does not exist if (!Directory.Exists(Path.GetDirectoryName(filePath))) { Directory.CreateDirectory(Path.GetDirectoryName(filePath)); } try { BinaryFormatter bf = new BinaryFormatter(); FileStream file = new FileStream(filePath, FileMode.Create); GameData data = new GameData(currentGame); bf.Serialize(file, data); file.Close(); Debug.Log("Saved Data to: " + filePath.Replace("/", "\\")); } catch (Exception e) { Debug.LogWarning("Failed To Save Data to: " + filePath.Replace("/", "\\")); Debug.LogWarning("Error: " + e.Message); }