LoginSignup
1
2

More than 5 years have passed since last update.

【Unity】【Android】ローカルストレージにファイルを出力する

Last updated at Posted at 2019-02-18

ローカルストレージにファイルを出力する

※Unity2018.3.3f1を利用しています。

Androidのローカルストレージ内にXMLファイルを出力しようとしたのですが
ファイル自体はできあがるのに、なぜか中身が出力されません。

そういやManifestファイルを作っていなかったと思い、
Unityマニュアルを確認したところ、以下のように記載されていました。


Unity は、Player Settings とアプリケーションがスクリプトから呼び出す Unity APIs に基づいて、自動的に必要なパーミッションを加えます。例えば、以下のようなものが含まれます。

  • Network クラスにより INTERNET パーミッションを加えます。
  • バイブレーションの使用 (Handheld.Vibrate など) により VIBRATE を加えます。
  • InternetReachability プロパティーにより ACCESS_NETWORK_STATE を加えます。
  • Location APIs (LocationService など) により ACCESS_FINE_LOCATION を加えます。
  • WebCamTexture APIs により CAMERA パーミッションを加えます。
  • Microphone クラスにより RECORD_AUDIO を加えます。

と言うことは、Player Settingsに何らかの設定値がありそうです。
実際、以下のような項目がありました。

  • Write Access
    • External(SDCard) に設定すると、SD カードなどの外部ストレージへの書き込みアクセスを有効にし、対応する権限を Android マニフェストに追加します。 開発ビルドではデフォルトで有効になっています。

デフォルトでは「Internal」になっていましたが
SDカードに出力したい訳ではないので、Internalのままで良いだろうと思っていました。

ところが

ファイルは一向に出力されず・・・。

manifestファイルをPlaginsフォルダに入れることで、
Unityが自動で生成したmanifestを上書きできるようですが
manifestファイル自体は作成してくれないので、ゼロから自作しなくてはなりません。
ちょっとそれはめんどくさい

Write PermissionをExternalにしてみる

その1.png

ものは試しで、Write Permissionの値をExternal設定にしてみたところ
実機の内部ストレージにXMLファイルが出力されていました!
なんてこった。

考察

PlayerのWrite Permissionを「External(SDCard)」に設定することで
内部ストレージにXMLファイルを出力することができました。

クラスをそのまま出力したかったので、ファイル出力には
DataContractSerializerを使用したのですが
UnityEngine.PlayerPrefsなるクラスも準備されているようでして。

もしかして、これを使っていたら
Unityが自動的にパーミッションを加えていてくれたのかな?

おまけ

Unity Editorで動作させる場合と実機で動作させる場合とで
保存先のパスが変わってきます。
その場合、UNITY_EDITORプリプロセッサを使用してパスを切り替えると良いです。

    var filename = "SaveData.xml";
#if UNITY_EDITOR
    // Unity Editor上
    var filepath = Path.Combine(@"C:\", filename);
#else
    // それ以外
    var filepath = Path.Combine(UnityEngine.Application.persistentDataPath, filename));
#endif

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2