0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

使用してるソースコード

クラス宣言

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;
    }

プレイヤー情報の記載

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");
    }

セーブするための関数

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

どう動いてるの?

1つ1つ分解して考えてみました

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

クラス宣言

クラス=設計図

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変数を渡し、本格的なセーブが始まります

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

string jsonstr = JsonUtility.ToJson(player_status);

まずJsonUtility.ToJsonでは
渡すオブジェクトをJson({HP:10 Gold:300}といった感じの簡単なデータ)に変換するという関数で
スクリーンショット 2023-01-10 213844.png
リファレンスを見てみると、String形式のJsonデータが帰ってくるという事でした。

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

書き込みの設定をする

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://learn.microsoft.com/ja-jp/dotnet/api/system.io.streamwriter.-ctor?view=net-7.0#system-io-streamwriter-ctor(system-string-system-boolean)より

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

実際の書き込み

writer.Write(jsonstr);
writer.Flush();
writer.Close();

そしてファイルの場所と上書き設定をしたクラスのメンバ関数を使ってJsonをストレージに書き込む。
終了!!!
ということだろうか。

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

それでは。

番外編

StreamWriterクラスって
class streamWriter(path,bool)
{
    Write()
    {
        *ストリームに入力する,pathとboolを使う
    }
    Flush()
    {
        *ストレージに入力する
    }
    Close()
    {
        *処理終了
    }
}

こんな感じになっているのだろうか....
わからん

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?