[Unity]jsonで適当にセーブデータ作ってたけど、読み解いてみる

こんにちはまだまだUnity初心者マンのsasasoです
今回は、UnityでJsonを使ってセーブデータを作ってなんとなしに
ゲーム作成をしていたけれど
どういう仕組で動いているのかわからなかったので調べてみる事にしました。

<h2>使用してるソースコード</h2>
<h3>クラス宣言</h3>

```#C
public class Player_status
    {
        public int HP;
        public int Gold;
        public List<string> item_list;
        public int gomgun_ammo;
        public int gomgun_ammo_mag;
        public int assault_ammo;
        public int assault_ammo_mag;
    }
```

<h3>プレイヤー情報の記載</h3>

```
public void newgame()
    {
        Player_status player_status = new Player_status();
        player_status.HP = 100;
        player_status.Gold = 0;
        player_status.gomgun_ammo = 0;
        player_status.gomgun_ammo_mag = 0;
        player_status.assault_ammo = 0;
        player_status.assault_ammo_mag = 0;
        List<string> n = new List<string>();
        player_status.item_list = n;
        savePlayerData(player_status);
        SceneManager.LoadScene("main");
    }
```

<h3>セーブするための関数</h3>

```#C
public void savePlayerData(Player_status player_status)
    {
        StreamWriter writer;

        string jsonstr = JsonUtility.ToJson(player_status);

        writer = new StreamWriter(Application.dataPath + "/savedata.json", false);
        writer.Write(jsonstr);
        writer.Flush();
        writer.Close();
    }
```

内容は侍エンジニアからぶんどってきたもので中身がどう動いているのかは不明....
https://www.sejuku.net/blog/50432

<h2>どう動いてるの？</h2>
1つ1つ分解して考えてみました

解釈は自分なりなので、温かい目で御覧ください

<h3>クラス宣言</h3>
クラス＝設計図

newで複製するもの

ということだったなので

```
Player_status player_status = new Player_status();
```
を使用する

Player_status型のplayer_status変数にクラスの中身を入れるという事

なので
```
player_status.HP = 100;
```
等が代入可能になる(player_status変数の中にHPやGold変数が入っている)

そしてplayer_status変数に各設定値を入力した後
savePlayerData(player_status)でplayer_status変数を渡し、本格的なセーブが始まります

<h3>まずはデータをJson(文章)に変換する</h3>

```
string jsonstr = JsonUtility.ToJson(player_status);
```

まずJsonUtility.ToJsonでは
渡すオブジェクトをJson({HP:10 Gold:300}といった感じの簡単なデータ)に変換するという関数で
![スクリーンショット 2023-01-10 213844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566904/e74faa53-0087-0236-6c08-a3f4f20253ae.png)
リファレンスを見てみると、String形式のJsonデータが帰ってくるという事でした。

なのでstring jsonstrに代入する事が可能になるんですね。

<h3>書き込みの設定をする</h3>

```
StreamWriter writer
```
StreamWriter型のwriter変数を宣言してますね。
Streamはプログラムとストレージの間に立ってやり取りをしてくれるものらしい...
うん...
*参考　http://www.s-cradle.com/developer/sophiaframework/sf_reference/sec.stream.html
まあWriterだしストリーム君がストレージに書き込んでくれるよという認識を持っておく

で次の
```
writer = new StreamWriter(Application.dataPath + "/savedata.json", false);
```
については
![スクリーンショット 2023-01-10 220410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566904/5afde49a-f232-1f14-03c4-ef69e624d78c.png)
*https://learn.microsoft.com/ja-jp/dotnet/api/system.io.streamwriter.-ctor?view=net-7.0#system-io-streamwriter-ctor(system-string-system-boolean)より

とあるので画像の通りファイルパスの指定と上書きしても良いか？を入力

<h3>実際の書き込み</h3>

```
writer.Write(jsonstr);
writer.Flush();
writer.Close();
```
そしてファイルの場所と上書き設定をしたクラスのメンバ関数を使ってJsonをストレージに書き込む。
終了！！！
ということだろうか。

以上、独学ではここらへんが限界だったので、有識者の方がいたらコメントなどで教えて貰えると助かります。

それでは。

<h2>番外編</h2>
StreamWriterクラスって

```
class streamWriter(path,bool)
{
    Write()
    {
        ＊ストリームに入力する,pathとboolを使う
    }
    Flush()
    {
        ＊ストレージに入力する
    }
    Close()
    {
        ＊処理終了
    }
}
```
こんな感じになっているのだろうか....
わからん