SDK_UnityMoney/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobBannerAdManager.cs

237 lines
8.5 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using GoogleMobileAds.Api;
using System;
2025-09-16 13:29:51 +00:00
using UnityEngine;
2025-09-01 10:32:50 +00:00
namespace WZ
{
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>();
2025-09-16 13:29:51 +00:00
private Dictionary<string, float> _adStartLoadTimes = new Dictionary<string, float>();
private BannerView _currentBannerView = null;
2025-09-16 13:29:51 +00:00
public void InitializeAdUnits(BannerAlignType type, List<string> adUnitIds)
{
foreach (var adUnitId in adUnitIds)
{
2025-09-16 13:29:51 +00:00
CreateRewardedAd(type, adUnitId);
}
}
2025-09-16 13:29:51 +00:00
private void CreateRewardedAd(BannerAlignType type,string adUnitId)
{
if (string.IsNullOrEmpty(adUnitId)) return;
if (_bannerAds.ContainsKey(adUnitId))
{
2025-09-16 13:29:51 +00:00
LoggerUtils.Debug($"[Admob] banner Ad unit {adUnitId} already exists");
return;
}
2025-09-16 13:29:51 +00:00
var bannerAds = new BannerView(adUnitId, AdSize.Banner, type == BannerAlignType.CenterBottom ? AdPosition.Bottom : AdPosition.Top);
_adStartLoadTimes[adUnitId] = Time.realtimeSinceStartup;
bannerAds.Hide();
_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");
2025-09-16 13:29:51 +00:00
AdsActionEvents.TrackAdLoaded(AdmobAdsManager.Instance.Platfrom,
bannerAds?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
2025-09-16 13:29:51 +00:00
adUnitId,
AdsType.Banner,
Time.realtimeSinceStartup - (_adStartLoadTimes.TryGetValue(adUnitId, out var time)? time : 0));
AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Banner);
};
bannerAds.OnBannerAdLoadFailed += ((msg) =>
{
2025-09-03 08:56:30 +00:00
if (!_retryCounters.TryAdd(adUnitId, 0))
{
_retryCounters[adUnitId]++;
}
double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters.TryGetValue(adUnitId,out var times)? times : 0));
LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} failed, error message = {msg}");
// 延迟重试加载
_loadCallbacks[adUnitId] = () => LoadAd(adUnitId);
_loadCallbacks.TryGetValue(adUnitId, out Action _loadCallback);
if (_loadCallback != null)
{
TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallback?.Invoke());
}
2025-09-16 13:29:51 +00:00
AdsActionEvents.TrackAdFailToLoad(AdmobAdsManager.Instance.Platfrom,
"",
"",
AdsType.Banner,Time.realtimeSinceStartup - (_adStartLoadTimes.TryGetValue(adUnitId, out var time)? time : 0),
msg.GetMessage());
});
bannerAds.OnAdPaid += ((adValue) =>
{
LoggerUtils.Debug($"[Admob] banner -[interaction]: {adUnitId} show");
AdmobAdsManager.Instance.TrackAdImpression(bannerAds?.GetResponseInfo()?.GetLoadedAdapterResponseInfo().AdSourceName ?? "",
bannerAds?.GetResponseInfo()?.GetLoadedAdapterResponseInfo().AdSourceInstanceId ?? "",
2025-08-31 08:26:53 +00:00
adValue,
AdsType.Banner,
2025-09-02 13:42:07 +00:00
adUnitId);
});
bannerAds.OnAdClicked += () =>
{
2025-09-16 13:29:51 +00:00
AdsActionEvents.TrackAdClicked(AdmobAdsManager.Instance.Platfrom,
bannerAds?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
2025-09-02 13:42:07 +00:00
adUnitId,
2025-09-16 13:29:51 +00:00
AdsType.Banner,
"",
2025-09-01 08:57:50 +00:00
AdmobUtils.GetBannerEcpm(bannerAds));
};
LoadAd(adUnitId);
}
public void LoadAd(string adUnitId)
{
if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Banner, adUnitId))
{
return;
}
if (_bannerAds.TryGetValue(adUnitId, out var ad))
{
ad.LoadAd(new AdRequest());
}
}
// 显示价格最高的广告
2025-09-16 13:29:51 +00:00
public void ShowHighestPayingAd(BannerAlignType bannerAlignType)
{
var highestPayingAdUnit = GetHighestPayingAdUnit();
if (!string.IsNullOrEmpty(highestPayingAdUnit))
{
2025-09-16 13:29:51 +00:00
ShowAd(highestPayingAdUnit, bannerAlignType);
}
}
public void HideBanner()
{
2025-09-16 13:29:51 +00:00
_currentBannerView?.Hide();
}
// 显示特定广告位的广告
2025-09-16 13:29:51 +00:00
private void ShowAd(string adUnitId,BannerAlignType bannerAlignType)
{
if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Banner, adUnitId))
{
return;
}
2025-09-16 13:29:51 +00:00
if (_bannerAds.TryGetValue(adUnitId, out var ad))
{
2025-09-16 13:29:51 +00:00
ad.SetPosition(bannerAlignType == BannerAlignType.CenterBottom ? AdPosition.Bottom : AdPosition.Top);
ad.Show();
2025-09-16 13:29:51 +00:00
_currentBannerView = ad;
}
}
// 获取所有可用的广告位
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;
2025-09-16 13:29:51 +00:00
double highestRevenue = -1;
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();
}
public void ClearAds(string[] adUnitIds)
{
// 将数组转换为HashSet以提高查找性能
HashSet<string> validKeys = new HashSet<string>(adUnitIds);
// 收集需要移除的key
List<string> keysToRemove = new List<string>();
foreach (var key in _bannerAds.Keys)
{
if (!validKeys.Contains(key))
{
keysToRemove.Add(key);
}
}
// 移除不在数组中的key
foreach (string key in keysToRemove)
{
_bannerAds.Remove(key);
_retryCounters.Remove(key);
_loadCallbacks.Remove(key);
_adRevenueCache.Remove(key);
}
}
}
}