一発屋のゲームでもない限り、
常にその進捗を保存して、
またその続きからプレイしたいもの!
プレイヤーのレベルや所持金、獲得アイテムなどなど..
保存したいデータは山のようにあります。
そんなときは、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に比べると、面倒に思うかもしれませんが、
かなりシンプルなスクリプトで、
一度作成してしまえばセーブしたい他のシーンでも、スクリプトを使い回せます。
