これちのPost-it

技術ネタをペラペラと

Unityでログインボーナスのようなスクリプトを書いた

ログインボーナスのようなものを今回実装したいと思います。
これはつまり、アプリを起動した時に日をまたいでいたら一度だけ処理を行うものです。何となく便利そうですよね。
これをUnityで実現するためには、
1. 日付の取得
2. 日付をデバイスに保持
3. 取得した日付とデバイスに保持された日付を比較
この3つの処理が必要です。
それぞれの実装方法を紹介したいと思います。

日付の取得

UnityのDateTimeというクラスを使います。

使い方

Datetime now = DateTime.Now;

こうやって時間を取得します。また、

int todayInt = 0;
todayInt = now.Year * 1000 + now.Month * 100 + now.Day;

このようにすることで年月日をそれぞれ取得できます。now.Year等の型はintです。
時間も簡単にとれるみたいです。
この例では、例えば2017年7月13日の場合、todayInt=20170713という値が格納されます。
こうやって日付をint型に変換することで、年月日の比較が簡単に出来ますね。

日付をデバイスに保持

値をUnityからデバイス(PCやAndroid)に保存するためにはPlayerPrefsというクラスを使います。
このクラスはデータのセーブ、ロードが行えます。
具体的に保存される場所や形式はここを見れば分かります。
例えば、Android端末では /data/data/pkg-name/shared_prefs/pkg-name.xml に保存されるようです。
保存される値は、KeyとValueのペアです。
例えば、Keyを"Date"とし、Valueを20170713とするペアが考えられます。

使い方

まずは下にPlayerPrefsクラスの使い方の例を書きました。

bool isDateExist;
int todayInt;

isDateExist = PlayerPrefs.HashInt("Date");   // Dateが保存されているか確認する。あったらtrueが返る
PlayerPrefs.SetInt("Date", 20170713);  // Dateを保存
todayInt  = PlayerPrefs.GetInt("Date");        // Dateの値を取得

これをうまいことコードとして書くとこのように書けたりします。

if (!PlayerPrefs.HasKey ("Date")) {
  Debug.Log("Dateというデータが存在しません");
  PlayerPrefs.SetInt ("Date", todayInt);
} else {
  if (todayInt - PlayerPrefs.GetInt ("Date") > 0) {
    PlayerPrefs.SetInt ("Date", todayInt);
    Debug.Log("次の日になりました");
  } else {
    Debug.Log("今日すでにログインしています");
  }
}

取得した日付とデバイスに保持された日付を比較

これはもうまとめてサンプルコードを載せちゃいます。

こんな感じです。参考になれば幸いです。