unityでたくさんのパラメータを1つのセーブデータで保存する

HPやアイテム所持フラグなどたくさんのパラメータを保存する時。今までは

PlayerPrefs.SetInt("SVhp", hp);     //HPをセーブ
PlayerPrefs.SetInt("SVmp", mp);     //MPをセーブ

こんな風にひとつひとつセーブしていたのですが多くの項目をPlayerPrefsで保存するのはあまり良くないらしいので、1つのセーブデータで保存できないかといろいろ考えました。

まず各パラメータを区切り文字カンマ「,」で区切って一つの文字列に結合してセーブ。

public void SaveR()
    {

	strget = null;      //文字列初期化。こいつに文字列型に変換したデータを全部足してぶち込む

        for (int i = 0; i < 10; ++i)                        //アイテムデータを文字列で結合
        {
            strget = strget + Item[i].ToString()+",";       //数値型を文字列型に変換して区切り記号のカンマ付けて足していく
        }

        for (int i = 0; i < 20; ++i)                        //宝箱データを文字列で結合
        {
            strget = strget + Tres[i].ToString() + ",";
        }

        strget = strget + Aria.ToString() + ",";    //エリア情報
        strget = strget + KenLV.ToString() + ",";   //剣のレベル
        strget = strget + Money.ToString() + ",";   //お金

        posMX = transform.position.x;     //プレイヤー位置情報
        posMY = transform.position.y;
        posMZ = transform.position.z;

        strget = strget + posMX.ToString("F2") + ",";       //ポジション情報はフロート型なので小数第2まで保存。
        strget = strget + posMY.ToString("F2") + ",";
        strget = strget + posMZ.ToString("F2") + ",";

        strget = strget + mp.ToString() + ",";    //MP
        strget = strget + hp.ToString() + ",";    //HP
        strget = strget + maxhp.ToString();       //最大HP


	PlayerPrefs.SetString("svItmTre", strget); 		//文字列型でセーブ
    }

↑ こんな感じでカンマで区切ってひとつの文字列にする。
エリアは3で所持コインは101610でその後ろが位置情報です。
これをロードしてみます。

ロードするときは読み込んだセーブデータを区切り記号のカンマで配列変数に分解し、数値型に変換して各データにぶち込む。文字列を指定した区切り文字で分解してくれるSplit命令がすごい便利で感動しました。

public void LoadR()
    {

	LoadMan = PlayerPrefs.GetString("svItmTre", null); 	//ロード


        //string[] strArray = strget.Split(',');        //この命令 めちゃ便利ね~
        string[] strArray = LoadMan.Split(',');         //読み込んだセーブデータを区切り記号のカンマで配列変数に分解。

        for (int i = 0; i < 10; ++i)
        {
            Item[i] = int.Parse(strArray[i]);           //あとはそれぞれの配列変数を数値型に変換して各データにぶち込めば完了
        }

        int a = 0;
        for (int i = 10; i < 30; ++i)
        {
            Tres[a] = int.Parse(strArray[i]);
            a++;
        }

        Aria = int.Parse(strArray[30]);
        KenLV = int.Parse(strArray[31]);
        Money = int.Parse(strArray[32]);
        posMX = float.Parse(strArray[33]);
        posMY = float.Parse(strArray[34]);
        posMZ = float.Parse(strArray[35]);
        mp = int.Parse(strArray[36]);
        hp = float.Parse(strArray[37]);
        maxhp = float.Parse(strArray[38]);


        this.transform.position = new Vector3(posMX, posMY, posMZ-7);             //セーブした位置に移動

    }
スタート地点のエリア0でLoad dataでロードすると
エリア3に移動しました。
所持コインも101610でちゃんとセーブとロードができました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です