【Unity】リワード広告の視聴間隔を制限する

自作ゲームでのリワード広告の視聴間隔を制限した例

リワード広告を連続視聴されてゲームバランスを崩壊させない為の対策。
(分指定)
(端末の時間を取得しているので、不正対策はされていない)

前提

  • 別でセーブ機能の実装。
    (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へ表示

  1. リワード広告視聴確認画面オープンボタンの良き所にTextMeshProを設置。
  2. インスペクターから紐付けしておく。


//制限時間の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;
		}
	}

タイトルとURLをコピーしました