SDK_UnityMoney/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobRewardedAdManager.cs

227 lines
8.0 KiB
C#

using System;
using System.Collections.Generic;
using GoogleMobileAds.Api;
namespace WZ
{
public class AdmobRewardedAdManager
{
private Dictionary<string, RewardedAd> _rewardedAds = new Dictionary<string, RewardedAd>();
private Dictionary<string, double> _adRevenueCache = new Dictionary<string, double>();
public void InitializeAdUnits(List<string> adUnitIds,
Action<string,string> onAdLoaded = null,
Action<string, int, string> onAdLoadFailed = null,
Action<string> onAdShowed = null,
Action<string,string,double> onAdDismissed = null,
Action<string, int, string> onAdError = null,
Action<bool> onEarnRewarded = null,
Action<string,string,double> onAdClicked = null)
{
foreach (var adUnitId in adUnitIds)
{
CreateRewardedAd(adUnitId, onAdLoaded, onAdLoadFailed, onAdShowed, onAdDismissed, onAdError,onEarnRewarded, onAdClicked);
}
}
private void CreateRewardedAd(string adUnitId,
Action<string,string> onAdLoaded,
Action<string, int, string> onAdLoadFailed,
Action<string> onAdShowed,
Action<string,string,double> onAdDismissed,
Action<string, int, string> onAdError,
Action<bool> onEarnRewarded,
Action<string,string,double> onAdClicked)
{
if (string.IsNullOrEmpty(adUnitId)) return;
if (_rewardedAds.ContainsKey(adUnitId))
{
LoggerUtils.Debug($"[Admob] rewarded Ad unit {adUnitId} already exists");
return;
}
_adRevenueCache[adUnitId] = 0;
RewardedAd.Load(adUnitId, new AdRequest(), (RewardedAd ad, LoadAdError error) =>
{
if (error != null || ad == null)
{
LoggerUtils.Debug("[Admob] rewarded ad failed to load an ad with error : " + error);
onAdLoadFailed?.Invoke(adUnitId, error.GetCode(), error.GetMessage());
return;
}
LoggerUtils.Debug("[Admob] rewarded ad loaded with response : " + ad.GetResponseInfo().ToString()+"revenue:"+AdmobUtils.GetRewardedAdEcpm(ad));
LoggerUtils.Debug("[Admob] rewarded ad revenue : " +AdmobUtils.GetRewardedAdEcpm(ad));
if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Rewarded, adUnitId))
{
return;
}
_rewardedAds[adUnitId] = ad;
_adRevenueCache[adUnitId] = AdmobUtils.GetRewardedAdEcpm(ad);
AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Rewarded);
onAdLoaded?.Invoke(ad.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
adUnitId);
ad.OnAdPaid += (AdValue adValue) =>
{
LoggerUtils.Debug(String.Format("[Admob] rewarded ad paid {0} {1}.", adValue.Value, adValue.CurrencyCode));
AdmobAdsManager.Instance.TrackAdImpression(ad.GetResponseInfo().GetLoadedAdapterResponseInfo(),
adValue,
AdsType.Rewarded,
adUnitId);
};
ad.OnAdImpressionRecorded += () =>
{
LoggerUtils.Debug("[Admob] rewarded ad recorded an impression.");
onEarnRewarded?.Invoke(true);
};
ad.OnAdClicked += () =>
{
LoggerUtils.Debug("[Admob] rewarded ad was clicked.");
onAdClicked?.Invoke(ad.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
adUnitId,
AdmobUtils.GetRewardedAdEcpm(ad));
};
ad.OnAdFullScreenContentOpened += () =>
{
LoggerUtils.Debug("[Admob] rewarded ad full screen content opened.");
onAdShowed?.Invoke(adUnitId);
};
ad.OnAdFullScreenContentClosed += () =>
{
LoggerUtils.Debug("[Admob] rewarded ad full screen content closed.");
onAdDismissed?.Invoke(ad.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName, adUnitId, AdmobUtils.GetRewardedAdEcpm(ad));
};
ad.OnAdFullScreenContentFailed += (AdError error) =>
{
LoggerUtils.Debug("[Admob] rewarded ad failed to open full screen content with error : " + error);
onAdError?.Invoke(adUnitId, error.GetCode(), error.GetMessage());
};
});
}
// 显示价格最高的广告
public void ShowHighestPayingAd()
{
var highestPayingAdUnit = GetHighestPayingAdUnit();
if (!string.IsNullOrEmpty(highestPayingAdUnit))
{
ShowAd(highestPayingAdUnit);
}
}
// 显示特定广告位的广告
private void ShowAd(string adUnitId)
{
if (_rewardedAds.TryGetValue(adUnitId, out var ad))
{
ad.Show(null);
}
}
// 检查特定广告位是否可用
private bool IsAdAvailable(string adUnitId)
{
if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Rewarded, adUnitId))
{
return false;
}
return _rewardedAds.TryGetValue(adUnitId, out var ad) && ad.CanShowAd();
}
// 获取所有可用的广告位
public List<string> GetAvailableAdUnits()
{
var available = new List<string>();
foreach (var kvp in _rewardedAds)
{
if (kvp.Value.CanShowAd())
{
available.Add(kvp.Key);
}
}
return available;
}
// 获取价格最高的广告位ID
public string GetHighestPayingAdUnit()
{
string highestPayingAdUnit = null;
double highestRevenue = -1;
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 -1;
}
// 清理资源
public void Destroy()
{
foreach (var ad in _rewardedAds.Values)
{
ad.Destroy();
}
_rewardedAds.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 _rewardedAds.Keys)
{
if (!validKeys.Contains(key))
{
keysToRemove.Add(key);
}
}
// 移除不在数组中的key
foreach (string key in keysToRemove)
{
_rewardedAds.Remove(key);
_adRevenueCache.Remove(key);
}
}
}
}