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

212 lines
7.9 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using GoogleMobileAds.Api;
using UnityEngine;
namespace WZ
{
public class AdmobSplashAdManager
{
private Dictionary<string, AppOpenAd> _appOpenAds = new Dictionary<string, AppOpenAd>();
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<AdValue> onAdPaid = null,
Action<string,string,double> onAdClicked = null)
{
foreach (var adUnitId in adUnitIds)
{
CreateappopenAd(adUnitId, onAdLoaded, onAdLoadFailed, onAdShowed, onAdDismissed, onAdError,onAdPaid, onAdClicked);
}
}
private void CreateappopenAd(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<AdValue> onAdPaid,
Action<string,string,double> onAdClicked)
{
if (string.IsNullOrEmpty(adUnitId)) return;
if (_appOpenAds.ContainsKey(adUnitId))
{
LoggerUtils.Debug($"[Admob] appopen Ad unit {adUnitId} already exists");
return;
}
_adRevenueCache[adUnitId] = 0;
AppOpenAd.Load(adUnitId, new AdRequest(), (AppOpenAd ad, LoadAdError error) =>
{
if (error != null || ad == null)
{
LoggerUtils.Debug("[Admob] appopen ad failed to load an ad with error : " + error);
onAdLoadFailed?.Invoke(adUnitId, error.GetCode(), error.GetMessage());
return;
}
LoggerUtils.Debug("[Admob] appopen ad loaded with response : " + ad.GetResponseInfo().ToString());
LoggerUtils.Debug("[Admob] appopen ad loaded with revenue : " + AdmobUtils.GetAppOpenAdEcpm(ad));
_appOpenAds[adUnitId] = ad;
_adRevenueCache[adUnitId] = AdmobUtils.GetAppOpenAdEcpm(ad);
AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Splash);
onAdLoaded?.Invoke(ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
adUnitId);
AdsActionEvents.TrackAdmobValue(PlatformType.Admob,
ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
adUnitId,
AdsType.Splash,
AdmobUtils.GetAppOpenAdEcpm(ad));
ad.OnAdPaid += (AdValue adValue) =>
{
LoggerUtils.Debug(String.Format("[Admob] appopen ad paid {0} {1}.", adValue.Value, adValue.CurrencyCode));
AdmobAdsManager.Instance.TrackAdImpression(ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceInstanceId ?? "",
adValue,
AdsType.Splash,
adUnitId);
onAdPaid?.Invoke(adValue);
};
ad.OnAdImpressionRecorded += () =>
{
LoggerUtils.Debug("[Admob] appopen ad recorded an impression.");
};
ad.OnAdClicked += () =>
{
LoggerUtils.Debug("[Admob] appopen ad was clicked.");
onAdClicked?.Invoke(ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
adUnitId,
AdmobUtils.GetAppOpenAdEcpm(ad));
};
ad.OnAdFullScreenContentOpened += () =>
{
LoggerUtils.Debug("[Admob] appopen ad full screen content opened.");
onAdShowed?.Invoke(adUnitId);
};
ad.OnAdFullScreenContentClosed += () =>
{
LoggerUtils.Debug("[Admob] appopen ad full screen content closed.");
onAdDismissed?.Invoke(ad?.GetResponseInfo()?.GetLoadedAdapterResponseInfo()?.AdSourceName ?? "",
adUnitId,
AdmobUtils.GetAppOpenAdEcpm(ad));
};
ad.OnAdFullScreenContentFailed += (AdError error) =>
{
LoggerUtils.Debug("[Admob] appopen 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 (_appOpenAds.TryGetValue(adUnitId, out var ad))
{
ad.Show();
}
}
// 检查特定广告位是否可用
public bool IsAdAvailable(string adUnitId)
{
return _appOpenAds.TryGetValue(adUnitId, out var ad) && ad.CanShowAd();
}
// 获取所有可用的广告位
public List<string> GetAvailableAdUnits()
{
var available = new List<string>();
foreach (var kvp in _appOpenAds)
{
if (kvp.Value.CanShowAd())
{
available.Add(kvp.Key);
}
}
return available;
}
// 获取价格最高的广告位ID
public string GetHighestPayingAdUnit()
{
return _adRevenueCache
.Where(kvp => IsAdAvailable(kvp.Key))
.OrderByDescending(kvp => kvp.Value)
.Select(kvp => kvp.Key)
.FirstOrDefault();
}
// 获取价格最高的广告收益信息
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 _appOpenAds.Values)
{
ad.Destroy();
}
_appOpenAds.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 _appOpenAds.Keys)
{
if (!validKeys.Contains(key))
{
keysToRemove.Add(key);
}
}
// 移除不在数组中的key
foreach (string key in keysToRemove)
{
_appOpenAds.Remove(key);
_adRevenueCache.Remove(key);
}
}
}
}