| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  | using System; | 
					
						
							|  |  |  | using System.Collections; | 
					
						
							|  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using BigoAds.Scripts.Api; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  | namespace WZ | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public class BigoInterstitialAdManager | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         private Dictionary<string, BigoInterstitialAd> _interstitialAds = new Dictionary<string, BigoInterstitialAd>(); | 
					
						
							|  |  |  |         private Dictionary<string, int> _retryCounters = new Dictionary<string, int>(); | 
					
						
							|  |  |  |         private Dictionary<string, Action> _loadCallbacks = new Dictionary<string, Action>(); | 
					
						
							|  |  |  |         private Dictionary<string, double> _adRevenueCache = new Dictionary<string, double>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void InitializeAdUnits(List<string> adUnitIds, Action<string> onAdLoaded = null, | 
					
						
							|  |  |  |             Action<string, int, string> onAdLoadFailed = null, | 
					
						
							|  |  |  |             Action<string> onAdShowed = null, | 
					
						
							| 
									
										
										
										
											2025-09-01 14:14:33 +00:00
										 |  |  |             Action<string,double> onAdDismissed = null, | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |             Action<string, int, string> onAdError = null, | 
					
						
							| 
									
										
										
										
											2025-09-01 07:56:42 +00:00
										 |  |  |             Action<string> onAdClicked = null) | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             foreach (var adUnitId in adUnitIds) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 CreateRewardedAd(adUnitId, onAdLoaded, onAdLoadFailed, onAdShowed, onAdDismissed, onAdError, onAdClicked); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         private void CreateRewardedAd(string adUnitId, Action<string> onAdLoaded,  | 
					
						
							|  |  |  |             Action<string, int, string> onAdLoadFailed, | 
					
						
							|  |  |  |             Action<string> onAdShowed, | 
					
						
							| 
									
										
										
										
											2025-09-01 14:14:33 +00:00
										 |  |  |             Action<string,double> onAdDismissed, | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |             Action<string, int, string> onAdError, | 
					
						
							| 
									
										
										
										
											2025-09-01 07:56:42 +00:00
										 |  |  |             Action<string> onAdClicked) | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             if (_interstitialAds.ContainsKey(adUnitId)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"Bigo Interstitial Ad unit {adUnitId} already exists"); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             var interstitialAd = new BigoInterstitialAd(adUnitId); | 
					
						
							|  |  |  |             _interstitialAds[adUnitId] = interstitialAd; | 
					
						
							|  |  |  |             _retryCounters[adUnitId] = 0; | 
					
						
							|  |  |  |             _adRevenueCache[adUnitId] = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             interstitialAd.OnLoad += () => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _retryCounters[adUnitId] = 0; | 
					
						
							|  |  |  |                 _adRevenueCache[adUnitId] = GetAdRevenue(interstitialAd); | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Bigo] Interstitial -[Load]: {adUnitId} successfully"); | 
					
						
							| 
									
										
										
										
											2025-08-31 14:18:31 +00:00
										 |  |  |                 AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Interstitial); | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |                 onAdLoaded?.Invoke(adUnitId); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             interstitialAd.OnLoadFailed += ((code, msg) => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _retryCounters[adUnitId]++; | 
					
						
							|  |  |  |                 double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId])); | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Bigo] Interstitial -[Load]: {adUnitId} failed, errorCode ={code}, error message = {msg}"); | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |                 // 延迟重试加载 | 
					
						
							|  |  |  |                 _loadCallbacks[adUnitId] = () => LoadAd(adUnitId); | 
					
						
							| 
									
										
										
										
											2025-09-01 13:28:17 +00:00
										 |  |  |                 TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke()); | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |                 onAdLoadFailed?.Invoke(adUnitId, code, msg); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             interstitialAd.OnAdShowed += (() => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Bigo] Interstitial -[interaction]: {adUnitId} show"); | 
					
						
							| 
									
										
										
										
											2025-08-31 12:38:07 +00:00
										 |  |  |                 BigoAdsManager.Instance.TrackAdImpression(GetAdRevenue(interstitialAd),AdsType.Interstitial, adUnitId); | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |                 onAdShowed?.Invoke(adUnitId); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             interstitialAd.OnAdDismissed += (() => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Bigo] Interstitial -[interaction]: {adUnitId} dismiss"); | 
					
						
							| 
									
										
										
										
											2025-09-01 14:14:33 +00:00
										 |  |  |                 onAdDismissed?.Invoke(adUnitId,GetAdRevenue(interstitialAd)); | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |             }); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             interstitialAd.OnAdError += ((code, msg) => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Bigo] Interstitial-[interaction]: {adUnitId} ad error, errorCode ={code}, error message = {msg}"); | 
					
						
							|  |  |  |                 onAdError?.Invoke(adUnitId, code, msg); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             interstitialAd.OnAdClicked += () => | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-01 08:11:28 +00:00
										 |  |  |                 onAdClicked?.Invoke(adUnitId); | 
					
						
							| 
									
										
										
										
											2025-08-30 09:24:58 +00:00
										 |  |  |             }; | 
					
						
							|  |  |  |             LoadAd(adUnitId); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void LoadAd(string adUnitId) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_interstitialAds.TryGetValue(adUnitId, out var ad)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ad.Load(new BigoInterstitialRequest()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 显示价格最高的广告 | 
					
						
							|  |  |  |         public void ShowHighestPayingAd() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var highestPayingAdUnit = GetHighestPayingAdUnit(); | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(highestPayingAdUnit)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ShowAd(highestPayingAdUnit); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 显示特定广告位的广告 | 
					
						
							|  |  |  |         private void ShowAd(string adUnitId) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_interstitialAds.TryGetValue(adUnitId, out var ad)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ad.Show(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 检查特定广告位是否可用 | 
					
						
							|  |  |  |         private bool IsAdAvailable(string adUnitId) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return _interstitialAds.TryGetValue(adUnitId, out var ad) && ad.IsLoaded() && !ad.IsExpired(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 获取所有可用的广告位 | 
					
						
							|  |  |  |         public List<string> GetAvailableAdUnits() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var available = new List<string>(); | 
					
						
							|  |  |  |             foreach (var kvp in _interstitialAds) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (kvp.Value.IsLoaded() && !kvp.Value.IsExpired()) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     available.Add(kvp.Key); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return available; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 获取广告收益 | 
					
						
							|  |  |  |         private double GetAdRevenue(BigoInterstitialAd ad) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var bid = ad?.GetBid(); | 
					
						
							|  |  |  |             if (bid == null) return 0; | 
					
						
							|  |  |  |             return bid.getPrice() / 1000; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 获取特定广告位的收益信息 | 
					
						
							|  |  |  |         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 (IsAdAvailable(adUnitId) && 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 _interstitialAds.Values) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ad.DestroyAd(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             _interstitialAds.Clear(); | 
					
						
							|  |  |  |             _retryCounters.Clear(); | 
					
						
							|  |  |  |             _loadCallbacks.Clear(); | 
					
						
							|  |  |  |             _adRevenueCache.Clear(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |