Skeyllのブログ

インディーデベロッパー

【Unity】ゲームの記録を複数保存する

 ゲームの結果や得点を複数記録してスコア履歴やハイスコアランキングのようなものを作る場合は、鍵に整数型を使って記録した番号も保存するか、新しく記録する際に降順でデータを上書きしていく。ここではPlayerPrefsで後者を使ってスコア履歴を実装する方法を紹介する。Jsonやセーブするアセットを使って保存する場合も同じ方法で実装できる。

得点履歴の作成

//This script is released under the MIT License.
using UnityEngine;
using System.Collections;

public class SaveManager : MonoBehaviour
{
    public void SaveScore()
    {
        //1
        OverwriteRecord();
        //4
        int score = GetComponent<Script>().score;
        PlayerPrefs.SetInt("Score1", score);

        PlayerPrefs.Save();
    }

    void OverwriteRecord()
    {
        //2
        int saveNum = 10;
        //3
        while (saveNum >= 1)
        {
            int loadNum = saveNum - 1;
            
            if (PlayerPrefs.HasKey("Score" + loadNum.ToString()))
            {
                int loadScore = PlayerPrefs.GetInt("Score" + loadNum.ToString());

                PlayerPrefs.SetInt("Score" + saveNum, loadScore);

                saveNum -= 1;
            }
            else
            {
                saveNum -= 1;
            }
        }
    }
}
1.データを上書きするメソッドを呼ぶ

 複数の記録を保存する場合は降順でデータを保存しなおさなければならない。もし、先に上書きしなければ、新たに保存したデータが既存のデータを上書きすることになる。そのため、最新のデータを保存する前に一度上書きするメソッドを呼ぶ。

2.保存するデータの数を決める

 保存するデータの数を宣言する。ここで宣言した数分の履歴が生まれる。

3.既存のデータの上書き

 whileを使って降順でデータを上書きしていく。2で決めた数が一番最後のデータであり、そこに1減らした鍵で保存してあるデータを上書きする。通常の記録では昇順で保存していくため、一定の回数保存するまでは後ろの数字にデータは保存されていない。そのため、鍵の有無を確認して、あった場合のみデータの上書きをする。そして鍵があった場合もなかった場合も数字を減らし、これを1になるまで繰り返す。

4.最新のデータを保存する

 保存する変数を宣言する。PlayerPrefsではInt,Float,Stringの三種類が保存できる。ここでは得点のみを保存するため一つのみ宣言しているが、ほかにも保存する場合は保存するものに応じた変数を宣言する。ここではscore1つだけを宣言してるため、ここで参照もしているが、複数記録する場合はあらかじめStart等で取得しておくのがいいだろう。なお、このスクリプトから参照するため、取得先の保存する変数はpublicにする必要がある。もし、同一スクリプト内で記録を実装するならprivateでいい。

使用例

 Scriptという名前のスクリプトとScoreManageを空のオブジェクトにアタッチする。UIのButtonを三つ用意しそれぞれScore、Save、Loadという名前に変更する。各ButtonのOnClickイベントに上記の空のオブジェクトの対応するメソッドを登録する。これでScoreボタンを押した数だけ点数が増え、Saveを押すとデータを保存、Loadを押すとログに保存したデータが表示される。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Script : MonoBehaviour
{
    public int score;
    SaveManager saveManager;

    void Start()
    {
        saveManager = GetComponent<SaveManager>();
    }

    public void GetScore()
    {
        score += 1;
    }

    public void Save()
    {
        saveManager.SaveScore();
    }

    public void Load()
    {
        int saveNum = 1;

        while (saveNum <= 10)
        {
            if (PlayerPrefs.HasKey("Score" + saveNum.ToString()))
            {

                int loadScore = PlayerPrefs.GetInt("Score" + saveNum.ToString());

                Debug.Log(saveNum + "のデータは" + loadScore);
                saveNum += 1;
            }
            else
            {
                saveNum += 1;
            }
        } 
    }
}

ライセンス

Copyright (c) 2019  Skeyll

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


参考
Unity - Scripting API: PlayerPrefs
https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

プライバシーポリシー  ©Skeyll 2019- All Rights Reserved.