【第5回】〜Easy Save〜保存、ロードを簡単に実装できる

2021年7月8日

Easy Saveとは

Moodkieよりリリースの、

簡単に保存、ロードなどを実装できるアセット

シンプルなコードで変数などの保存、呼び出しなどを設定できますので、

管理もしやすくゲームをつくる上で必要なスコア管理、クリア実績だったりで活用できます。

ステージ1をクリアしないとステージ2がアンロックされない、とか

クリア時のスコアをセーブしたい、とか

このアセットがあればそういった場面でかなり使えるアセットになっています。

どんな人にオススメ?

  • アンロックを実装するのに、クリアを保存したい。
  • 獲得したスコアを変数に保存させたい&呼び出したい。
  • 変数の値を管理しやすくしたい。
  • とにかく簡単に実装したい!
  • そもそも保存ってどうコードで書けばいい?

使ってみた

早速インポートしてみます。

インポート後に上部メニューからTools→Easy Save 3→Settings

なんかいろいろ項目があるのですが、

Clear Persistent Data Pathで、

セーブされた値をクリアしたりできる

ので、ウインドウを用意しておきます。

以前クイズアプリを製作した際、ステージのクリア情報やスコアの保存を実装していて、

テストやリリースの為にビルドする際、ここでリセットしていました。

そして即席のぜんぜん面白さもなさそうですみませんが汗

ササッと簡単なゲームをつくってみたので、それで検証してみます。(こんなのでもサッパリ作れなかった頃の自分もいると思うとできるようにはなっている・・・のかな)

はい、5秒以内に何回ボタンをクリックしたかが出てきて終わりって状態になってます。

参考になるかわかりませんがコードはそれぞれのシーンに1つずつスクリプトを以下のように用意しているだけです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class EasySaveTest : MonoBehaviour
{
    public GameObject text;

    public void OnStartButton()
    {
        SceneManager.LoadScene("Main");
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class MainManager : MonoBehaviour
{
    public Text timeText;
    public GameObject panel;
    public Text scoreText;
    public Text countText;

    float time = 5f;
    int seconds;

    int score = 0;

    void Start()
    {
        timeText = timeText.GetComponent<Text>();
        scoreText = scoreText.GetComponent<Text>();
        countText = countText.GetComponent<Text>();

        countText.text = score.ToString();
    }

   
    void Update()
    {
      time -= Time.deltaTime;
      seconds = (int)time;
      timeText.text = seconds.ToString();

        if(seconds < 1)
        {
            panel.SetActive(true);
            scoreText.text = score.ToString();
        }
    }

    public void CountUpButton()
    {
        score++;
        countText.text = score.ToString();
    }

    public void OnGotoTitleButton()
    {
        SceneManager.LoadScene("Title");
    }
}

名前が適当ですみません。

それぞれのシーンに空のオブジェクトを置いてタイトルシーンにEasysaveTestを、ゲームシーンにMainManagerを配置してそれぞれのオブジェクトをアタッチしています。

さて、このままだとゲームが終わってタイトルに戻ったら何もなかったかのように無の感情に襲われます・・・

ゲームが終わったら前回のスコアとクリアしたよ!ぐらいわかるようにしてみたいです。

そこで!

EasySaveの魔法のコードを追加してみます!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class EasySaveTest : MonoBehaviour
{
    public GameObject text;
    public Text bestScoreText;
    public GameObject renge;
    int bestScore;

    public void OnStartButton()
    {
        SceneManager.LoadScene("Main");

    }

    // Start is called before the first frame update
    void Start()
    {
        bestScore = ES3.Load("count",defaultValue:0);
        bestScoreText = bestScoreText.GetComponent<Text>();
        bestScoreText.text = bestScore.ToString();

        if(bestScore < 10)
        {
            renge.SetActive(false);
        }
        else
        {
            renge.SetActive(true);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class MainManager : MonoBehaviour
{
    public Text timeText;
    public GameObject panel;
    public Text scoreText;
    public Text countText;

    float time = 5f;
    int seconds;

    int score = 0;

    void Start()
    {
        timeText = timeText.GetComponent<Text>();
        scoreText = scoreText.GetComponent<Text>();
        countText = countText.GetComponent<Text>();

        countText.text = score.ToString();
    }

   
    void Update()
    {
      time -= Time.deltaTime;
      seconds = (int)time;
      timeText.text = seconds.ToString();

        if(seconds < 1)
        {
            panel.SetActive(true);
            scoreText.text = score.ToString();
            ES3.Save<int>("count",score);
        }
    }

    public void CountUpButton()
    {
        score++;
        countText.text = score.ToString();
    }

    public void OnGotoTitleButton()
    {
        SceneManager.LoadScene("Title");
    }
}

ES3.Save や

ES3.Load がそれぞれ保存と呼び出しを行なっています。

第一引数にKeyを決めてSaveの場合は値や変数を第二引数に指定してあげるとKeyに保存されます。

ゲーム開始時にロードをしていますが、値が保存されていないとエラーになるので

defaultValue:値 を使用してなにも保存されていなかったらこれを保存するというのを設定しています。

これでクリックを10以上したらタイトル画面にわんこが出てくるようにしています!笑

再生してみると・・・

7回のクリックだとベストスコアが表示されるだけですね。

”count”の中身が何もないので最初ベストスコアは”0”と表示されて、

ゲーム終了後にクリック回数がES3.Saveにて保存されて、

タイトルに戻ると”7”になっています!

10回以上クリックした場合は・・・

でてきました!笑

とりあえず最短ルートで試してみましたがたったこれだけで保存とロードができました。

他にも暗号化とか削除があるのですが、割愛させていただきますので、あとはみなさん購入した後是非試してみてください!笑

ちなみに、このままゲーム製作を続けていくと値が保存されたままなので、リセットするにはこちらの・・・

Clear Persistent Data Pathを押せばクリアされるんでしたね。

リセットが必要でこちらで初期化しましょう。

まとめ

いかがでしたでしょうか?

気になった方は是非アセットストアでチェックしてみてください!

こちら↓

ちなみに・・・・

ゲーム内で使用していた犬のスプライトはこちらのアセットを使いました。

Unity始めたての頃に、私の愛犬の黒柴「れんげ」にみたてた2D素材がないかなーと探していた時にみつけたアセットです。

って久しぶりにみるとバージョン2になってて、より可愛らしくなってアニメーションまでついてる!!!

今回使っていたのは前のバージョンのものです。

これはまたこのアセットも紹介しなくては・・・!

・・・と話を戻しまして、

Easy Saveはきっとゲーム開発をされるほとんどの方々の力強いサポートとなります。

実装しやすく、コードもシンプルなので管理しやすい。

その分実装にかける時間とスタミナも少なくできますね。

それでは今回はこんな感じで。

また次回もお願いします!💤