chicken_dy/Assets/Scripts/ToukaGames/ADSScripts/ToukaSDK/internal/ToukaInterstitialTimer.cs

175 lines
7.7 KiB
C#
Raw Normal View History

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using Touka.GameLogic;
public class ToukaInterstitialTimer : ToukaSingletonMonoBehaviour<ToukaInterstitialTimer>
{
private int IV1Times = 0;
private int IV2Times = 0;
#region
float startedTime = 0;
/// <summary>
/// 是否达到了可展示插屏的条件
///
/// 条件前N次触达插屏点不展示插屏。达到前N次后第N+1次展示插屏后续每隔M次展示一次插屏。插屏之间间隔不少于15s。
///
/// 1. 前N次触达不弹出插屏 在线参数-IV1_PreTimesN_OnlineParam
/// 2. 后续每隔M关弹出一次插屏 在线参数-IV1_PerM_OnlineParam
/// 3. 插屏与上次间隔时间不少于15s 在线参数-IV1_MinTimeL_OnlineParam
/// 三个条件均允许在线参数控制。
///
/// *IVType 区分不同点位插屏的条件控制。如果整个游戏只有一种条件控制那都用IV1就可以。如果某些点位要有第二种条件控制那对应的点位传IV2就可以。
/// 目前通用封装只支持两种不同的条件控制。逻辑相同只是3个条件参数用不同的在线参数控制。如需多个条件请自行进行扩展
/// </summary>
/// <param name="_ivType"> 根据传入 IVType 区分不同插屏条件控制 </param>
/// <returns></returns>
public bool CanShow(ToukaSDKManager.IVType _ivType)
{
// 【1】前N次不展示插屏
if (!CheckIfReachFirstNTimes(_ivType))
{
Debug.Log("[ToukaInterstitialTimer]Check 「前N次不展示插屏」 条件是否满足 : False直接返回。不播插屏。");
return false;
}
// 达到N次后第N+1次直接展示插屏
bool canShowDirectly = false;
if(_ivType == ToukaSDKManager.IVType.IV1)
{
if (ToukaUtils.IfFirstCheckPlayerPrefs(StaticStringsPlayerPrefs.TKInner_HasFirstShowIV1))
{
canShowDirectly = true;
}
}else if(_ivType == ToukaSDKManager.IVType.IV2)
{
if (ToukaUtils.IfFirstCheckPlayerPrefs(StaticStringsPlayerPrefs.TKInner_HasFirstShowIV2))
{
canShowDirectly = true;
}
}
if (!canShowDirectly) // 非第N+1次不能直接展示广告 【2】要判断是否达到了间隔次数
{
int currTimes = 0; // 当前达到的间隔次数
int needTimes = 0; // 需要达到的间隔次数
if (_ivType == ToukaSDKManager.IVType.IV1) // IV1 需要达到的间隔次数
{
currTimes = ++IV1Times;
needTimes = int.Parse(StaticOnlineParams.IV1_PerM_OnlineParam.DefaultValue);
}
else if (_ivType == ToukaSDKManager.IVType.IV2) // IV2需要达到的间隔次数
{
currTimes = ++IV2Times;
needTimes = int.Parse(StaticOnlineParams.IV2_PerM_OnlineParam.DefaultValue);
}
if (currTimes < needTimes) // 没有达到间隔次数,直接返回
{
Debug.Log("[ToukaInterstitialTimer] Check 「2次插屏间隔次数」 条件是否满足False直接返回。不播插屏。当前次数"+ currTimes + ", 需要达到次数:" + needTimes);
return false;
}
else // 达到间隔次数了,清空间隔次数,可以直接播插屏广告
{
if (_ivType == ToukaSDKManager.IVType.IV1)
{
IV1Times = 0;
}
else if (_ivType == ToukaSDKManager.IVType.IV2)
{
IV2Times = 0;
}
Debug.Log("[ToukaInterstitialTimer]达到间隔次数,可进行最小时间间隔检测。当前次数:" + currTimes + ", 需要达到次数:" + needTimes);
}
}
// 【3】判断是否达到最小时间间隔
float ivIntervalTime = float.Parse(StaticOnlineParams.IV1_MinTimeL_OnlineParam.DefaultValue); // IV1 最小时间间隔
if(_ivType == ToukaSDKManager.IVType.IV2)
{
ivIntervalTime = float.Parse(StaticOnlineParams.IV2_MinTimeL_OnlineParam.DefaultValue); // IV2 最小时间间隔
}
bool canShowFlg = Time.time - startedTime > ivIntervalTime; // 达到最小间隔时间,可以展示插屏;否则不可以
Debug.Log("[ToukaInterstitialTimer] Check 「2次插屏最小间隔时间」 条件是否满足:" + canShowFlg);
Debug.Log("[ToukaInterstitialTimer] 判断插屏间隔时间 : " + (Time.time - startedTime) + " , 当前时间:" + Time.time + " , 上次开始时间 " + startedTime + " ,所需要的间隔时间: " + ivIntervalTime);
// 可展示插屏,清空累计次数
if (canShowFlg)
{
if (_ivType == ToukaSDKManager.IVType.IV1)
{
IV1Times = 0;
}
else if (_ivType == ToukaSDKManager.IVType.IV2)
{
IV2Times = 0;
}
}
return canShowFlg;
}
/// <summary>
/// 检测是否达到N次 - 前N次不弹出插屏广告
/// </summary>
/// <param name="_ivType"></param>
/// <returns></returns>
public bool CheckIfReachFirstNTimes(ToukaSDKManager.IVType _ivType)
{
bool canShow = false;
if (_ivType == ToukaSDKManager.IVType.IV1)
{
int reachTimes01 = ToukaUtils.GetPlayerPrefsIntByKey(StaticStringsPlayerPrefs.TKInner_IV1ReachTimes, 0);
if (reachTimes01 >= int.Parse(StaticOnlineParams.IV1_PreTimesN_OnlineParam.DefaultValue))
{
Debug.Log("[ToukaInterstitialTimer]插屏 IV1 触达次数够了, reachTimes01 : " + reachTimes01 + " ,需要达到次数:"+ int.Parse(StaticOnlineParams.IV1_PreTimesN_OnlineParam.DefaultValue));
canShow = true;
}
else
{
Debug.Log("[ToukaInterstitialTimer]插屏iv1, 触达次数不够。当前已触达插屏点次数:" + reachTimes01);
}
reachTimes01++;
ToukaUtils.SavePlayerPrefsIntByKeyValue(StaticStringsPlayerPrefs.TKInner_IV1ReachTimes, reachTimes01);
}else if (_ivType == ToukaSDKManager.IVType.IV2)
{
int reachTimes02 = ToukaUtils.GetPlayerPrefsIntByKey(StaticStringsPlayerPrefs.TKInner_IV2ReachTimes, 0);
if (reachTimes02 >= int.Parse(StaticOnlineParams.IV2_PreTimesN_OnlineParam.DefaultValue))
{
Debug.Log("[ToukaInterstitialTimer]插屏 IV2 触达次数够了, reachTimes02 : " + reachTimes02);
canShow = true;
}
else
{
Debug.Log("[ToukaInterstitialTimer]插屏IV2, 触达次数不够。当前已触达插屏点次数:" + reachTimes02);
}
reachTimes02++;
ToukaUtils.SavePlayerPrefsIntByKeyValue(StaticStringsPlayerPrefs.TKInner_IV2ReachTimes, reachTimes02);
}
Debug.Log("[ToukaInterstitialTimer]Check 前N次不弹出插屏广告是否到达N次了 " + canShow);
return canShow;
}
/// <summary>
/// 开始播插屏/激励视频时进行计时
/// </summary>
public void StartTimer()
{
startedTime = Time.time;
Debug.Log("[ToukaInterstitialTimer] 开始播插屏/激励视频,开始播广告计时:" + startedTime);
}
#endregion
}