using System; using System.Collections.Generic; using System.Linq; using Firebase.RemoteConfig; using Newtonsoft.Json; using Script.Common; using Script.SDKManager.AdsSDKManager.AdmobAdsManager; using Script.SDKManager.AdsSDKManager.BigoAdsManager; using Script.SDKManager.AdsSDKManager.Constant; using Script.SDKManager.AdsSDKManager.MaxAdsManager; using Script.SDKManager.AdsSDKManager.TpnAdsManager; using Script.SDKManager.AdsSDKManager.Utils; using Script.Utils; using UnityEngine; public class AdsSDKManager : NormalSingleton { private List _adNetworks = new List(); /// /// 看完广告的回调 /// private Action AdRewardCallback; /// /// 广告竞价开关:激励、插屏、全屏Native广告竞价 /// public bool IsMoreAdsBidding = false; public void InitSDK() { // 初始化广告平台状态 BidPlatformManager.Instance.InitializePlatformStates(AdConfigParser.GetAdExpireInSec()); InitializeAdNetworks(); } private void InitializeAdNetworks() { _adNetworks.Add(AdmobAdsManager.Instance); _adNetworks.Add(BigoAdsManager.Instance); _adNetworks.Add(TpnAdsManager.Instance); _adNetworks.Add(MaxAdsManager.Instance); foreach (var network in _adNetworks) { network.Initialize(); } } public bool IsRewardAdReady() { return _adNetworks.Any(network => network.IsRewardedAvailable()); } /// /// 展示激励广告 /// /// public void ShowRewardAd(string _adPos, Action _rewardCallback = null, Action _showFailedCallback = null) { if (!IsRewardAdReady()) { _showFailedCallback?.Invoke(); return; } PlatformType result = GetBestPlatformType(false); BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Rewarded); if (result == PlatformType.AppLovin) { MaxAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback); } else if (result == PlatformType.Admob) { AdmobAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback); } else if (result == PlatformType.Bigo) { BigoAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback); } else if (result == PlatformType.Topon) { TpnAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback); } else if (result == PlatformType.Kwai) { } else { _showFailedCallback?.Invoke(); } AdPlayCountManager.IncrementAdPlayCount(AdsType.Rewarded); CheckAndRefreshExpiredBids(AdsType.Rewarded); } public bool IsInterstitialReady() { return _adNetworks.Any(network => network.IsInterstitialAvailable()); } /// /// 展示激励广告 /// /// public void ShowInterstitialAd(string _adPos, IvType _IvType = IvType.IV1, Action _closeCallback = null) { if (!IsRewardAdReady()) { _closeCallback?.Invoke(); _closeCallback = null; return; } PlatformType result = GetBestPlatformType(true); BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Interstitial); if (result == PlatformType.AppLovin) { MaxAdsManager.Instance.DisplayInterstitial(_adPos, _IvType,_closeCallback); } else if (result == PlatformType.Admob) { AdmobAdsManager.Instance.DisplayInterstitial(_adPos, _IvType,_closeCallback); } else if (result == PlatformType.Bigo) { BigoAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback); } else if (result == PlatformType.Topon) { TpnAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback); } else if (result == PlatformType.Kwai) { } else { _closeCallback?.Invoke(); } AdPlayCountManager.IncrementAdPlayCount(AdsType.Interstitial); // 刷新其他类型广告 CheckAndRefreshExpiredBids(AdsType.Interstitial); } private PlatformType GetBestPlatformType(bool isInterstitial) { if (isInterstitial) { AdPriceInfo priceInfo = new AdPriceInfo( maxPrice: MaxAdsManager.Instance.GetInterstitialRevenue(), admobPrice: AdmobAdsManager.Instance.GetInterstitialRevenue(), bigoPrice: BigoAdsManager.Instance.GetInterstitialRevenue(), // todo : 这里的kwaiPrice暂时设置为0,后续需要根据实际情况设置 kwaiPrice: 0, toponAdUnitId: TpnAdsManager.Instance.topon_interstitial_units ); return AdsBidResult.GetPlatformType(priceInfo); } else { AdPriceInfo priceInfo = new AdPriceInfo( maxPrice: MaxAdsManager.Instance.GetRewardedRevenue(), admobPrice: AdmobAdsManager.Instance.GetRewardedRevenue(), bigoPrice: BigoAdsManager.Instance.GetRewardedRevenue(), // todo : 这里的kwaiPrice暂时设置为0,后续需要根据实际情况设置 kwaiPrice: 0, toponAdUnitId: TpnAdsManager.Instance.topon_rewarded_units ); return AdsBidResult.GetPlatformType(priceInfo); } } // 检查并刷新过期竞价 private void CheckAndRefreshExpiredBids(AdsType _adsType) { Dictionary> expiredBids = BidPlatformManager.Instance.GetExpiredBids(); foreach (var kvp in expiredBids) { PlatformType platformName = kvp.Key; foreach (AdsType adType in kvp.Value) { if (_adsType == adType) { LoggerUtils.Debug($"{platformName} 平台 {adType} 广告竞价已过期,重新加载广告"); RefreshPlatformAds(platformName, adType); } } } } private void RefreshPlatformAds(PlatformType platformName, AdsType adType) { switch (platformName) { case PlatformType.Admob: RefreshAdmobAds(adType); break; case PlatformType.Topon: RefreshTopOnAds(adType); break; case PlatformType.AppLovin: RefreshMaxAds(adType); break; case PlatformType.Bigo: RefreshBigoAds(adType); break; case PlatformType.Kwai: RefreshKwaiAds(adType); break; default: break; } } private void RefreshAdmobAds(AdsType adType) { switch (adType) { case AdsType.Rewarded: AdmobAdsManager.Instance.LoadRewarded(); break; case AdsType.Interstitial: AdmobAdsManager.Instance.LoadInterstitial(); break; case AdsType.Banner: AdmobAdsManager.Instance.LoadBanner(); break; case AdsType.Native: AdmobAdsManager.Instance.LoadNative(); break; case AdsType.Splash: AdmobAdsManager.Instance.LoadSplash(); break; default: break; } } // 刷新TopOn广告 private void RefreshTopOnAds(AdsType adType) { switch (adType) { case AdsType.Rewarded: TpnAdsManager.Instance.LoadRewarded(); break; case AdsType.Interstitial: TpnAdsManager.Instance.LoadInterstitial(); break; default: break; } } // 刷新Max广告 private void RefreshMaxAds(AdsType adType) { switch (adType) { case AdsType.Rewarded: MaxAdsManager.Instance.LoadRewarded(); break; case AdsType.Interstitial: MaxAdsManager.Instance.LoadInterstitial(); break; default: break; } } // 刷新Bigo广告 private void RefreshBigoAds(AdsType adType) { switch (adType) { case AdsType.Rewarded: BigoAdsManager.Instance.LoadRewarded(); break; case AdsType.Interstitial: BigoAdsManager.Instance.LoadInterstitial(); break; default: break; } } private void RefreshKwaiAds (AdsType adType) { switch (adType) { case AdsType.Rewarded: // todo: 刷新激励广告 KwaiAdsManager.Instance.LoadRewardAd(); break; case AdsType.Interstitial: // todo: 刷新插屏广告 KwaiAdsManager.Instance.LoadInterstitialAd(); break; default: break; } } /// /// 广告看完回调 /// public void OnRewardAdCallback(double price) { AdRewardCallback?.Invoke(price); AdRewardCallback = null; } /// /// 根据IvRules判断是否可以展示插屏 /// /// public bool IvRulesShow(IvType ivadType) { //1.获取远程配置 string json = FireBaseRemoteConfigManager.Instance.GetRemoteConfigString("IV_RULES"); if (string.IsNullOrEmpty(json)) { return true; } //2.解析配置 var dates = JsonConvert.DeserializeObject(json); if (dates == null && dates.Length == 0) { return true; } //3.获取IVADType对应的配置 IvRulesData ivRulesData = null; foreach (var data in dates) { if (data.type == (int)ivadType) { ivRulesData = data; } } if (ivRulesData == null) { return true; } //4.判断skip(次安装跳过几次触发不展示广告) int skipLevel = ivRulesData.skipLevel; int currentSkipLevel = PlayerPrefsUtils.GetPlayerPrefsInt(IvRulesKey.KEY_SKIPLEVEL, 0); if (currentSkipLevel < skipLevel) { LoggerUtils.Debug($"[SDK] skipLevel limit"); PlayerPrefsUtils.SavePlayerPrefsInt(IvRulesKey.KEY_SKIPLEVEL, currentSkipLevel + 1); return false; } //5.判断overLevel(没跳过几次触发) int overLevel = ivRulesData.overLevel; int currentOverLevel = IvRulesConst.CurrentOverLevel; if (currentOverLevel < overLevel) { LoggerUtils.Debug($"[SDK] overLevel limit"); IvRulesConst.CurrentOverLevel++; return false; } //6.判断interval(广告时间间隔) int interval = ivRulesData.interval; long currentInterval = IvRulesConst.CurrentInterval; long localTimestamp = TimeUtils.GetLocalTimestamp(); if (localTimestamp < currentInterval + (interval * 1000L)) { LoggerUtils.Debug($"[SDK] interval limit"); return false; } return true; } }