リワード広告を連続視聴されてゲームバランスを崩壊させない為の対策。
(分指定)
(端末の時間を取得しているので、不正対策はされていない)
前提
- 別でセーブ機能の実装。
(JsonでもPlayerPrefsでも何でも良い) - コード内の「ゲームデータ」部分は自分のセーブデータクラスに差し替えておく。
コード
GameData
- メインのゲームデータを保存しているクラスに以下のコードを追記。
//前回リワード広告を視聴した時の日時。
public long earnedRewardDateTime = 0;
//視聴制限する間隔を指定(分)。
public static readonly int RewardedAdIntervalMinutes = 60;
//指定した分を秒数に変換している。
public static readonly long RewardedAdInterval = System.TimeSpan.TicksPerMinute * RewardedAdIntervalMinutes;
視聴制限が解かれていない場合の処理の弾き方
public void ButtonListenerOpenModalRewardedAd()
{
if (System.DateTime.Now.Ticks - ゲームデータ.earnedRewardDateTime <= ゲームデータ.RewardedAdInterval)
return;
//ココでリワード広告視聴確認画面を開く。
}
リワード広告を視聴した後
public void EarnedReward()
{
//ココでリワード報酬を加算する。
ゲームデータ.earnedRewardDateTime = System.DateTime.Now.Ticks;
//セーブを忘れずに。
ゲームデータ.Save();
}
制限時間をTextMeshProへ表示
- リワード広告視聴確認画面オープンボタンの良き所にTextMeshProを設置。
- インスペクターから紐付けしておく。
//制限時間のGameObjectを紐付けしておく。
[SerializeField]
GameObject rewardedAdIntervalGo;
//同、制限時間のTextMeshProを紐付けしておく。
[SerializeField]
TextMeshProUGUI rewardedAdIntervalTmp;
//コルーチン管理用。
Coroutine rewardedAdIntervalCounter;
//制限時間をチェックする間隔を指定(秒)。
WaitForSeconds rewardedAdIntervalCounterWait = new WaitForSeconds(1.0f);
//Minutesの略の文字列を無駄が出ないように定数化。
static readonly string MinStr = "min";
//適当にやるならセーブデータロード完了時から常駐させる。きっちりやるなら制限時間の表示/非表示のタイミングで細かく切り替え。
void StartRewardedAdIntervalCounter()
{
//一応重複チェック。
if (rewardedAdIntervalCounter != null) {
StopCoroutine(rewardedAdIntervalCounter);
}
rewardedAdIntervalCounter = StartCoroutine(RewardedAdIntervalCounter());
}
IEnumerator RewardedAdIntervalCounter()
{
while (true) {
//制限時間が経過したらTextMeshProを非表示にする。
if (ゲームデータ.RewardedAdInterval <= System.DateTime.Now.Ticks - ゲームデータ.earnedRewardDateTime) {
if (rewardedAdIntervalGo.activeSelf) {
rewardedAdIntervalGo.SetActive(false);
}
yield return rewardedAdIntervalCounterWait;
continue;
}
if (!rewardedAdIntervalGo.activeSelf) {
rewardedAdIntervalGo.SetActive(true);
}
rewardedAdIntervalTmp.SetText("{0}" + MinStr, ゲームデータ.RewardedAdIntervalMinutes - (System.DateTime.Now.Ticks - ゲームデータ.earnedRewardDateTime) / System.TimeSpan.TicksPerMinute);
yield return rewardedAdIntervalCounterWait;
}
}
//ストップする時用。
void StopRewardedAdIntervalCounter()
{
if (rewardedAdIntervalCounter != null) {
StopCoroutine(rewardedAdIntervalCounter);
rewardedAdIntervalCounter = null;
}
}