Developer

【Unity実践】#18 PlayerPrefsでコインを保存する【ランゲーム】
2021.12.08
Lv2

【Unity実践】#18 PlayerPrefsでコインを保存する【ランゲーム】

今回の内容

今回は PlayerPrefs を使って獲得したコインを保存する仕組みを作成していきます。

※初めての方はこちらから
【第1回記事】導入とサンプルの紹介

方針

まずは実装方針を整理します。
ステージをまたいでデータを管理する必要があるので、使う機能は PlayerPrefs です。
PlayerPrefs を使って、以下の仕様でコインを管理します。

・データ型は整数型
・キーの名前は「coinNum
・初期値は「0

PlayerPrefsの使い方は、以下記事を参考にしてください。
PlayerPrefsでデータをセーブ&ロードする方法

また、実装は以下の3つに分けて進めます。
・ゲーム開始時にこれまでの枚数をロード
・クリア時に現在のステージでの獲得数を表示
・クリア時にコインの総獲得数を更新

ゲーム開始時にこれまでの枚数をロード

コイン関連の機能はこれまでに続いて、GameManagerScript に記述します。
ゲーム開始時に PlayerPrefs を使ってこれまでの枚数をロードし、その値を tempCoinNum の初期値とします。

GameManagerScript の Startメソッドを以下の通り書き換えます。

~ 省略 ~

public class GameManagerScript : MonoBehaviour
{
  ~ 省略 ~

    void Start()
    {
        // ステージ内のコインの枚数を取得
        stageCoinNum = GameObject.FindGameObjectsWithTag("Coin").Length;

        // これまでの獲得コイン数をロード(初回は0)
        tempCoinNum = PlayerPrefs.GetInt("coinNum", 0);

        // ステータスをPlayに
        status = GAME_STATUS.Play;
    }
  
  ~ 省略 ~

これでゲーム開始時のロード処理は完成です。
クリア時の保存処理を作成していないので、現状はまだ動作に変わりはありません。

クリア時に現在のステージでの獲得数を表示

これまでの実装では、tempCoinNum がそのステージでの獲得コイン数のような扱いでした。
しかし先ほどの実装で、tempCoinNum の初期値にそれまでの獲得数が設定されたので、
tempCoinNum はそれまでの獲得数に、現在のステージでの獲得数を足した枚数となっています。

そこで、現在のステージでの獲得数を以下の計算により取得します。

現在のステージでの獲得数 = tempCoinNum – ステージ開始時のコイン枚数

GameManagerScript の Updateメソッドを下記の通り変更します。

~ 省略 ~

public class GameManagerScript : MonoBehaviour
{
  ~ 省略 ~

    void Update()
    {
        if (status == GAME_STATUS.Clear)
        {   
            // 現在のステージで獲得したコインの枚数
            int getCoinNum = tempCoinNum - PlayerPrefs.GetInt("coinNum", 0);

            resultCoinText.text = getCoinNum.ToString().PadLeft(3) + "/" + stageCoinNum;
            clearUI.SetActive(true);
        }

        coinNumText.text = tempCoinNum.ToString();
    }

  ~ 省略 ~

getCoinNum が、先ほどの計算式により求めた、現在のステージでのコインの獲得数です。
14行目では、元々 tempCoinNum としていた箇所を getCoinNum に変更しました。

ゲームをプレイして、これまで通りの動作となっていればここまでの実装は成功です。

クリア時にコインの総獲得数を更新

最後に、クリア時にコインの総獲得数を更新する処理を作成します。
今回の記事の最初に実装したステージ開始時のロード処理の結果、
tempCoinNum がステージクリア時点でのコインの総獲得数となっています。
つまり、PlayerPrefs に保存するのは tempCoinNum となります。

編集するのは GameManagerScript の Updateメソッドです。

~ 省略 ~

public class GameManagerScript : MonoBehaviour
{
  ~ 省略 ~

    void Update()
    {
        if (status == GAME_STATUS.Clear)
        {   
            // このステージで獲得したコインの枚数
            int getCoinNum = tempCoinNum - PlayerPrefs.GetInt("coinNum", 0);

            resultCoinText.text = getCoinNum.ToString().PadLeft(3) + "/" + stageCoinNum;
            clearUI.SetActive(true);

            // コインを保存
            PlayerPrefs.SetInt("coinNum", tempCoinNum);

            enabled = false;
        }

        coinNumText.text = tempCoinNum.ToString();
    }

  ~ 省略 ~

なお、20行目の「enabled = false」は Update を停止させる目的で記述しています。
これまで書き忘れていたので、ここで追加する形となりましたが、
コインの保存と直接関係がある処理ではありません。

ここまでで実装は完了となりますので、シーンを数回プレイして動作確認をしてみて下さい。
ゲーム開始時に、画面右上のコインの枚数がこれまで獲得したコインの総数となっていれば成功です。

おわりに

今回は PlayerPrefs を使ってコインの保存機能を作成しました。
ゲームデータのセーブやロードは多くのゲームに実装されている仕組みですし、
PlayerPrefs は Unity における代表的な実装方法ですので、是非慣れておきましょう。

 

 
関連リンク ➡ 「初心者のための」Unityゲーム制作 目次

© Unity Technologies Japan/UCL