187 lines
6.2 KiB
C#
187 lines
6.2 KiB
C#
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<string, BannerView> _bannerAds = new Dictionary<string, BannerView>();
|
|
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(BannerAliignType type, List<string> adUnitIds,
|
|
Action<string> onAdLoaded = null,
|
|
Action<string,int, string> onAdLoadFailed = null,
|
|
Action<AdValue> 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<string> onAdLoaded,
|
|
Action<string,int, string> onAdLoadFailed,
|
|
Action<AdValue> 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<string> GetAvailableAdUnits()
|
|
{
|
|
var available = new List<string>();
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
|