chicken_dy/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs

904 lines
34 KiB
C#
Raw Permalink Normal View History

2024-03-07 12:12:48 +00:00
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
}
}