2017-10-13 83 views
1

私はAndroidでUnityゲームをデバッグしていますが、すべてUnityエディタで動作します。現在のゲームデータをAndroidに保存するとUnauthorizedAccessExceptionが発生します。Android Unity c#:UnauthorizedAccessExceptionゲームデータを保存して書き込む

私はpersistentDataPathに書き込みを行っているため、なぜアクセスがブロックされているのか分かりません。ここ

はLogcatを使用してコンソール・ログである:

<i>AndroidPlayer(motorola_Moto_G_(5)@192.168.0.26)</i> 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 <filename unknown>: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<Game>()); 
    gameSaved = true; 
} 

SaveLoadManagerからセーブデータ機能:

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の読み取り/書き込みのアクセス許可:

<uses-permission 
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
    android:maxSdkVersion="18" /> 

<uses-permission 
    android:name="android.permission.READ_EXTERNAL_STORAGE" 
    android:maxSdkVersion="18" /> 
+0

これは、コードがどのように見えるかです。 'string saveGameFileName = Path.DirectorySeparatorChar +" current.sg "'を 'string saveGameFileName =" current.sg "'に変更してみてください。 –

答えて

1

そのパスに書き込む前に、ディレクトリがDirectory.Existsであるかどうかをチェックする必要があります。そうでない場合は、Directory.CreateDirectoryを使用して作成してください。

Application.persistentDataPathに直接ファイルを保存することはお勧めできません。最初にその中にフォルダを作成してから、そのフォルダにファイルを保存する必要があります。だからApplication.persistentDataPath/yourcreatedfolder/yourfile.extensionは問題ありません。これにより、あなたのコードはiOSでも動作します。私は `Path.Combine`は、あなたがルートディレクトリに書き込みをしようとしている意味、絶対パスとして` saveGameFileName`を扱っていると思います

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); 
} 
関連する問題