【JSON】UnityのJSONでのセーブについて解説してみた【表示編】

ファイル Unity

UnityでJSON形式でデータを保存する方法について色々調べてみました。

初心者の私は保存方法を調べている時に、JSONという文字が出ただけでクラクラしました..。
なので、出来るだけ分かりやすく書けるようにします!

UnityのJSONについてはこちらのサイトを参考にさせていただきました。 

【Unity入門】5分で簡単解決!JSON形式のデータを扱う方法 | 侍エンジニアブログ
この記事では「 【Unity入門】5分で簡単解決!JSON形式のデータを扱う方法 」といった内容について、誰でも理解できるように解説します。この記事を読めば、あなたの悩みが解決するだけじゃなく、新たな気付きも発見できることでしょう。お悩みの方はぜひご一読ください。
2019年3月23日 | くろくまそふと
ゲーム制作ブログ

私も自分なりにJSONを説明してみます。

また、JSONに関してもこちらのサイトの説明がとても分かりやすかったので引用させていただきます。

JSON形式のデータはキーと値が1対1で結びつく形となっています。

【Unity入門】5分で簡単解決!JSON形式のデータを扱う方法 | 侍エンジニア塾ブログ(Samurai Blog) – プログラミング入門者向けサイトより引用

という感じです。

とりあえずやってみましょう!

とりあえずやってみましょう!

解説サイト等のコードをコピペしてVisual Studioみたいな開発環境に貼り付けて、
それを見るだけでも理解が深まると思います。

この記事でのゴールはUnityのConsoleJSON形式のデータを表示させることです。

console

そして、この記事のゴールコードを載せます。
最初は①と②に目を通すだけで大丈夫です
また、この記事では必要ないので、最初に書いてあるStartメソッドUpdateメソッドの内、Updateメソッドをあらかじめ消してあります

JSON_Code

 

を順に解説していきます。

セーブする内容が入ったクラスを作る(①の説明)

まずTestという名前のC#スクリプトを作ります

csharp create

JSON Test

そして、Testを開き、このコードを書きます。
コードを書く場所が分からなければ上のゴールの画像を参考にすれば大丈夫です。
SaveDataという新しいクラスを作るので、using~が書いてある所より下で、他のクラスの中に入っていなければ大丈夫です。

[System.Serializable]
public class SaveData
{
    public string player_name;
    public int player_level;
}


説明する前に一つ。
[System.Serializable]というのはとても難しいので、とりあえずUnityでJSONを扱う際には必要なものだと認識してください。
[System.Serializable]はクラスの前に書きます。
[System.Serializable]についての私の考察は最後に書きます。


このようなコードを書きます。
コードの意味は、

SaveDataというクラスの中

player_nameというstring型の変数

player_level
というint型の変数がある

という意味です。

そして、この変数がこのクラスでセーブできる値になります

また、変数やクラスにインスタンスからアクセス出来るようにするため、アクセス修飾子はクラスと変数どちらにもpublicを付けます。

クラス名(この記事ではSaveData)や
変数名(この記事ではplayer_nameplayer_level)は
予約語(intとかstringとか、既に使われている名前)でなければ何でも大丈夫だと思います。
SaveDataというクラス名や、player_nameplayer_levelという変数名は私が適当に付けた変数名なので、分かりやすいという以外には特別な意味は無いです。

SaveDataクラスのインスタンスに変数を代入して表示(②の説明)

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        SaveData saveData = new SaveData();      //1

        saveData.player_name = "かみこっぷ";      //2
        saveData.player_level = 1;               //2

        string a = JsonUtility.ToJson(saveData); //3

        Debug.Log(a);                            //4
    }
}

TestクラスStartメソッドは既に出来ていると思うので、
Startメソッドの中身を書いてください

1.まず、SaveDataクラスのインスタンスsaveDataを作っています。

2.そして、
player_nameかみこっぷという値、
player_level1という値
を代入しています。

3.次に、JSON形式に変換したsaveDataaに代入しています。
JsonUtility.ToJsonメソッドとはオブジェクト(この記事ではsaveData)をJSON形式にすることが出来るメソッドです。
JsonUtilityについては、こちらのサイトに詳細が書いてあります。 https://docs.unity3d.com/ja/2017.4/ScriptReference/JsonUtility.html 4.そして、Debug.Logメソッドで変数aconsoleに表示します。

それでは表示してみましょう!
Hierarchy上でマウスを右クリック、CreateEmptyを押して
出来たGameObjectに、先程書いたTestを付けます。

完成

これで完成です!
プレイボタンを押してみましょう!

JSON Success

成功するとこんな感じに表示されます!

キーであるplayer_name、値であるかみこっぷ
キーであるplayer_level、値である1
キーと値がセットで表示されていますね。

おまけ [System.Serializable]についての考察

先に、こちらのサイトを参考にさせていただきました

シリアル化 (C#)
シリアル化では、オブジェクトを格納するか、メモリ、データベース、またはファイルに転送するために、それをバイト ストリームに変換します。
【Java】Serializableの基本(シリアライズ・直列化) - TASK NOTES
Serializable の基本的な事についてまとめました。
難解なSerializableという仕様について俺が知っていること、というか俺の理解 - 都元ダイスケ IT-PRESS
java.io.Serializable …、ある程度Javaに触れて来た人は必ず見たことがあるインターフェイスだと思う。私も何度も見てきたし、必要に迫られて自分の作ったクラスにSerializableをつけたこともある。しかし、こいつは一体何なのか?

シリアル化は、オブジェクトを格納するか、メモリ、データベース、またはファイルに転送するためにバイト ストリームに変換するプロセスです。 その主な目的は、必要なときに再作成できるように、オブジェクトの状態を保存しておくことです。 逆のプロセスは、逆シリアル化と呼ばれます。

シリアル化 (C#) | Microsoft Docsより引用

つまりオブジェクトをバイトストリームというものに変換してファイルとかに転送できるようにするってことかな…?
こんな感じの認識が限界です、申し訳ないです。

解釈については各自で色々なサイトを見ていただけると助かります。

次の記事

【JSON】UnityのJSONでのセーブについて解説してみた【ファイル出力、入力編1/2】
前回の記事の続きです。①、②、③、④の順に説明していきます。①はセーブの処理。②はロードの処理。③はセーブボタンを押したときの処理。④はロードボタンを押したときの処理。です。Unityで実装したときの画像はこのようになります。

コメント

タイトルとURLをコピーしました