🐡

Unity(UaaL), iOS, Androidでローカル保存のデータを共有する

2023/11/14に公開

概要

  • Unity as a Libraryを利用したネイティブ + Unityのアプリを開発している。Unity、Android、iOSのそれぞれの部分で、同じローカルの保存領域を参照し、データを共有したい。
  • ユースケースとしては、iOSやAndroidのネイティブ部分で保存したデータを、Unity(UaaL)が参照する。
  • それぞれのプラットフォームごとに用意されたローカルへのKey, Value形式の平文保存を利用する方法は以下の通り。
    • Unity: PlayerPrefs
    • Android: SharedPreferences
    • iOS: UserDefaults

結論

  • (以下、ネイティブで書き込んだデータをUnity側で読み取る例で説明する。)
  • Unityは通常通りPlayerPrefsを利用
PlayerPrefs.GetInt("TestKey", 1); // 1はValueが無い時のデフォルト値。
  • AndroidではSharedPreferencesのファイル名をPackageName(Application ID) + 特別な形で指定
SharedPreferences samplePrefs = getSharedPreferences("[Application IDと同じ文字列].v2.playerprefs", MODE_PRIVATE);
samplePrefs.edit().putInt("TestKey", 10).apply();
  • iOSでは、通常通りUserDefaultsを利用
let userDefaults = UserDefaults.standard
userDefaults.set(10, forKey: "TestKey")
  • この通り設定すると、ネイティブアプリでUaaL部分を起動すると、10が表示される。

詳細

Unity Androidと、ネイティブAndroidの比較

  • Androidでは、xmlファイルが参照される。
  • Unity Androidでは、/data/data/PACKAGE_NAME/shared_prefs/PACKAGE_NAME.v2.playerprefs.xml
  • ネイティブAndroidでは、SharedPreferences利用時は、/data/data/PACKAGE_NAME/shared_prefs/PREFS_NAME.xml
  • よって、PREFS_NAME = PACKAGE_NAMEとすればよい。なお、Android StudioにおけるPACKAGE_NAMEは、Application IDを指す。

Unity iOSと、ネイティブiOSの比較

  • Unity iOSではファイル場所はドキュメントに記載されていない。[NSUserDefaults standardUserDefaults]を利用すると記載。
  • 結論に書いた通り、UnityでもネイティブiOSでも特に意識することなく、PlayerPrefs/UserDefaultsにアクセスすればよい。

(補足)UnityのProduct Name, Package Nameと、ネイティブでの設定について

  • 補足として、UnityのProject Settingsで設定するProduct Name, Package Nameと、Android Studio / XCodeで設定するPackage Name(Android StudioではApplication ID, XCodeではBundle Identifier)がどのように両立/上書きされるのかを検証する。
  • 結論としては、
    • Product NameはUnityで設定したものがUnity単体起動でも、UaaL状態でも参照される。
    • Package Nameは、ネイティブで設定したもので上書きされる。

実験

  • Unity部分を起動した直後にviewに表示されるようにして、実際の値を検証した。Unity C#の以下のコードでProduct, Package Nameを取得している。
string productName = Application.productName;
string packageName = Application.identifier;

結果

\ Unity設定 UnityEditor起動 AndroidStudio/XCode設定 UaaLをAndroid/iOS実機起動
Product ProductUnity ProductUnity 無し ProductUnity
Package com.C.ProductUnity com.C.ProductUnity com.C.ProductMobile com.C.ProductMobile

Discussion