皆さんUnityで楽しくゲーム開発していますか?
本当にUnityはゲーム開発をとても楽にさせてくれる素晴らしいゲームエンジンだと思います!
さて、今回はUnityでJSON形式のデータを扱いたい場合にどうすればよいかを解説していきます!
ゲーム開発をしているとキャラクターのステータスデータやスコアデータといったデータをどうやってプログラム内で扱っていますか?
僕はJSON形式のデータで扱うことがあります!
今回は、
・JSONとは何か
・UnityでJSON形式のデータを扱う方法
といった基礎的な知識・使い方から
・ゲームで使うにはどのように使うのか?
といった実践的な内容も解説していきたいと思います。
この記事を読むことでゲーム開発に必須なJSON形式でのデータ管理について学ぶことができます!
JSONとは
JSONについて
JSONという言葉を聞いたことがありますか?
JSONはJavaScript Object Notationの略称であり、あるルールによって書かれたデータのことを言います。
これだけだとわからないと思うのでJSON形式のデータを見てみましょう。
{ “Hp” : 100, “Attack” : 20, “Defense” : 7 }
これがJSON形式のデータの書き方です。
人間でも見ただけでなんとなくわかるようなデータ形式になっています。
今回の例で言えば、HPという名前のキーが存在し、そのHPには100という数値が紐付いています。
必ずJSON形式のデータはキーと値が1対1で結びつく形となっています。
プログラム中ではこのHpというキーを指定して100という値を取り出したり、書き換えたりします。
UnityでJSON形式のデータを扱う方法
先程解説したJSON形式のデータですがUnityで扱うためにはどうしたらよいでしょうか?
答えは簡単です。
JsonUtilityという機能を使えばUnityでもJSON形式のデータを扱うことができます。
ただし、このJsonUtilityという機能についてはUnityバージョンが5.3以降である必要があります。
Unity – What’s new in Unity 5.3 (Japanese)
https://unity3d.com/jp/unity/whats-new/unity-5.3
Scripting: JSON APIJSON 形式から(またはその逆も)オブジェクトを変換するための簡単かつ迅速な方法を提供します。
とあるようにJSON形式のデータを簡単に扱うための機能が追加されたことが記述されています。
では次の章からは早速JsonUtilityを使ってJSON形式のデータの扱い方について学んでみましょう!
JsonUtilityの使い方
オブジェクトをJSON形式データ(文字列)に変換
この項ではJsonUtilityを使ってオブジェクトをJSON形式のデータに変換してみましょう。
まず、先程の章で解説したHpやAttackなどの例をもとにプレイヤークラスを作ってみました。
[System.Serializable] public class Player { public int hp; public int attack; public int defense; }
このPlayerクラスの定義直前に[System.Serializable]と書いてある部分があるかと思います。
これは今回のオブジェクトをJSON形式のデータに変換する際に必須な記述なので書いておく必要があります。
次に、実際にPlayerオブジェクトを生成しプレイヤー情報を設定してみましょう。
同時にJSON形式のデータへの変換も行います。
Player player = new Player (); player.hp = 100; player.attack = 20; player.defense = 7; string jsonstr = JsonUtility.ToJson (player); Debug.Log (jsonstr);
実行結果:
{"hp":100,"attack":20,"defense":7}
1行目でPlayerオブジェクトを生成し、2〜4行目でプレイヤーのステータスを決定しています。
5行目でJsonUtility.ToJsonメソッドを使い、オブジェクトをJSON形式のデータに変換しています。
たったこれだけ?と思った方もいるかと思います。
たったこれだけなんです。
あとは実際に変換されたJSON形式のデータの中身を確認したいのでDebug.logで中身を表示しています。
表示した結果は実行結果のような形になります。
JSON形式のデータ(文字列)をオブジェクトに変換
では次に、JSON形式のデータをオブジェクトに変換してみましょう!
まずサンプルをご紹介します。
Player player = new Player (); player.hp = 100; player.attack = 20; player.defense = 7; string jsonstr = JsonUtility.ToJson (player); Debug.Log (jsonstr); Player player2 = JsonUtility.FromJson<Player> (jsonstr); Debug.Log (player2.hp); Debug.Log (player2.attack); Debug.Log (player2.defense);
前項のオブジェクトをJSON形式のデータに変換する際に使ったサンプルコードに追記しています。
JSON形式のデータが入っている変数jsonstrをオブジェクトに変換するというサンプルになっています。
JSON形式のデータをオブジェクトに変換するにはJsonUtility.FromJsonメソッドを使うことで変換できます。
先程のオブジェクトからJSON形式のデータに変換するのと同様とても簡単に使うことができます。
JsonUtility.FromJson<Player> (jsonstr);
FromJsonのあとの<>ですが、変換したいオブジェクトのクラス名を記述する必要があります。
そして引数にはJSON形式のデータを渡すことで変換することができます。
実行結果:
100 20 7
ミニゲームのセーブデータとして使ってみる
作り方の流れ
この章ではJSON形式のデータをセーブデータとして扱ってみようということで簡単なサンプルを交えながら解説をしていきたいと思います。
実践的な内容になるためJsonUtility以外のファイルの入出力などついても扱っていきますが詳しくは解説しないためご了承ください。
実際にセーブデータの読み書きの処理作るために必要な処理は、
・JSON形式のデータをファイルに出力(保存)
・JSON形式のファイルデータを読み込んむ
・読み込んだデータをゲームのUIに反映させる
※今回はUIに反映させていません。
といった処理が必要になるかと思います。
ファイルへの出力
まずはファイルへの出力(保存)をしてセーブデータを作ってみましょう。
今回は引数にPlayerデータを与えたらファイルに自動保存してくれるメソッドsavePlayerDataを実装してみます。
最初にファイルの保存・読み込みを行うために次の1行をファイルの頭に追加する必要があります。
using System.IO;
public void savePlayerData(Player player) { StreamWriter writer; string jsonstr = JsonUtility.ToJson (player); writer = new StreamWriter(Application.dataPath + "/savedata.json", false); writer.Write (jsonstr); writer.Flush (); writer.Close (); }
このメソッドを呼び出すときにPlayerオブジェクトを渡してあげればデータをJSON形式に変換して保存してくれます。
ファイルからの読み込んで表示
今度は保存されているJSON形式のファイルを読み込むためのloadPlayerDataメソッドを実装します。
このメソッドを使うことで読み込んだJSON形式データをPlayerオブジェクトに変換して戻り値として返すようになっています。
public Player loadPlayerData() { string datastr = ""; StreamReader reader; reader = new StreamReader (Application.dataPath + "/savedata.json"); datastr = reader.ReadToEnd (); reader.Close (); return JsonUtility.FromJson<Player> (datastr); }
当然のことですが、保存した際のファイル名と読み込む際のファイル名は一緒でなければなりません。
これらの保存・読み込みメソッドを定義したあとにこのようなコードを書いて使います。
Player player = new Player (); player.hp = 100; player.attack = 20; player.defense = 7; savePlayerData(player); Player player2 = loadPlayerData (); Debug.Log (player2.hp); Debug.Log (player2.attack); Debug.Log (player2.defense);
最初に書いたコードと比べるとかなりすっきりしているのがわかるかと思います。
これでJSON形式データでセーブファイルを作成し、読み込んで使うことができるようになったかと思います。
※今回は書き込む際にデータの暗号化は行いませんでした。実際にゲームを作る際には暗号化すべきかどうかなども考えて作らなければなりません。
まとめ
いかがでしょうか?
今回はUnityでどうやったらJSON形式のデータを扱えるかについて解説しました。
JsonUtilityを使えばとても簡単に扱うことができることがわかりました。
使い方を覚えてゲーム開発にどんどん使っていきましょう!