はじめに
LitJsonでジャグ配列を使う メモ
・Unity標準のJsonUtilityではジャグ配列を文字列に変換できない
・LitJsonを使用すれば使えるようになる
ということでLitJsonを使用していきます。
使用するにはまず、前準備が必要です。
前準備
Githubからファイルをダウンロードします。
github.com
Code→DownLoad ZIP
ダウンロードしたファイルの「src」というフォルダを
UnityのAssetsに入れます。
これで準備完了です。
使い方1
いきなりジャグ配列を使うとわかりにくいので、
int型とstring型の変数を使ったサンプルを載せます。
やっていることは下記です。
・セーブされた文字列を元のクラスの形に戻す(セーブデータがあれば)
・変数を変更
・文字列への変換&セーブ
using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; public class LitJsonTest : MonoBehaviour { string json; private void Start() { Player player = new Player(); //セーブキーを持っていたら処理 if (PlayerPrefs.HasKey("SaveKey")) { json = PlayerPrefs.GetString("SaveKey");//セーブデータから文字列を読み込み print("json = " + json); player = JsonMapper.ToObject<Player>(json);//読み込んだ文字列からPlayerクラスの値を設定 print("HP = " + player.hp); print("Name = " + player.name); print("SkillName = " + player.skillName); } //データを変更 player.hp += 10; player.name = "勇者"; player.skillName = "abc"; json = JsonMapper.ToJson(player);//playerクラスを文字列に変換 PlayerPrefs.SetString("SaveKey", json);//文字列をセーブ print("json = " + json); } } public class Player { public int hp; public string name; public string skillName; }
結果
初回実行時(セーブデータがないので変数の変更 と 保存のみ)
2回目実行時
ポイント
名称の書き方が不適切かもしれませんが、重要なのはこの2つです。
文字列への変換
JsonMapper.ToJson(変換したいクラス);
文字列からクラスへの変換
JsonMapper.ToObject<クラス名>(保存していた文字列);
ジャグ配列を使用
本題のジャグ配列を文字列へ変換するサンプルです。
先ほどのサンプルで書いていたPlayerクラスの変数はジャグ配列一つにしました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; public class LitJsonTest : MonoBehaviour { string json; private void Start() { Player player = new Player(); player.skillId = new int[3][];//最初の要素数の指定 player.skillId[0] = new int[2]; player.skillId[1] = new int[3]; player.skillId[2] = new int[4]; //セーブキーを持っていたら処理 if (PlayerPrefs.HasKey("SaveKey")) { json = PlayerPrefs.GetString("SaveKey");//セーブデータから文字列を読み込み print("セーブデータから読み込んだjson = " + json); player = JsonMapper.ToObject<Player>(json);//読み込んだ文字列からPlayerクラスの値を設定 for (int i = 0; i < player.skillId.Length; i++) { for (int n = 0; n < player.skillId[i].Length; n++) { print("復元後SkillId" + "[" + i + "][" + n + "] = " + player.skillId[i][n]); } } } //データを設定 for (int i = 0; i < player.skillId.Length; i++) { for (int n = 0; n < player.skillId[i].Length; n++) { player.skillId[i][n] = i + n; } } json = JsonMapper.ToJson(player);//playerクラスを文字列に変換 PlayerPrefs.SetString("SaveKey", json);//文字列をセーブ print("セーブしたjson = " + json); } } public class Player { public int[][] skillId; }
結果
初回実行時
2回目実行時
ジャグ配列の文字列化と復元ができることが確認できました。
おわりに
Unity標準のJsonUtilityの方が処理速度が早いらしいので
JsonUtilityで処理できないときだけLitJsonを使うと良さそうです。