読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

外部ファイルの読み書きと暗号化(Dictionary⇔JSON)【Unity】


このエントリーをはてなブックマークに追加

はじめに

ゲームのデータを保存する際にPlayerPrefsでは無く、JSON形式の外部ファイルを利用してみました。

処理をする時はDictionary形式で扱い、保存する時だけJSONにしています。

ついでに暗号化もしてみたり!


MiniJSON

まずJSONをC#で扱えるようにするため、MiniJSONを導入。

楽チン!


JsonSerializer

クラス名がイマイチうまく付けられなかったんですが、Dictionary⇔JSONの変換をしつつ、読み書きを行うクラスです。

現状、指定されたファイル名で上書き保存しているので、同ファイル名があったら追記する形式にした方が良さそうですね。

使い方

使い方の例を挙げると↓のようになります。

public void Save(){
  Dictionary<string, object> dic = new Dictionary<string, object>();
  dic.Add ("key1", "Value");
  dic.Add ("key2", 1.5f);

  JsonSerializer.Save (dic, "SampleData");
}

public void Load(){
  Dictionary<string, object> dic = JsonSerializer.Load ("SampleData");
  if(dic == null){
    return;
  }

  string key1 = dic["key1"] as string;
  float  key2 = float.Parse(dic["key2"] as string);
}

Dictionaryの保存形式をobjectにしているので、stringでもfloatでも保存できますが、読み込む際にobjectからfloatへの変換が直接できないのでstringにしてからfloatにしています。いいのかなこれで!


次にコード説明です。

GetFilePath(string fileName)

ファイルの内容だけでなく、ファイル名も暗号化しているので、Save及びLoadのどちらとも同じメソッドでファイルパスを取得するようにしています。
暗号化については次の項で。

Application.persistentDataPath

永続的なデータを保存するパスです。(端末、OS毎に保存するパスが変わる)

また、上記の記事にもある通り、iOSではこのパスで保存した先のファイルはiCloud保存対象となり、肥大化するとリジェクトの危険性もあるので注意が必要です。

詳細&対処法はこちら↓

データが何十MBとかになりそうだったらiCloudの対象から外しといた方が良いかもです。


Encryption

以前、PlayerPrefsの暗号化で作った物の改良版です。


それでは早速コードをば。

特に前回と変わらないですが、外部から文字列を暗号化&復号化出来るようにしています。

暗号化の方法はコチラ


おわりに

速度計測はしてないのですが、毎度外部ファイルを読み込んだり保存したりすると時間がかかりそう
なので、JSONを管理するクラスを作り、そいつが最初に外部ファイルを読み込むだけにして、保存もシーン移動の暗転時などに行うようにした方が良さそうです。