228 lines
8.2 KiB
C#
228 lines
8.2 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()?.AdSourceName ?? "",
|
|
ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceInstanceId ?? "",
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|