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

904 lines
34 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}