セーブロード処理

2021/01/28

Unity

JsonUtilityを使ったやり方です。
使用するときはusing System.IO;を追加します。

最初に以下2つのスクリプトを作成します。
・SaveData
・SaveManager

SaveDataはセーブデータに使うための変数を
まとめたもの。
SaveManagerは実際の処理するものです。

SaveDataの内容は以下。
using UnityEngine;

[System.Serializable]
public class SaveData
{
    public int Money;

    //独自クラスを利用する場合
    public MainStData Status; 
}

[System.Serializable]
public struct MainStData 
{
    public int Hp;
    public int Mp;
}

クラスの前に[System.Serializable]をつけます。
独自クラスを利用する場合も
そのクラスにつける必要があります。

今回は簡単にお金とステータスの情報をもつ
int変数を定義しています。

SaveManagerの内容は以下 長いので
Awake()処理のみ記載
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class SaveManager : MonoBehaviour
{
    //ファイル
    string filePath;
    public static SaveData save = new SaveData();
    public static SaveManager instance;

    int money;
    MainStData Status;

    public Text[] Text; //表示用

    void Awake()
    {
        filePath = Application.persistentDataPath + "/" + ".savedata.json";

        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }
        else
        {
            instance = this;
            DontDestroyOnLoad(this);
        }
    }

初期処理は最初にファイルパスを設定しています。
Application.persistentDataPathはWindowsの場合は以下。
C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName
xxxx
はPCのユーザ名
CompanyName/ProductNameはビルド設定→プレイヤー設定の
企業名、プロダクト名になります。

img_20210122-060952.jpg
instanceはシーン変更した時用です。
一つのシーンで作る場合は不要です。


セーブ処理は以下です。
    public void Save()
    {
        //セーブデータ
        save.Money = money;
        save.Status.Hp = Status.Hp;
        save.Status.Mp = Status.Mp;

        string json = JsonUtility.ToJson(save);
        StreamWriter streamWriter = new StreamWriter(filePath);
        streamWriter.Write(json);
        streamWriter.Flush();
        streamWriter.Close();
    }
保存する値を定義したSaveData型のsaveに入れ、
そのデータを指定したファイルに書き込みます。


ロード処理
    public void Load() //ロード
    {
        if (File.Exists(filePath))
        {
            StreamReader streamReader;
            streamReader = new StreamReader(filePath);
            string data = streamReader.ReadToEnd();
            streamReader.Close();
            save = JsonUtility.FromJson<SaveData>(data);

            //ロードデータ
            money = save.Money;
            Status.Hp = save.Status.Hp;
            Status.Mp = save.Status.Mp;

        }
        else //初回起動時
        {
            //初回のみ処理する場合
        }
    }
ファイルが存在したらデータをロードします。

以下は処理確認用です。
確認用にセーブロードボタンを作成します。
    public void SaveBtn() //Saveボタンクリック
    {
        money = 5000;
        Status.Hp = 100;
        Status.Mp = 80;

        Save();//セーブ
    }
    public void LoadBtn() //Saveボタンクリック
    {
        Load();//ロード
        //表示
        Text[0].text = money.ToString();
        Text[1].text = Status.Hp.ToString();
        Text[2].text = Status.Mp.ToString();
    }
セーブするときにテスト用に値をいれてセーブ処理をしています。
ロード後はそれを表示します。

一旦セーブボタンをおして指定のファイルが
作られているか確認します。

img_20210122-061015.jpg
終了させてからもう一度起動してロードボタンを押します。
img_20210122-061042.jpg

保存する値の変数はSaveManager自体で持ってもいいですが、
ゲームで使う変数を管理するクラスを別途作って
そこで持っておいた方がいいかと思います。