using System.Collections.Generic; using GoogleMobileAds.Api; using System; using Script.Utils; using SDKManager.AdsSDKManager.Constant; using Script.SDKManager.AdsSDKManager.AdmobAdsManager.Utils; namespace Script.SDKManager.AdsSDKManager.AdmobAdsManager { public class AdmobBannerAdManager { private Dictionary _bannerAds = new Dictionary(); private Dictionary _retryCounters = new Dictionary(); private Dictionary _loadCallbacks = new Dictionary(); private Dictionary _adRevenueCache = new Dictionary(); public void InitializeAdUnits(BannerAliignType type, List adUnitIds, Action onAdLoaded = null, Action onAdLoadFailed = null, Action OnAdPaid = null, Action onAdClicked = null) { foreach (var adUnitId in adUnitIds) { CreateRewardedAd(type, adUnitId, onAdLoaded, onAdLoadFailed,OnAdPaid, onAdClicked); } } private void CreateRewardedAd(BannerAliignType type,string adUnitId, Action onAdLoaded, Action onAdLoadFailed, Action OnAdPaid, Action onAdClicked) { if (_bannerAds.ContainsKey(adUnitId)) { LoggerUtils.Debug($"Bigo banner Ad unit {adUnitId} already exists"); return; } var bannerAds = new BannerView(adUnitId, AdSize.Banner, type == BannerAliignType.BannerCenterBottomAlign ? AdPosition.Bottom : AdPosition.Top); _bannerAds[adUnitId] = bannerAds; _retryCounters[adUnitId] = 0; _adRevenueCache[adUnitId] = 0; bannerAds.OnBannerAdLoaded += () => { _retryCounters[adUnitId] = 0; _adRevenueCache[adUnitId] = AdmobUtils.GetBannerEcpm(bannerAds); LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} successfully"); onAdLoaded?.Invoke(adUnitId); }; bannerAds.OnBannerAdLoadFailed += ((msg) => { _retryCounters[adUnitId]++; double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId])); LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} failed, error message = {msg}"); // 延迟重试加载 _loadCallbacks[adUnitId] = () => LoadAd(adUnitId); TimerUtils.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke()); onAdLoadFailed?.Invoke(adUnitId, msg.GetCode(), msg.GetMessage()); }); bannerAds.OnAdPaid += ((adValue) => { LoggerUtils.Debug($"[Admob] banner -[interaction]: {adUnitId} show"); OnAdPaid?.Invoke(adValue); }); bannerAds.OnAdClicked += () => { onAdClicked?.Invoke(); }; LoadAd(adUnitId); } public void LoadAd(string adUnitId) { if (_bannerAds.TryGetValue(adUnitId, out var ad)) { ad.LoadAd(new AdRequest()); } } // 显示价格最高的广告 public void ShowHighestPayingAd() { var highestPayingAdUnit = GetHighestPayingAdUnit(); if (!string.IsNullOrEmpty(highestPayingAdUnit)) { ShowAd(highestPayingAdUnit); } } public void HideBanner() { var highestPayingAdUnit = GetHighestPayingAdUnit(); if (!string.IsNullOrEmpty(highestPayingAdUnit)) { if (_bannerAds.TryGetValue(highestPayingAdUnit, out var ad)) { ad.Hide(); } } } // 显示特定广告位的广告 private void ShowAd(string adUnitId) { if (_bannerAds.TryGetValue(adUnitId, out var ad)) { ad.Show(); } } // 获取所有可用的广告位 public List GetAvailableAdUnits() { var available = new List(); foreach (var kvp in _bannerAds) { available.Add(kvp.Key); } return available; } // 获取特定广告位的收益信息 public double GetAdRevenue(string adUnitId) { if (_adRevenueCache.TryGetValue(adUnitId, out var revenue)) { return revenue; } return 0; } // 获取价格最高的广告位ID public string GetHighestPayingAdUnit() { string highestPayingAdUnit = null; double highestRevenue = 0; foreach (var kvp in _adRevenueCache) { var adUnitId = kvp.Key; var revenue = kvp.Value; // 确保广告确实已加载并且价格更高 if (revenue > highestRevenue) { highestRevenue = revenue; highestPayingAdUnit = adUnitId; } } return highestPayingAdUnit; } // 获取价格最高的广告收益信息 public double GetHighestPayingAdRevenue() { var highestPayingAdUnit = GetHighestPayingAdUnit(); if (!string.IsNullOrEmpty(highestPayingAdUnit) && _adRevenueCache.TryGetValue(highestPayingAdUnit, out var revenue)) { return revenue; } return 0; } // 清理资源 public void Destroy() { foreach (var ad in _bannerAds.Values) { ad.Destroy(); } _bannerAds.Clear(); _retryCounters.Clear(); _loadCallbacks.Clear(); _adRevenueCache.Clear(); } } }