Unityでストップウォッチを作る その11 データの保存

Pocket

Unityでストップウォッチを作るシリーズ半年ぶりの更新で、最後になります。今回はアプリを終了しても継続して計測できるようにデータを保存したいと思います。

Stopwatch.csに以下のコードを追加してください。ChangeState関数に関しては、最後に1行だけの追加になります。

//
// Stopwatch.csの一部
//
void Awake() {
    Load();
}
const string lastStopTimeKey = "LastStopTime";
const string startDateTimeKey = "StartDateTime";
const string stateKey = "State";
void Save() {
    string lastStopTimeString = lastStopTimeSpan.Ticks.ToString();
    string dateTimeString = startDateTime.Ticks.ToString();
    PlayerPrefs.SetString(lastStopTimeKey, lastStopTimeString);
    PlayerPrefs.SetString(startDateTimeKey, dateTimeString);
    PlayerPrefs.SetInt(stateKey, (int)state);
}
void Load() {
    if (PlayerPrefs.HasKey(lastStopTimeKey) &&
        PlayerPrefs.HasKey(startDateTimeKey) &&
        PlayerPrefs.HasKey(stateKey)) {
        string lastStopTimeString = PlayerPrefs.GetString(lastStopTimeKey);
        if (!string.IsNullOrEmpty(lastStopTimeString)) {
            lastStopTimeSpan = new TimeSpan(long.Parse(lastStopTimeString));
        }
        string dateTimeString = PlayerPrefs.GetString(startDateTimeKey);
        if (!string.IsNullOrEmpty(dateTimeString)) {
            startDateTime = new DateTime(long.Parse(dateTimeString));
        }
        state = (StopwatchState)PlayerPrefs.GetInt(stateKey);
    }
}
void ChangeState(ref bool circleAnim) {
    ButtonType buttonType = ButtonType.Background;
    
    // ... 中略
    
        FlashBackground(0);
    }
    
    // 次の行を追加
    Save();
}

解説

保存したいデータは3つだけですので、簡単に保存が出来るPlayerPrefsを使っています。ただし、PlayerPrefsに保存できる型は「int」「float」「string」の3つだけです。

Save()関数でデータの保存をしています。今回のコードで保存しているのはStopwatchクラスの変数の「state」「lastStopTime」および「startDateTime」の3つです。stateはintで大丈夫なのですが、他の2つはTicksというlong(リファレンスを見ると64bit)の値を保存したいので、intを使うのはちょっと不安です。なので、一旦文字列に変換して、stringで保存をしています。

Load()関数では保存したデータから読み込みをしています。long.Parseで文字列から数値に変換していますが、このParse関数は文字列から数値を探せなかったときに例外を発生させます。今回のコードのように何もしていない状態で例外が飛んでくると問題が起きますので、念のためにtryで囲って例外をキャッチしたら無視するなり、エラーダイアログを出すなりした方がよいと思います。

サンプルプロジェクト

これで最後という事で、プロジェクトをgithubにアップしてあります。
BigStopWatchForUnity

前へ

コメントを残す

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