904 lines
34 KiB
C#
904 lines
34 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using HC.Plugins;
|
||
using Newtonsoft.Json.Linq;
|
||
using UnityEngine;
|
||
|
||
namespace HC
|
||
{
|
||
public class HCAdsManager : HCSingleton<HCAdsManager>
|
||
{
|
||
public enum HCArraignmentModeType
|
||
{
|
||
// 正式模式
|
||
Online,
|
||
|
||
// 提审模式
|
||
Review
|
||
}
|
||
|
||
private bool m_isInitialized = false;
|
||
|
||
int m_rewardRetryAttempt;
|
||
int m_interRetryAttempt;
|
||
int m_bannerRetryAttempt;
|
||
|
||
bool m_rewardIdLoad = false;
|
||
|
||
|
||
private float m_oldTimeScale = 1f;
|
||
private float m_oldVolume = 1f;
|
||
|
||
private float m_rvStartLoadTime = 0;
|
||
private float m_ivStartLoadTime = 0;
|
||
|
||
private Dictionary<int, int> ivsCount = new Dictionary<int, int>();
|
||
|
||
private Action<bool> m_rewardCallback;
|
||
private Action m_showFailCallback;
|
||
//private bool m_reward = false;
|
||
|
||
private Action m_interCloseCallback;
|
||
|
||
private HCIBaseAds plugin;
|
||
|
||
private Dictionary<HCIVADType, float> adTypeTimeInterVal = new();
|
||
|
||
private HCIVADType currentShowIVADType = HCIVADType.NULL;
|
||
|
||
private HCIVPositionName mIVPos;
|
||
private HCRVPositionName mRVPos;
|
||
|
||
private float GetCurrentTimeInterVal(HCIVADType type)
|
||
{
|
||
if (adTypeTimeInterVal.TryGetValue(type, out var val))
|
||
{
|
||
return val;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
private void SaveCurrentTimeInterVal(HCIVADType type)
|
||
{
|
||
adTypeTimeInterVal[type] = Time.time;
|
||
}
|
||
|
||
public void InitializeSdk()
|
||
{
|
||
if (m_isInitialized) return;
|
||
|
||
plugin = new HCWebGLAdPlugin();
|
||
// #else
|
||
// plugin = new HCMaxSdkAdPlugin();
|
||
// #endif
|
||
plugin.InitializeSdk(result => { StartCoroutine(LoadAds()); });
|
||
|
||
// rv
|
||
plugin.HCOnRewardedRevenue += OnRewardedRevenue;
|
||
plugin.HCOnRewardedAdLoadedEvent += OnRewardedAdLoadedEvent;
|
||
plugin.HCOnRewardedAdLoadFailedEvent += OnRewardedAdLoadFailedEvent;
|
||
plugin.HCOnRewardedAdDisplayedEvent += OnRewardedAdDisplayedEvent;
|
||
plugin.HCOnRewardedAdClickedEvent += OnRewardedAdClickedEvent;
|
||
plugin.HCOnRewardedAdFailedToDisplayEvent += OnRewardedAdFailedToDisplayEvent;
|
||
plugin.HCOnRewardedAdReceivedRewardEvent += OnRewardedAdReceivedRewardEvent;
|
||
plugin.HCOnRewardedAdHiddenEvent += OnRewardedAdHiddenEvent;
|
||
|
||
|
||
// iv
|
||
plugin.HCOnInterstitialLoadFailedEvent += OnInterstitialLoadFailedEvent;
|
||
plugin.HCOnInterstitialAdFailedToDisplayEvent += OnInterstitialAdFailedToDisplayEvent;
|
||
plugin.HCOnInterstitialHiddenEvent += OnInterstitialHiddenEvent;
|
||
plugin.HCOnInterstitialClickedEvent += OnInterstitialClickedEvent;
|
||
plugin.HCOnInterstitialDisplayedEvent += OnInterstitialDisplayedEvent;
|
||
plugin.HCOnInterstitialLoadedEvent += OnInterstitialLoadedEvent;
|
||
plugin.HCOnInterstitialRevenue += OnInterstitialRevenue;
|
||
|
||
|
||
// banner
|
||
plugin.HCOnBannerAdLoadedEvent += OnBannerAdLoadedEvent;
|
||
plugin.HCOnBannerAdLoadFailedEvent += OnBannerAdLoadFailedEvent;
|
||
plugin.HCOnBannerAdClickedEvent += OnBannerAdClickedEvent;
|
||
plugin.HCOnBannerAdRevenuePaidEvent += OnBannerAdRevenuePaidEvent;
|
||
plugin.HCOnBannerAdExpandedEvent += OnBannerAdExpandedEvent;
|
||
plugin.HCOnBannerAdCollapsedEvent += OnBannerAdCollapsedEvent;
|
||
m_isInitialized = true;
|
||
}
|
||
|
||
|
||
private IEnumerator LoadAds()
|
||
{
|
||
LoadRewardedAd();
|
||
LoadInterstitial();
|
||
yield return new WaitForSeconds(0.25f);
|
||
LoadBanner();
|
||
yield return new WaitForSeconds(0.5f);
|
||
LoadNative();
|
||
}
|
||
|
||
#region reward
|
||
|
||
private void LoadRewardedAd()
|
||
{
|
||
if (m_rewardIdLoad)
|
||
{
|
||
return;
|
||
}
|
||
|
||
m_rewardIdLoad = true;
|
||
|
||
|
||
if (IsAdUnitEmpty(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID, ADType.Reward)) return;
|
||
plugin.LoadRewardedAd(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID);
|
||
m_rvStartLoadTime = Time.time;
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Start_Load);
|
||
}
|
||
|
||
public bool IsRewardedAdReady()
|
||
{
|
||
if (IsAdUnitEmpty(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID, ADType.Reward)) return false;
|
||
return plugin.IsRewardedAdReady(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID);
|
||
}
|
||
|
||
public void ShowRewardedAd(HCRVPositionName _adPos, Action<bool> _rewardCallback = null, Action _showFCallback = null, bool _useSDKToast = true)
|
||
{
|
||
mRVPos = _adPos;
|
||
HCAnalyticsManager.Instance.LogRewardBtnClick(_adPos.ToString());
|
||
|
||
if (IsAdUnitEmpty(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID, ADType.Reward)) return;
|
||
m_rewardCallback = _rewardCallback;
|
||
m_showFailCallback = _showFCallback;
|
||
|
||
if (IsRewardedAdReady())
|
||
{
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_AchieveShow_Match, new Dictionary<string, object> { { HCInnerStaticSting.HC_Position, _adPos.ToString() } });
|
||
// PauseGame();
|
||
plugin.ShowRewardedAd(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID);
|
||
}
|
||
else
|
||
{
|
||
if (_useSDKToast)
|
||
{
|
||
HCNativeInterface.Instance.ShowToast(HCTools.IsChinese() ? "广告还未准备好" : "This ad is not ready yet.");
|
||
}
|
||
|
||
m_showFailCallback?.Invoke();
|
||
m_showFailCallback = null;
|
||
LoadRewardedAd();
|
||
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_ShowFail_Not_Ready,new Dictionary<string, object> { { HCInnerStaticSting.HC_Position, _adPos.ToString() } });
|
||
}
|
||
}
|
||
|
||
private void OnRewardedRevenue(string adunit, Dictionary<string, object> dictionary)
|
||
{
|
||
HCAnalyticsManager.Instance.TrackRevenueEvent(dictionary);
|
||
}
|
||
|
||
private void OnRewardedAdLoadedEvent(string adunit, Dictionary<string, object> dictionary)
|
||
{
|
||
m_rewardIdLoad = false;
|
||
m_rewardRetryAttempt = 0;
|
||
float loadTime = Time.time - m_rvStartLoadTime;
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Loaded,
|
||
new Dictionary<string, object>
|
||
{
|
||
{ HCInnerStaticSting.HC_Time, loadTime.ToString() },
|
||
{ "ad_platform", dictionary.GetValue("networkName", "") },
|
||
{ "ad_id", dictionary.GetValue("networkPlacement", "") },
|
||
{ "ad_ecpm", dictionary.GetValue("revenue", "0") }
|
||
});
|
||
}
|
||
|
||
private void OnRewardedAdLoadFailedEvent(string adunit, Dictionary<string, object> dictionary)
|
||
{
|
||
m_rewardIdLoad = false;
|
||
|
||
float loadTime = Time.time - m_rvStartLoadTime;
|
||
dictionary ??= new Dictionary<string, object>();
|
||
dictionary[HCInnerStaticSting.HC_Time] = loadTime.ToString();
|
||
|
||
if (dictionary.ContainsKey("type"))
|
||
{
|
||
dictionary["return_type"] = dictionary["type"];
|
||
dictionary.Remove("type");
|
||
}
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Fail_Loaded, dictionary);
|
||
m_rewardRetryAttempt++;
|
||
double retryDelay = Math.Pow(2, Math.Min(6, m_rewardRetryAttempt));
|
||
Invoke("LoadRewardedAd", (float)retryDelay);
|
||
}
|
||
|
||
private void OnRewardedAdDisplayedEvent(string adUnitId, Dictionary<string, object> dictionary)
|
||
{
|
||
PauseGame();
|
||
int playCount = HCTools.GetPlayerPrefsInt("REWARD_PLAY_COUNT", 0) + 1;
|
||
HCTools.SavePlayerPrefsInt("REWARD_PLAY_COUNT", playCount);
|
||
HCAnalyticsManager.Instance.SetUserProperties(new Dictionary<string, object>() { { "total_rv_ad_times", playCount } });
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Show, new Dictionary<string, object>() { { HCInnerStaticSting.HC_Position, mRVPos.ToString() } });
|
||
}
|
||
|
||
private void OnRewardedAdClickedEvent(string adUnitId, Dictionary<string, object> dictionary)
|
||
{
|
||
}
|
||
|
||
private void OnRewardedAdFailedToDisplayEvent(string adUnitId, Dictionary<string, object> errorInfoDictionary, Dictionary<string, object> dictionary)
|
||
{
|
||
ResumeGame();
|
||
|
||
m_showFailCallback?.Invoke();
|
||
m_showFailCallback = null;
|
||
|
||
LoadRewardedAd();
|
||
|
||
if (errorInfoDictionary.ContainsKey("type"))
|
||
{
|
||
errorInfoDictionary["return_type"] = errorInfoDictionary["type"];
|
||
errorInfoDictionary.Remove("type");
|
||
}
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_ShowFail, errorInfoDictionary);
|
||
}
|
||
|
||
private void OnRewardedAdReceivedRewardEvent(string adUnitId, Dictionary<string, object> rewardDictionary, Dictionary<string, object> dictionary)
|
||
{
|
||
}
|
||
|
||
private void OnRewardedAdHiddenEvent(string adUnitId, Dictionary<string, object> dictionary)
|
||
{
|
||
ResumeGame();
|
||
var result = (bool)dictionary.GetValue("isEnded", false);
|
||
m_rewardCallback?.Invoke(result);
|
||
|
||
m_rewardCallback = null;
|
||
if (dictionary.ContainsKey("type"))
|
||
{
|
||
dictionary["return_type"] = dictionary["type"];
|
||
dictionary.Remove("type");
|
||
}
|
||
dictionary.AddIfNotExists(HCInnerStaticSting.HC_Position, mRVPos.ToString());
|
||
HCAnalyticsManager.Instance.TrackEvent("RV_Close", dictionary);
|
||
if (IsDouyinWebGL())
|
||
{
|
||
int playCount = HCTools.GetPlayerPrefsInt("REWARD_PLAY_COUNT", 0) + 1;
|
||
HCTools.SavePlayerPrefsInt("REWARD_PLAY_COUNT", playCount);
|
||
HCAnalyticsManager.Instance.SetUserProperties(new Dictionary<string, object>() { { "total_rv_ad_times", playCount } });
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Show, dictionary);
|
||
}
|
||
|
||
LoadRewardedAd();
|
||
}
|
||
|
||
private bool IsDouyinWebGL()
|
||
{
|
||
#if UNITY_WEBGL && WEBGL_BYTEDANCE
|
||
return HCWebGLSDKManager.AppInfo.GetPlatform().ToLower().Contains("ios");
|
||
#else
|
||
return false;
|
||
#endif
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region inter
|
||
|
||
private bool _ivIsLoading;
|
||
|
||
private void LoadInterstitial()
|
||
{
|
||
if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.InterAdUnitID, ADType.Intersitital) || HCTools.IsRemoveAds()) return;
|
||
if (IsInterstitialReady())
|
||
{
|
||
HCDebugger.LogDebug("IV已经准备就绪");
|
||
return;
|
||
}
|
||
if (_ivIsLoading)
|
||
{
|
||
HCAnalyticsManager.Instance.TrackEvent("IV_Loading");
|
||
return;
|
||
}
|
||
|
||
// 2 s没回来,就算load失败,放开load锁
|
||
Invoke("WatchIvLoadCallback", 2);
|
||
|
||
_ivIsLoading = true;
|
||
|
||
plugin.LoadInterstitial(HCStaticParams.InterAdUnitID);
|
||
|
||
m_ivStartLoadTime = Time.time;
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Start_Load);
|
||
}
|
||
|
||
private void WatchIvLoadCallback()
|
||
{
|
||
_ivIsLoading = false;
|
||
HCDebugger.LogDebug("没有收到回调Iv load 回调");
|
||
HCAnalyticsManager.Instance.TrackEvent("WatchIvLoadCallback");
|
||
}
|
||
|
||
public bool IsInterstitialReady()
|
||
{
|
||
if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.InterAdUnitID, ADType.Intersitital) || HCTools.IsRemoveAds()) return false;
|
||
return plugin.IsInterstitialReady(HCStaticParams.InterAdUnitID);
|
||
}
|
||
|
||
public void ShowInterstitial(HCIVPositionName _adPos, HCIVADType _IvType = HCIVADType.IV1, Action _closeCallback = null)
|
||
{
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Position, new Dictionary<string, object> { { HCInnerStaticSting.HC_Position, _adPos.ToString() }, { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() } });
|
||
if (m_interCloseCallback != null)
|
||
{
|
||
HCDebugger.LogDebug($"[ShowInterstitial] 正在显示插屏广告,显示失败 callback = {_closeCallback}");
|
||
_closeCallback?.Invoke();
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail_Rule_Limit,
|
||
new Dictionary<string, object> {
|
||
{ HCInnerStaticSting.HC_Position, _adPos.ToString() },
|
||
{ HCInnerStaticSting.HC_IV_Type, _IvType.ToString() },
|
||
{ "IV_STATUS", "playing" },
|
||
{ "IV_CURRENT_AD_TYPE", currentShowIVADType.ToString() },
|
||
});
|
||
return;
|
||
}
|
||
|
||
mIVPos = _adPos;
|
||
|
||
var isRemoveAds = HCTools.IsRemoveAds();
|
||
var isReviewModel = IsReviewModel();
|
||
var isAdUnitEmpty = IsAdUnitEmpty(HCStaticParams.InterAdUnitID, ADType.Intersitital);
|
||
var canShowInterval = CanShowInter(_IvType);
|
||
if (isRemoveAds || isReviewModel || isAdUnitEmpty || canShowInterval != null)
|
||
{
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail_Rule_Limit,
|
||
new Dictionary<string, object> {
|
||
{ HCInnerStaticSting.HC_Position, _adPos.ToString() },
|
||
{ HCInnerStaticSting.HC_IV_Type, _IvType.ToString() },
|
||
{ "IV_STATUS", "rule" },
|
||
{ "HC_isRemoveAds", isRemoveAds },
|
||
{ "HC_isReviewModel", isReviewModel },
|
||
{ "HC_isAdUnitEmpty", isAdUnitEmpty },
|
||
{ "HC_canShowInter", canShowInterval },
|
||
});
|
||
|
||
HCDebugger.LogDebug($"[ShowInterstitial] 间隔中,显示失败 callback = {_closeCallback}");
|
||
_closeCallback?.Invoke();
|
||
return;
|
||
}
|
||
|
||
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_AchieveShow_Match, HCInnerStaticSting.HC_Position, _adPos.ToString(), HCInnerStaticSting.HC_IV_Type, _IvType.ToString());
|
||
|
||
|
||
if (IsInterstitialReady())
|
||
{
|
||
currentShowIVADType = _IvType;
|
||
HCDebugger.LogDebug($"[ShowInterstitial] 开始显示插屏 _closeCallback = {_closeCallback}");
|
||
m_interCloseCallback = _closeCallback ?? (() => { HCDebugger.LogDebug($"[ShowInterstitial] close _closeCallback = close iv"); });
|
||
|
||
Invoke("CheckCloseCallback", 3);
|
||
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_AchieveShow, new Dictionary<string, object> { { HCInnerStaticSting.HC_Position, _adPos.ToString() }, { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() } });
|
||
// PauseGame();
|
||
plugin.ShowInterstitial(HCStaticParams.InterAdUnitID);
|
||
}
|
||
else
|
||
{
|
||
currentShowIVADType = HCIVADType.NULL;
|
||
_closeCallback?.Invoke();
|
||
HCDebugger.LogDebug($"[ShowInterstitial] 没有缓存,执行close callback _closeCallback = {_closeCallback}");
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail_Not_Ready,
|
||
new Dictionary<string, object> { { HCInnerStaticSting.HC_Position, _adPos.ToString() }, { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() } });
|
||
LoadInterstitial();
|
||
}
|
||
}
|
||
|
||
private void CheckCloseCallback()
|
||
{
|
||
// CancelInvoke("CheckCloseCallback");
|
||
HCDebugger.LogError($"[CheckCloseCallback] 3s没收到iv show 的回调,直接回调close m_interCloseCallback = {m_interCloseCallback}");
|
||
m_interCloseCallback?.Invoke();
|
||
m_interCloseCallback = null;
|
||
}
|
||
|
||
//Conditional Control
|
||
private string CanShowInter(HCIVADType _type)
|
||
{
|
||
// 【1】前N次不展示插屏
|
||
var checkIfReachFirstNTimes = CheckIfReachFirstNTimes(_type);
|
||
if (checkIfReachFirstNTimes != null)
|
||
{
|
||
return checkIfReachFirstNTimes;
|
||
}
|
||
|
||
// 到达N次后,第N+1次直接展示插屏
|
||
if (IfFirstCheckPlayerPrefs(_type))
|
||
{
|
||
// 直接展示
|
||
return null;
|
||
}
|
||
|
||
// 非第N+1次,不能直接展示广告; 【2】要判断是否达到了间隔次数;
|
||
|
||
//innerIvType 和 _type 其实就是一样的
|
||
int innerIvType = GetInterRules(_type, HCInnerStaticSting.HC_TYPE);
|
||
|
||
int currTimes; // 当前达到的间隔次数
|
||
int needTimes = GetInterRules(_type, HCInnerStaticSting.HC_OVER_LEVEL); // 需要达到的间隔次数
|
||
// 获取当前进程里 iv 的展示次数
|
||
if (ivsCount.ContainsKey(innerIvType))
|
||
{
|
||
// 读取字典里插屏类型的次数
|
||
currTimes = ivsCount[innerIvType] + 1;
|
||
ivsCount[innerIvType] = currTimes;
|
||
}
|
||
else
|
||
{
|
||
// 字典里没有数据,添加数据
|
||
currTimes = 1;
|
||
ivsCount.Add(innerIvType, currTimes);
|
||
}
|
||
|
||
HCDebugger.LogDebug("当前间隔次数:" + currTimes + "远端次数:" + needTimes + "IV Type:" + _type);
|
||
if (currTimes <= needTimes)
|
||
{
|
||
// 没到频次控制时间
|
||
return "当前间隔次数:" + currTimes + "远端次数:" + needTimes + "IV Type:" + _type;
|
||
}
|
||
|
||
|
||
//【3】判断是否达到最小时间间隔
|
||
int timeInterVal = GetInterRules(_type, HCInnerStaticSting.HC_INTERVAL);
|
||
|
||
var mIvStartTime = GetCurrentTimeInterVal(_type);
|
||
var adInterTime = Time.time - mIvStartTime;
|
||
bool canShowFlag = adInterTime >= timeInterVal;
|
||
var msg = "插屏时间间隔:当前时间:" + adInterTime + "远端时间:" + timeInterVal + "IV Type:" + _type + " canShowFlag:" + canShowFlag;
|
||
HCDebugger.LogDebug(msg);
|
||
if (canShowFlag)
|
||
{
|
||
// 重置次数
|
||
ivsCount[innerIvType] = 0;
|
||
}
|
||
|
||
if (!canShowFlag)
|
||
{
|
||
return msg;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
|
||
private string CheckIfReachFirstNTimes(HCIVADType _type)
|
||
{
|
||
bool canShow = false;
|
||
|
||
string reachKey = "ivReachTimes" + _type.ToString();
|
||
// 取出本地插屏播放的次数
|
||
int reachTime = HCTools.GetPlayerPrefsInt(reachKey, 0);
|
||
// 是否到达可播放时机
|
||
if (reachTime >= GetInterRules(_type, HCInnerStaticSting.HC_SKIP_LEVEL))
|
||
{
|
||
canShow = true;
|
||
}
|
||
|
||
reachTime += 1;
|
||
HCTools.SavePlayerPrefsInt(reachKey, reachTime);
|
||
var msg = "前N次不展示插屏,本地次数:" + reachTime + "远端参数:" + GetInterRules(_type, HCInnerStaticSting.HC_SKIP_LEVEL) + "IV Type:" + _type;
|
||
HCDebugger.LogDebug(msg);
|
||
if (!canShow)
|
||
{
|
||
return msg;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
private bool IfFirstCheckPlayerPrefs(HCIVADType _type)
|
||
{
|
||
string key = HCInnerStaticSting.HC_FIRST_SHOW + _type.ToString();
|
||
string values = HCTools.GetPlayerPrefsString(key, "");
|
||
|
||
if (values.Length <= 0)
|
||
{
|
||
HCTools.SavePlayerPrefsString(key, key);
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
private int GetInterRules(HCIVADType index, string key)
|
||
{
|
||
string jsonData = HCAnalyticsManager.Instance.GetRemoteConfigStr(HCInnerStaticSting.HC_INTER_RULES_Remote, HCInnerStaticSting.HC_INTER_RULES_DEFAULT_VALUE);
|
||
JArray jsonArray;
|
||
try
|
||
{
|
||
jsonArray = JArray.Parse(jsonData);
|
||
}
|
||
catch
|
||
{
|
||
jsonArray = JArray.Parse(HCInnerStaticSting.HC_INTER_RULES_DEFAULT_VALUE);
|
||
}
|
||
|
||
int temp = 0;
|
||
if ((int)index > jsonArray.Count - 1) return temp;
|
||
|
||
int.TryParse((string)jsonArray[(int)index][key], out temp);
|
||
return temp;
|
||
}
|
||
|
||
|
||
// callback
|
||
private void OnInterstitialLoadedEvent(string adunit, Dictionary<string, object> adInfo)
|
||
{
|
||
CancelInvoke(nameof(WatchIvLoadCallback));
|
||
_ivIsLoading = false;
|
||
|
||
m_interRetryAttempt = 0;
|
||
|
||
float loadTime = Time.time - m_ivStartLoadTime;
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Loaded,
|
||
new Dictionary<string, object>
|
||
{
|
||
{ HCInnerStaticSting.HC_Time, loadTime.ToString() },
|
||
{ "ad_platform", adInfo.GetValue("networkname", "") },
|
||
{ "ad_id", adInfo.GetValue("networkplacement", "") },
|
||
{ "ad_ecpm", adInfo.GetValue("revenue", "0") }
|
||
});
|
||
}
|
||
|
||
private void OnInterstitialLoadFailedEvent(string adUnitId, Dictionary<string, object> errorInfo)
|
||
{
|
||
_ivIsLoading = false;
|
||
CancelInvoke(nameof(WatchIvLoadCallback));
|
||
// HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialLoadFailedEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}");
|
||
// m_interCloseCallback?.Invoke();
|
||
// m_interCloseCallback = null;
|
||
|
||
float loadTime = Time.time - m_ivStartLoadTime;
|
||
errorInfo ??= new Dictionary<string, object>();
|
||
errorInfo[HCInnerStaticSting.HC_Time] = loadTime.ToString(CultureInfo.InvariantCulture);
|
||
|
||
if (errorInfo.ContainsKey("type"))
|
||
{
|
||
errorInfo["return_type"] = errorInfo["type"];
|
||
errorInfo.Remove("type");
|
||
}
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Fail_Loaded, errorInfo);
|
||
|
||
m_interRetryAttempt++;
|
||
double retryDelay = Math.Pow(2, Math.Max(4, m_interRetryAttempt));
|
||
Invoke("LoadInterstitial", (float)retryDelay);
|
||
}
|
||
|
||
private void OnInterstitialAdFailedToDisplayEvent(string adUnitId, Dictionary<string, object> errorInfo, Dictionary<string, object> adInfo)
|
||
{
|
||
CancelInvoke("CheckCloseCallback");
|
||
|
||
HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialAdFailedToDisplayEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}");
|
||
ResumeGame();
|
||
LoadInterstitial();
|
||
|
||
m_interCloseCallback?.Invoke();
|
||
m_interCloseCallback = null;
|
||
|
||
if (errorInfo.ContainsKey("type"))
|
||
{
|
||
errorInfo["return_type"] = errorInfo["type"];
|
||
errorInfo.Remove("type");
|
||
}
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail, errorInfo);
|
||
}
|
||
|
||
private void OnInterstitialClickedEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
}
|
||
|
||
private void OnInterstitialDisplayedEvent(string adUnitId, Dictionary<string, object> info)
|
||
{
|
||
PauseGame();
|
||
|
||
CancelInvoke("CheckCloseCallback");
|
||
|
||
HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialDisplayedEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}");
|
||
|
||
int playCount = HCTools.GetPlayerPrefsInt("INTER_PLAY_COUNT", 0) + 1;
|
||
HCTools.SavePlayerPrefsInt("INTER_PLAY_COUNT", playCount);
|
||
HCAnalyticsManager.Instance.SetUserProperties(new Dictionary<string, object>() { { "total_iv_ad_times", playCount } });
|
||
if (info.ContainsKey("type"))
|
||
{
|
||
info["return_type"] = info["type"];
|
||
info.Remove("type");
|
||
}
|
||
info.Add(HCInnerStaticSting.HC_Position, mIVPos.ToString());
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Show, info);
|
||
}
|
||
|
||
private void OnInterstitialHiddenEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
ResumeGame();
|
||
|
||
HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialHiddenEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}");
|
||
|
||
m_interCloseCallback?.Invoke();
|
||
m_interCloseCallback = null;
|
||
|
||
if (currentShowIVADType != HCIVADType.NULL)
|
||
{
|
||
SaveCurrentTimeInterVal(currentShowIVADType);
|
||
}
|
||
|
||
currentShowIVADType = HCIVADType.NULL;
|
||
|
||
if (adInfo.ContainsKey("type"))
|
||
{
|
||
adInfo["return_type"] = adInfo["type"];
|
||
adInfo.Remove("type");
|
||
}
|
||
|
||
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Close, adInfo);
|
||
LoadInterstitial();
|
||
}
|
||
|
||
private void OnInterstitialRevenue(string adunit, Dictionary<string, object> adInfo)
|
||
{
|
||
HCAnalyticsManager.Instance.TrackRevenueEvent(adInfo);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Banner
|
||
|
||
private void LoadBanner()
|
||
{
|
||
if (IsAdUnitEmpty(HCStaticParams.BannerAdUnitID, ADType.Banner) || HCTools.IsRemoveAds() || IsReviewModel())
|
||
{
|
||
plugin.DestroyBanner(HCStaticParams.BannerAdUnitID);
|
||
return;
|
||
}
|
||
|
||
plugin.CreateBanner(HCStaticParams.BannerAdUnitID);
|
||
}
|
||
|
||
public void ShowBanner()
|
||
{
|
||
if (IsAdUnitEmpty(HCStaticParams.BannerAdUnitID, ADType.Banner) || HCTools.IsRemoveAds() || IsReviewModel())
|
||
{
|
||
plugin.DestroyBanner(HCStaticParams.BannerAdUnitID);
|
||
return;
|
||
}
|
||
|
||
plugin.ShowBanner(HCStaticParams.BannerAdUnitID);
|
||
}
|
||
|
||
public void HideBanner()
|
||
{
|
||
if (IsAdUnitEmpty(HCStaticParams.BannerAdUnitID, ADType.Banner)) return;
|
||
plugin.HideBanner(HCStaticParams.BannerAdUnitID);
|
||
}
|
||
|
||
|
||
private void OnBannerAdLoadedEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
m_bannerRetryAttempt = 0;
|
||
}
|
||
|
||
private void OnBannerAdLoadFailedEvent(string adUnitId, Dictionary<string, object> errorInfo)
|
||
{
|
||
m_bannerRetryAttempt++;
|
||
double retryDelay = Math.Pow(2, Math.Min(6, m_bannerRetryAttempt));
|
||
Invoke("LoadBanner", (float)retryDelay);
|
||
}
|
||
|
||
private void OnBannerAdClickedEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
}
|
||
|
||
private void OnBannerAdRevenuePaidEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
HCAnalyticsManager.Instance.TrackRevenueEvent(adInfo);
|
||
}
|
||
|
||
private void OnBannerAdExpandedEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
}
|
||
|
||
private void OnBannerAdCollapsedEvent(string adUnitId, Dictionary<string, object> adInfo)
|
||
{
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region native
|
||
|
||
private void LoadNative(string adUnit = "")
|
||
{
|
||
#if UNITY_WEBGL
|
||
if (IsReviewModel() || HCTools.IsRemoveAds()) return;
|
||
if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0)
|
||
{
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return;
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(adUnit))
|
||
{
|
||
foreach (var key in HCStaticParams.NativeAdUnitIDDictionary.Keys)
|
||
{
|
||
HCNativeInterface.Instance.LoadNative(key);
|
||
}
|
||
}
|
||
else if (HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit))
|
||
{
|
||
HCNativeInterface.Instance.LoadNative(adUnit);
|
||
}
|
||
else
|
||
{
|
||
HCDebugger.LogError("加载的广告id没有配置");
|
||
}
|
||
#endif
|
||
// #else
|
||
// if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native) || HCTools.IsRemoveAds()) return;
|
||
// HCNativeInterface.Instance.LoadNative(HCStaticParams.NativeAdUnitID);
|
||
// #endif
|
||
}
|
||
|
||
public bool IsNativeReady(string adUnit = "")
|
||
{
|
||
#if UNITY_WEBGL
|
||
if (IsReviewModel() || HCTools.IsRemoveAds()) return false;
|
||
if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0)
|
||
{
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return false;
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(adUnit))
|
||
{
|
||
HCDebugger.LogError("adUnit 不能为空");
|
||
return false;
|
||
}
|
||
|
||
if (!HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit))
|
||
{
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return false;
|
||
}
|
||
|
||
return HCNativeInterface.Instance.IsNativeAdReady(adUnit);
|
||
#endif
|
||
// #else
|
||
// if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native) || HCTools.IsRemoveAds()) return false;
|
||
// return HCNativeInterface.Instance.IsNativeAdReady();
|
||
// #endif
|
||
return false;
|
||
}
|
||
|
||
public void RemoveNative(string adUnit = "")
|
||
{
|
||
#if UNITY_WEBGL
|
||
if (IsReviewModel() || HCTools.IsRemoveAds()) return;
|
||
if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0)
|
||
{
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return;
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(adUnit))
|
||
{
|
||
HCDebugger.LogError("adUnit 不能为空");
|
||
return;
|
||
}
|
||
|
||
if (!HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit))
|
||
{
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return;
|
||
}
|
||
|
||
HCNativeInterface.Instance.RemoveNative(adUnit);
|
||
#endif
|
||
// #else
|
||
// if (IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native)) return;
|
||
// HCNativeInterface.Instance.RemoveNative();
|
||
// #endif
|
||
}
|
||
|
||
public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "", string adUnit = "", Action<int, string> _showFailedCallback = null, Action _closeCallback = null)
|
||
{
|
||
#if UNITY_WEBGL
|
||
if (IsReviewModel())
|
||
{
|
||
_showFailedCallback?.Invoke(-1, "IsReviewModel");
|
||
return;
|
||
}
|
||
|
||
if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0)
|
||
{
|
||
_showFailedCallback?.Invoke(-2, "广告id没有配置");
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return;
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(adUnit))
|
||
{
|
||
_showFailedCallback?.Invoke(-3, "adUnit 为空");
|
||
HCDebugger.LogError("adUnit 不能为空");
|
||
return;
|
||
}
|
||
|
||
if (!HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit))
|
||
{
|
||
_showFailedCallback?.Invoke(-4, "广告id没有配置 " + adUnit);
|
||
HCDebugger.LogError("广告id没有配置");
|
||
return;
|
||
}
|
||
|
||
HCNativeInterface.Instance.ShowNative(pRect, pCam, pAdPos, adUnit, _showFailedCallback, _closeCallback);
|
||
#endif
|
||
// #else
|
||
// if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native) || HCTools.IsRemoveAds()) return;
|
||
// HCNativeInterface.Instance.ShowNative(pRect, pCam, pAdPos);
|
||
// #endif
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region other
|
||
|
||
public bool IsReviewModel()
|
||
{
|
||
HCDebugger.LogDebug("当前提审模式:" + HCAnalyticsManager.Instance.GetRemoteConfigStr(HCInnerStaticSting.HC_MODE_SWITCH_KEY, HCArraignmentModeType.Online.ToString()));
|
||
return HCAnalyticsManager.Instance.GetRemoteConfigStr(HCInnerStaticSting.HC_MODE_SWITCH_KEY, HCArraignmentModeType.Online.ToString()) == HCArraignmentModeType.Review.ToString();
|
||
}
|
||
|
||
|
||
private bool IsAdUnitEmpty(string unitId, ADType type)
|
||
{
|
||
if (unitId == "")
|
||
{
|
||
HCDebugger.LogError(string.Format("请填写{0}广告位ID", type.ToString()));
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
private void PauseGame()
|
||
{
|
||
HCSDKManager.Instance.SetGameFocusListener?.Invoke(false);
|
||
|
||
//if (Time.timeScale > 0f) m_oldTimeScale = Time.timeScale;
|
||
//if (m_oldVolume > 0f) m_oldVolume = AudioListener.volume;
|
||
//Time.timeScale = 0f;
|
||
//AudioListener.volume = 0f;
|
||
}
|
||
|
||
private void ResumeGame()
|
||
{
|
||
HCSDKManager.Instance.SetGameFocusListener?.Invoke(true);
|
||
//Time.timeScale = m_oldTimeScale;
|
||
//AudioListener.volume = m_oldVolume;
|
||
}
|
||
|
||
public void SetLogEnable(bool _enable)
|
||
{
|
||
plugin.SetLogEnable(_enable);
|
||
}
|
||
|
||
public enum ADType
|
||
{
|
||
Banner,
|
||
|
||
Intersitital,
|
||
|
||
Reward,
|
||
|
||
Native
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
} |