210 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using BigoAds.Scripts.Api;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace WZ
 | |
| {
 | |
| 
 | |
|     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,
 | |
|             Action<string,double> onAdDismissed = null,
 | |
|             Action<string, int, string> onAdError = null,
 | |
|             Action<string> onAdClicked = null)
 | |
|         {
 | |
|             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,
 | |
|             Action<string,double> onAdDismissed,
 | |
|             Action<string, int, string> onAdError,
 | |
|             Action<string> onAdClicked)
 | |
|         {
 | |
|             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");
 | |
|                 AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Interstitial);
 | |
|                 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);
 | |
|                 TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke());
 | |
|                 onAdLoadFailed?.Invoke(adUnitId, code, msg);
 | |
|             });
 | |
|             
 | |
|             interstitialAd.OnAdShowed += (() =>
 | |
|             {
 | |
|                 LoggerUtils.Debug($"[Bigo] Interstitial -[interaction]: {adUnitId} show");
 | |
|                 BigoAdsManager.Instance.TrackAdImpression(GetAdRevenue(interstitialAd),AdsType.Interstitial, adUnitId);
 | |
|                 onAdShowed?.Invoke(adUnitId);
 | |
|             });
 | |
|             
 | |
|             interstitialAd.OnAdDismissed += (() =>
 | |
|             {
 | |
|                 LoggerUtils.Debug($"[Bigo] Interstitial -[interaction]: {adUnitId} dismiss");
 | |
|                 onAdDismissed?.Invoke(adUnitId,GetAdRevenue(interstitialAd));
 | |
|             });
 | |
|             
 | |
|             interstitialAd.OnAdError += ((code, msg) =>
 | |
|             {
 | |
|                 LoggerUtils.Debug($"[Bigo] Interstitial-[interaction]: {adUnitId} ad error, errorCode ={code}, error message = {msg}");
 | |
|                 onAdError?.Invoke(adUnitId, code, msg);
 | |
|             });
 | |
| 
 | |
|             interstitialAd.OnAdClicked += () =>
 | |
|             {
 | |
|                 onAdClicked?.Invoke(adUnitId);
 | |
|             };
 | |
|             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();
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 |