Unityでゲームデータをセーブし、次のゲーム開始時にデータをロードしたいと悩んでいませんか?
今回は、JsonUtilityというクラスを使ってJSON形式でデータをセーブ、ロードする方法について解説します。
この記事は
っていう方に読んでもらいたいです。
ここでは、簡単な仕組みをUnityで作りながら解説していきます。
現在スコアがハイスコアより高かったときにハイスコアを更新し、セーブ。ゲーム再開時にハイスコアをロードするといった仕組みです。
それでは、始めましょう!
予備知識
JSONとは
何を言っているんだ~と思った方は、実際の例を見て下さい。
{"bestName":"Steve","bestScore":1500}
基本的には{ }内に 変数名: 値 と記述していくフォーマットです。
今回はこれだけの知識で十分です。
JSONについてもっと詳しく知りたいと思われた方はGoogle先生で調べてみて下さい。
Unityに備わるJsonUtilityクラス
変数をJSON形式に変換するのは面倒くさいと思われた方。安心して下さい。
UnityにはJsonUtilityというクラスが備わっています。このクラスを使えば、簡単にデータをJSON形式に変換することができます。
using System.IO;
をスクリプト先頭に記述し、
JsonUtility.ToJson() // JSON形式へ変換
JsonUtility.FromJson<>(); // JSON形式から変換
JsonUtility.ToJson()を使えば、変数をJSON形式へ変換。JsonUtility.FromJson<>()を使えばJSON形式から変数に変換できます。
データセーブ/ロード方法
現在スコアがハイスコアより高かったときにハイスコアを更新しセーブ、ゲーム再開時にハイスコアをロードするといった仕組みを作りながら、データセーブ/ロード方法について解説していきます。
Unity上で現在スコアを入力、ハイスコアを表示するUIを作成
まず初めに、Unity上でUIを作成していきます。下図のように現在スコアを入力、ベストスコアを表示するUIを作成して下さい。レイアウトやデザインはお好みで。
次にInputField入力、Text表示をスクリプト上から行えるようにします。
MainManager.csというスクリプトファイルを作成し、下の記述を追加します。
public InputField currentNameIF;
public InputField currentScoreIF;
public Text bestNameText;
public Text bestScoreText;
空のオブジェクトを作り、MainManagerと名称を変更した後、先ほど作成したMainManager.csをコンポーネントに追加します。下のようにスクリプトで作成した変数にTextオブジェクト、Input Fieldオブジェクトを設定しましょう。
これでスクリプト上からInputField入力、Text表示を扱えるようになります。
ハイスコアをセーブし、ゲーム再開時にロードするスクリプト作成
セーブデータ格納クラス作成
始めにJSON形式でセーブするデータを格納するクラスを作成します。
[System.Serializable]
class SaveData
{
public string bestName;
public int bestScore;
}
クラスの前に記述した[System.Serializable]は、クラスデータをJSON形式に変換する際に必要となります。
JSON形式で保存するメソッド作成
次にSETボタンをクリックしたときに現在スコアがハイスコアを上回っていたら、名前とハイスコアを更新し、これらをJSON形式で保存するメソッドを作成します。
public void OnSetButtonClicked(){
string currentName;
int currentScore;
currentName = currentNameIF.text;
currentScore = int.Parse(currentScoreIF.text);
if(currentScore > bestScore)
{
bestNameText.text = "Name: " + currentName;
bestScoreText.text = "Score: " + currentScore;
SaveData data = new SaveData();
data.bestName = currentName;
data.bestScore = currentScore;
string json = JsonUtility.ToJson(data);
File.WriteAllText(Application.persistentDataPath + "/savefile.json", json);
}
}
JsonUtility.ToJson()は、JSON形式に変換する記述です。
File.WriteAllText()は第1引数で指定されたファイルに第2引数で指定された変数を書き込みます。
Application.persistentDataPathの場所は、Windowsだと\usr\AppData\LocalLow\CompanyNameになります。
データセーブする仕組みを実装したので、次はデータロードする仕組みです。
データロードするメソッドの作成
ゲーム再開したら、セーブしたデータをロードしたいので、Start()メソッドにデータロードスクリプトを記述していきます。
void Start(){
string path = Application.persistentDataPath + "/savefile.json";
if (File.Exists(path))
{
string json = File.ReadAllText(path);
SaveData data = JsonUtility.FromJson<SaveData>(json);
bestName = data.bestName;
bestScore = data.bestScore;
}
else
{
bestName = "";
bestScore = 0;
}
bestNameText.text = "Name: " + bestName;
bestScoreText.text = "Score: " + bestScore;
}
Application.persistentDataPathのsavefile.jsonファイルをFile.ReadAllTextで読み込みます。
読み込んだJSON形式のデータをJsonUtility.FromJson<>()でSaveDataクラスの形式に変換します。
そして、ベストスコアと名前をゲーム画面に表示するといった流れです。
完成したものを動かそう
Buildして実行してみましょう。
CurrentのNameとScoreに入力し、SETボタンを押して下さい。BestのScoreよりCurrent Scoreが高ければ、BestのName、Scoreが更新されます。ゲームを中断し、再開してもBestのNameとScoreはゲーム中断前の情報が保持されているはずです。
まとめ
JsonUtilityというクラスを使ってJSON形式でデータをセーブ、ロードする方法について簡単な仕組みを作りながら解説しました。
現在スコアがハイスコアより高かったときにハイスコアを更新しセーブ。ゲーム再開時にハイスコアをロードするといった仕組みです。
作成方法おさらい
- Unity上で現在スコアを入力、ハイスコアを表示するUIを作成
- ハイスコアをセーブし、ゲーム再開時にロードするスクリプト作成
データをセーブ、ロードはゲーム制作の基本ですね。
最後までお読み頂きありがとうございました。