https://qiita.com/NWaka_1415/items/1b0c7fd328ae8ca5ad7a

はじめまして,Nわかです。

初めての投稿でもあるので、軽く自己紹介。

現在起業した友人のもとでUnityエンジニアとして,大学に通いつつ働かせてもらっています。

現在1つのスマホ向けカジュアルゲーム制作を任されています。リモートでOKとのことで,ほぼ家や授業の合間などに作業させてもらっています。ホンマありがたいです。

その担当したゲームの機能の一つに**「オフライン報酬」**というものがあります。これはゲームをプレイしていなくても,ゲーム内コインがゲームをやっていなかった時間分貰えるもらえるというものです。

ソシャゲの時間経過で回復する体力(ゲームプレイ時に消費)などが近しい機能でしょう。

この機能を実装するにあたって,結構ググりましたが,直接的な記事は見当たりませんでした。

自分用の備忘録として,そして似たような機能を実装する方の助けに少しでもなれればと思います。

今回実装するにあたり,決められていた仕様をざっくりと。

  1. サーバーとのやり取りなどはしない
  2. 1分当たりに獲得できる報酬の量は決まっており,その量は成長させられる
  3. アプリをキルして再開もしくはキルせず再開(いったん別アプリをアクティブにしていた)のどちらの場合においても,報酬が発生していればポップアップ表示を行い報酬が獲得できる

本当にざっくりと、ですが。

それでは実際に実装していくわけですが,やることとして大まかに2つ項目があります。

サーバーとのやり取りをしないとのことなので,ローカルで時間を取得して前回の時間との差分を出して報酬を計算してあげる必要があります。

    private void SetOfflineEarning()
    {
        double minutes = CalcSecond(DateTime.UtcNow, _endTime) / 60;
        _endTime = DateTime.UtcNow;
        _earnOffline = (int) minutes * _offlineEarning;
        Save();
    }

DateTime.UtcNowで現在のUTC時刻を取得可能。Save();では,今回の機能に関係あるものでは_endTimeのみ保存しています。また,記載していませんが,ゲーム開始時に_endTimeを読み込んでいます。

1分あたりの報酬なので,今回は60で割っています。