一発屋のゲームでもない限り、
常にその進捗を保存して、
またその続きからプレイしたいもの!
プレイヤーのレベルや所持金、獲得アイテムなどなど..
保存したいデータは山のようにあります。
そんなときは、Json化による保存を行いましょう。
PlayerPrefsでも保存はできるじゃん? と思われるかもしれませんが、
できることなら、Json化がオススメ。
多くのゲーム開発講座でも、保存にはPlayerPrefが出てきます。
なぜなら、PlayerPrefsはたった1行で保存処理できるので、
初心者が混乱しにくく、わかりやすいからだと思います。
しかし、
実際にゲーム開発に取り組み、
多くのデータを扱うようになってきた場合、
すべてをPlayerPrefsで保存すると、
デバイスへの負荷が増し、処理が重たくなってしまいます。
つまり、データのJson化による保存とその読み込みは
ゲーム開発において必須であると言えます。
私のアプリ"Our Casual Battlefield"でも、
基本的なデータの保存はこの方法で、
自己ベストや獲得コインの数を保存しています。
実例として、参考およびぜひ遊んでみてください^^【宣伝】
気を取り直して・・・
本記事では、誰でも真似して学べるように
シンプルなゲームプロジェクトを作り、
Level(int)とそれによって変わるステータス(string)、HP(int)の
保存(SAVE)と読込(LOAD)の実装方法を解説していきます↓
忘れたときにいつでも引用でき、
スムーズなゲーム開発の一助になれば幸いです。
1.サンプルシーンの作成
準備するのはUIだけです。
Textを作成し、適宜Inspectorを設定します。
このTextに後ほどスクリプトで「Player StatusのLv、rank、HP」を表示するようにします。
次にButtonを作成します。
図のように、Heightを50に、Text内容は「LEVEL UP」とします。
1つ作ったら、ctrl+Dで複製し、SAVE Button配置(Rect Transform)を変更します。
C#ScriptでPlayerManager.csを作成し、Canvasオブジェクトにアタッチします。
PlayerManager.csの内容は、次の通り↓
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class PlayerManager : MonoBehaviour { [SerializeField] Text statusText; int level; string rank; int hp; // Start is called before the first frame update void Start() { //初期値 level = 1; rank = "Amateur"; hp = 100; //Text内容 statusText.text = "PLAYER STATUS\nLevel: " + level + "\nRank: " + rank + "\nHP: " + hp; } //LEVEL UP Buttonクリックで呼ぶ関数 public void OnClickLevelUp() { level += 1; if(level == 5) { rank = "Professional"; hp = 150; } //Text内容 statusText.text = "PLAYER STATUS\nLevel: " + level + "\nRank: " + rank + "\nHP: " + hp; } }
Inspectorにて
Status Textを紐付け、
LEVEL UP ButtonのOnClick関数に、OnClickLevelUp()を紐付けします。
ここで、いったん実行してLEVEL UP Buttonで
ステータスが変わっていくか確認してみましょう。
Levelが5になったら、Rank、HPが変わります。
しかし、ゲームをもう一度実行すると、また初期値に戻ってしまいます。
それでは、これらのステータスをJson化によって保存していきます。
2.Json化によるSaveの実装
Json化のセーブには2つのスクリプトを作成します。
PlayerPrefsに比べると、面倒に思うかもしれませんが、
かなりシンプルなスクリプトで、
一度作成してしまえばセーブしたい他のシーンでも、スクリプトを使い回せます。