diff --git a/Assets/Script/Common/IAdService.cs b/Assets/Script/Common/IAdService.cs
index 408117b..e344387 100644
--- a/Assets/Script/Common/IAdService.cs
+++ b/Assets/Script/Common/IAdService.cs
@@ -34,22 +34,22 @@ namespace WZ
///
/// 检查横幅广告是否可用
///
- bool IsBannerAvailable();
+ bool IsBannerAvailable(BannerType bannerType);
///
/// 显示横幅广告
///
- void DisplayBanner();
+ void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType);
///
/// 隐藏横幅广告
///
- void HideBanner();
+ void HideBanner(BannerType bannerType);
///
/// 获取横幅广告收益信息
///
- double GetBannerRevenue();
+ double GetBannerRevenue(BannerType bannerType);
#endregion
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs
index 05402ea..289022d 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs
@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using GoogleMobileAds.Api;
+using GoogleMobileAds.Common;
using UnityEngine;
@@ -14,6 +15,7 @@ namespace WZ
public string ClientName => "Admob";
public PlatformType Platfrom => PlatformType.Admob;
private AdmobBannerAdManager _admobBannerAdManager;
+ private AdmobCollapsibleBannerAdManager _admobCollapsibleBannerAdManager;
private AdmobInterstitialAdManager _admobInterstitialAdManager;
private AdmobRewardedAdManager _admobRewardedAdManager;
private AdmobNativeAdManager _admobNativeAdManager;
@@ -23,6 +25,7 @@ namespace WZ
private List _nativeAdUnits = new List();
private List _splashAdUnits = new List();
private List _bannerAdUnits = new List();
+ private List _collapsibleBannerAdUnits = new List();
private string _rvPos;
private string _ivPos;
private string _naPos;
@@ -31,8 +34,6 @@ namespace WZ
private Action _rvShowFailedCallback = null;
private float _rvStartLoadTime = 0;
private float _ivStartLoadTime = 0;
- private float _nvStartLoadTime = 0;
- private float _bvStartLoadTime = 0;
private float _spStartLoadTime = 0;
public bool _splashLoaded = false;
public bool _initialized { get; private set; } = false;
@@ -46,7 +47,7 @@ namespace WZ
MobileAds.Initialize(initStatus =>
{
- if (_bannerAdUnits.Count > 0) LoadBanner();
+ LoadBanner();
if (_interstitialAdUnits.Count > 0) LoadInterstitial();
if (_rewardedAdUnits.Count > 0) LoadRewarded();
if (_splashAdUnits.Count > 0) AdsSplashManager.Instance.InitSplash();
@@ -60,12 +61,14 @@ namespace WZ
public void RefreshAdsData()
{
_bannerAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Banner);
+ _collapsibleBannerAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Banner, BannerType.Collapsible);
_interstitialAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Interstitial);
_nativeAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Native);
_splashAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Splash);
_rewardedAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Rewarded);
_admobBannerAdManager?.ClearAds(_bannerAdUnits.ToArray());
+ _admobCollapsibleBannerAdManager?.ClearAds(_collapsibleBannerAdUnits.ToArray());
_admobInterstitialAdManager?.ClearAds(_interstitialAdUnits.ToArray());
_admobNativeAdManager?.ClearAds(_nativeAdUnits.ToArray());
_admobSplashAdManager?.ClearAds(_splashAdUnits.ToArray());
@@ -341,58 +344,72 @@ namespace WZ
#region 横幅广告功能
public void LoadBanner()
{
- _admobBannerAdManager?.Destroy();
- _admobBannerAdManager = new AdmobBannerAdManager();
- _admobBannerAdManager.InitializeAdUnits(BannerAliignType.BannerCenterBottomAlign,
- _bannerAdUnits,
- OnBannerAdLoaded,
- OnBannerAdLoadFailed,
- OnBannerAdPaid,
- OnBannerAdClicked
- );
- _bvStartLoadTime = Time.realtimeSinceStartup;
+ LoadStandardBanner();
+ LoadCollapsingBanner();
AdsActionEvents.TrackAdStartLoad(Platfrom,AdsType.Banner);
}
- public bool IsBannerAvailable()
+ private void LoadStandardBanner()
{
- if (!_initialized) return false;
- return _admobBannerAdManager.GetAvailableAdUnits().Count > 0;
- }
- public void HideBanner()
- {
- _admobBannerAdManager.HideBanner();
+ if (_bannerAdUnits.Count > 0)
+ {
+ _admobBannerAdManager?.Destroy();
+ _admobBannerAdManager = new AdmobBannerAdManager();
+ _admobBannerAdManager.InitializeAdUnits(BannerAlignType.CenterBottom,_bannerAdUnits);
+ }
+
}
- public double GetBannerRevenue()
+ public void LoadCollapsingBanner()
+ {
+ if (_collapsibleBannerAdUnits.Count > 0)
+ {
+ _admobCollapsibleBannerAdManager?.Destroy();
+ _admobCollapsibleBannerAdManager = new AdmobCollapsibleBannerAdManager();
+ _admobCollapsibleBannerAdManager.InitializeAdUnits(BannerAlignType.CenterBottom,_collapsibleBannerAdUnits);
+ }
+ }
+
+ public bool IsBannerAvailable(BannerType bannerType)
+ {
+ if (!_initialized) return false;
+ if (bannerType == BannerType.Standard)
+ {
+ return _admobBannerAdManager?.GetAvailableAdUnits().Count > 0;
+ }
+ else
+ {
+ return _admobCollapsibleBannerAdManager?.GetAvailableAdUnits().Count > 0;
+ }
+ }
+
+ public void HideBanner(BannerType bannerType)
+ {
+ if (bannerType == BannerType.Standard)
+ {
+ _admobBannerAdManager?.HideBanner();
+ }
+ else
+ {
+ _admobCollapsibleBannerAdManager?.HideBanner();
+ }
+ }
+
+ public double GetBannerRevenue(BannerType bannerType)
{
return _admobBannerAdManager.GetHighestPayingAdRevenue();
}
- public void DisplayBanner()
+ public void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType)
{
- _admobBannerAdManager.ShowHighestPayingAd();
- }
-
- private void OnBannerAdLoaded(string adSource,string adUnitId)
- {
-
- AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Banner,Time.realtimeSinceStartup - _bvStartLoadTime);
- }
-
- private void OnBannerAdLoadFailed(string adUnitId, int errorCode, string errorMsg)
- {
- AdsActionEvents.TrackAdFailToLoad(Platfrom,"","",AdsType.Banner,Time.realtimeSinceStartup - _bvStartLoadTime,errorMsg);
- }
-
- private void OnBannerAdClicked(string adSource,string adUnitId,double revenue)
- {
- AdsActionEvents.TrackAdClicked(Platfrom,adSource,adUnitId,AdsType.Banner,"",revenue);
- }
-
- private void OnBannerAdPaid(AdValue adValue)
- {
-
+ if (bannerType == BannerType.Standard)
+ {
+ _admobBannerAdManager?.ShowHighestPayingAd(bannerAlignType);
+ }
+ else
+ {
+ _admobCollapsibleBannerAdManager?.ShowHighestPayingAd(bannerAlignType);
+ }
}
#endregion
@@ -443,7 +460,7 @@ namespace WZ
///
///
///
- public bool FindAdsID(AdsType adsType, string adUnitId)
+ public bool FindAdsID(AdsType adsType, string adUnitId,BannerType bannerType = BannerType.Standard)
{
if (adsType == AdsType.Rewarded)
{
@@ -463,7 +480,14 @@ namespace WZ
}
else if (adsType == AdsType.Banner)
{
- return _bannerAdUnits.Contains(adUnitId);
+ if (bannerType == BannerType.Standard)
+ {
+ return _bannerAdUnits.Contains(adUnitId);
+ }
+ else
+ {
+ return _collapsibleBannerAdUnits.Contains(adUnitId);
+ }
}
else
{
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs
index a7cb996..faf59bc 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs
@@ -25,7 +25,6 @@ namespace WZ
private Dictionary _nativeAds = new Dictionary();
private Dictionary _adRevenueCache = new Dictionary();
private Dictionary _retryCounters = new Dictionary();
-
private Dictionary _adStartLoadTimes = new Dictionary();
private Dictionary showingNativeAds = new();
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner.meta b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner.meta
new file mode 100644
index 0000000..3dd2954
--- /dev/null
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ba10ede195dc84773add7e8daea165b5
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobBannerAdManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobBannerAdManager.cs
similarity index 76%
rename from Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobBannerAdManager.cs
rename to Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobBannerAdManager.cs
index cc61a9a..55dfc26 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobBannerAdManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobBannerAdManager.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using GoogleMobileAds.Api;
using System;
+using UnityEngine;
namespace WZ
{
@@ -10,34 +11,28 @@ namespace WZ
private Dictionary _retryCounters = new Dictionary();
private Dictionary _loadCallbacks = new Dictionary();
private Dictionary _adRevenueCache = new Dictionary();
+ private Dictionary _adStartLoadTimes = new Dictionary();
+ private BannerView _currentBannerView = null;
- public void InitializeAdUnits(BannerAliignType type, List adUnitIds,
- Action onAdLoaded = null,
- Action onAdLoadFailed = null,
- Action OnAdPaid = null,
- Action onAdClicked = null)
+ public void InitializeAdUnits(BannerAlignType type, List adUnitIds)
{
foreach (var adUnitId in adUnitIds)
{
- CreateRewardedAd(type, adUnitId, onAdLoaded, onAdLoadFailed,OnAdPaid, onAdClicked);
+ CreateRewardedAd(type, adUnitId);
}
}
- private void CreateRewardedAd(BannerAliignType type,string adUnitId,
- Action onAdLoaded,
- Action onAdLoadFailed,
- Action OnAdPaid,
- Action onAdClicked)
+ private void CreateRewardedAd(BannerAlignType type,string adUnitId)
{
if (string.IsNullOrEmpty(adUnitId)) return;
if (_bannerAds.ContainsKey(adUnitId))
{
- LoggerUtils.Debug($"Bigo banner Ad unit {adUnitId} already exists");
+ LoggerUtils.Debug($"[Admob] banner Ad unit {adUnitId} already exists");
return;
}
- var bannerAds = new BannerView(adUnitId, AdSize.Banner, type == BannerAliignType.BannerCenterBottomAlign ? AdPosition.Bottom : AdPosition.Top);
-
+ var bannerAds = new BannerView(adUnitId, AdSize.Banner, type == BannerAlignType.CenterBottom ? AdPosition.Bottom : AdPosition.Top);
+ _adStartLoadTimes[adUnitId] = Time.realtimeSinceStartup;
bannerAds.Hide();
_bannerAds[adUnitId] = bannerAds;
@@ -49,8 +44,11 @@ namespace WZ
_retryCounters[adUnitId] = 0;
_adRevenueCache[adUnitId] = AdmobUtils.GetBannerEcpm(bannerAds);
LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} successfully");
- onAdLoaded?.Invoke(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
- adUnitId);
+ AdsActionEvents.TrackAdLoaded(AdmobAdsManager.Instance.Platfrom,
+ bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
+ adUnitId,
+ AdsType.Banner,
+ Time.realtimeSinceStartup - (_adStartLoadTimes.TryGetValue(adUnitId, out var time)? time : 0));
AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Banner);
};
@@ -66,7 +64,11 @@ namespace WZ
// 延迟重试加载
_loadCallbacks[adUnitId] = () => LoadAd(adUnitId);
TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke());
- onAdLoadFailed?.Invoke(adUnitId, msg.GetCode(), msg.GetMessage());
+ AdsActionEvents.TrackAdFailToLoad(AdmobAdsManager.Instance.Platfrom,
+ "",
+ "",
+ AdsType.Banner,Time.realtimeSinceStartup - (_adStartLoadTimes.TryGetValue(adUnitId, out var time)? time : 0),
+ msg.GetMessage());
});
bannerAds.OnAdPaid += ((adValue) =>
@@ -76,14 +78,15 @@ namespace WZ
adValue,
AdsType.Banner,
adUnitId);
-
- OnAdPaid?.Invoke(adValue);
});
bannerAds.OnAdClicked += () =>
{
- onAdClicked?.Invoke(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
+ AdsActionEvents.TrackAdClicked(AdmobAdsManager.Instance.Platfrom,
+ bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
adUnitId,
+ AdsType.Banner,
+ "",
AdmobUtils.GetBannerEcpm(bannerAds));
};
LoadAd(adUnitId);
@@ -102,38 +105,32 @@ namespace WZ
}
// 显示价格最高的广告
- public void ShowHighestPayingAd()
+ public void ShowHighestPayingAd(BannerAlignType bannerAlignType)
{
var highestPayingAdUnit = GetHighestPayingAdUnit();
if (!string.IsNullOrEmpty(highestPayingAdUnit))
{
- ShowAd(highestPayingAdUnit);
+ ShowAd(highestPayingAdUnit, bannerAlignType);
}
}
public void HideBanner()
{
-
- var highestPayingAdUnit = GetHighestPayingAdUnit();
- if (!string.IsNullOrEmpty(highestPayingAdUnit))
- {
- if (_bannerAds.TryGetValue(highestPayingAdUnit, out var ad))
- {
- ad.Hide();
- }
- }
+ _currentBannerView?.Hide();
}
// 显示特定广告位的广告
- private void ShowAd(string adUnitId)
+ private void ShowAd(string adUnitId,BannerAlignType bannerAlignType)
{
if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Banner, adUnitId))
{
return;
}
-
+
if (_bannerAds.TryGetValue(adUnitId, out var ad))
{
+ ad.SetPosition(bannerAlignType == BannerAlignType.CenterBottom ? AdPosition.Bottom : AdPosition.Top);
ad.Show();
+ _currentBannerView = ad;
}
}
@@ -162,7 +159,7 @@ namespace WZ
public string GetHighestPayingAdUnit()
{
string highestPayingAdUnit = null;
- double highestRevenue = 0;
+ double highestRevenue = -1;
foreach (var kvp in _adRevenueCache)
{
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobBannerAdManager.cs.meta b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobBannerAdManager.cs.meta
similarity index 100%
rename from Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobBannerAdManager.cs.meta
rename to Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobBannerAdManager.cs.meta
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs
new file mode 100644
index 0000000..e49713f
--- /dev/null
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs
@@ -0,0 +1,236 @@
+using System.Collections.Generic;
+using GoogleMobileAds.Api;
+using System;
+using UnityEngine;
+
+namespace WZ
+{
+ public class AdmobCollapsibleBannerAdManager
+ {
+ private Dictionary _bannerAds = new Dictionary();
+ private Dictionary _retryCounters = new Dictionary();
+ private Dictionary _loadCallbacks = new Dictionary();
+ private Dictionary _adRevenueCache = new Dictionary();
+ private Dictionary _adStartLoadTimes = new Dictionary();
+ private BannerView _currentBannerView = null;
+
+ public void InitializeAdUnits(BannerAlignType type, List adUnitIds)
+ {
+ foreach (var adUnitId in adUnitIds)
+ {
+ CreateRewardedAd(type, adUnitId);
+ }
+ }
+
+ private void CreateRewardedAd(BannerAlignType type,string adUnitId)
+ {
+ if (string.IsNullOrEmpty(adUnitId)) return;
+ if (_bannerAds.ContainsKey(adUnitId))
+ {
+ LoggerUtils.Debug($"[Admob] banner collapsible Ad unit {adUnitId} already exists");
+ return;
+ }
+
+ 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 collapsible -[Load]: {adUnitId} successfully iscollapsible: {bannerAds.IsCollapsible()}");
+ AdsActionEvents.TrackAdLoaded(AdmobAdsManager.Instance.Platfrom,
+ bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
+ adUnitId,
+ AdsType.Banner,
+ Time.realtimeSinceStartup - (_adStartLoadTimes.TryGetValue(adUnitId, out var time)? time : 0));
+ AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Banner);
+ };
+
+ bannerAds.OnBannerAdLoadFailed += ((msg) =>
+ {
+ if (!_retryCounters.TryAdd(adUnitId, 0))
+ {
+ _retryCounters[adUnitId]++;
+ }
+ double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId]));
+ LoggerUtils.Debug($"[Admob] banner collapsible -[Load]: {adUnitId} failed, error message = {msg}");
+
+ // 延迟重试加载
+ _loadCallbacks[adUnitId] = () => LoadAd(adUnitId);
+ TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke());
+ 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 collapsible -[interaction]: {adUnitId} show");
+ AdmobAdsManager.Instance.TrackAdImpression(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo(),
+ adValue,
+ AdsType.Banner,
+ adUnitId);
+ });
+
+ bannerAds.OnAdClicked += () =>
+ {
+ AdsActionEvents.TrackAdClicked(AdmobAdsManager.Instance.Platfrom,
+ bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
+ adUnitId,
+ AdsType.Banner,
+ "",
+ AdmobUtils.GetBannerEcpm(bannerAds));
+ };
+ LoadAd(adUnitId);
+ }
+
+ public void LoadAd(string adUnitId)
+ {
+ if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Banner, adUnitId,BannerType.Collapsible))
+ {
+ return;
+ }
+ if (_bannerAds.TryGetValue(adUnitId, out var ad))
+ {
+ var adRequest = new AdRequest();
+ adRequest.Extras.Add("collapsible", "bottom");
+ ad.LoadAd(adRequest);
+ }
+ }
+
+ // 显示价格最高的广告
+ public void ShowHighestPayingAd(BannerAlignType bannerAlignType)
+ {
+ var highestPayingAdUnit = GetHighestPayingAdUnit();
+ if (!string.IsNullOrEmpty(highestPayingAdUnit))
+ {
+
+ ShowAd(highestPayingAdUnit,bannerAlignType);
+ }
+ }
+
+ public void HideBanner()
+ {
+ _currentBannerView?.Hide();
+ _currentBannerView?.Destroy();
+ AdmobAdsManager.Instance.LoadCollapsingBanner();
+ }
+ // 显示特定广告位的广告
+ private void ShowAd(string adUnitId,BannerAlignType bannerAlignType)
+ {
+ if (!AdmobAdsManager.Instance.FindAdsID(AdsType.Banner, adUnitId,BannerType.Collapsible))
+ {
+ return;
+ }
+
+ if (_bannerAds.TryGetValue(adUnitId, out var ad))
+ {
+ ad.SetPosition(bannerAlignType == BannerAlignType.CenterBottom ? AdPosition.Bottom : AdPosition.Top);
+ ad.Show();
+ _currentBannerView = ad;
+ }
+ }
+
+ // 获取所有可用的广告位
+ public List GetAvailableAdUnits()
+ {
+ var available = new List();
+ 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 = -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 validKeys = new HashSet(adUnitIds);
+ // 收集需要移除的key
+ List keysToRemove = new List();
+
+ 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);
+ }
+ }
+ }
+}
+
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs.meta b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs.meta
new file mode 100644
index 0000000..4ecbc47
--- /dev/null
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c92ae3b763c614567a435a03e5571311
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs
index 655a364..663873f 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs
@@ -27,10 +27,10 @@ namespace WZ
private void InitializeAdNetworks()
{
- _adNetworks.Add(AdmobAdsManager.Instance);
- _adNetworks.Add(BigoAdsManager.Instance);
- _adNetworks.Add(TpnAdsManager.Instance);
- _adNetworks.Add(MaxAdsManager.Instance);
+ // _adNetworks.Add(AdmobAdsManager.Instance);
+ // _adNetworks.Add(BigoAdsManager.Instance);
+ // _adNetworks.Add(TpnAdsManager.Instance);
+ // _adNetworks.Add(MaxAdsManager.Instance);
_adNetworks.Add(KwaiAdsManager.Instance);
foreach (var network in _adNetworks)
{
@@ -221,22 +221,22 @@ namespace WZ
#endregion
#region 横幅广告
- public bool IsBannerAdReady()
+ public bool IsBannerAdReady(BannerType bannerType)
{
- return AdmobAdsManager.Instance.IsBannerAvailable();
+ return AdmobAdsManager.Instance.IsBannerAvailable(bannerType);
}
- public void ShowBanner()
+ public void ShowBanner(BannerType bannerType,BannerAlignType bannerAlignType)
{
- AdmobAdsManager.Instance.DisplayBanner();
+ AdmobAdsManager.Instance.DisplayBanner(bannerType,bannerAlignType);
AdPlayCountManager.IncrementAdsActionCount(AdsType.Banner,AdPlayCountManager.PLAY_COUNT_SUFFIX);
AdjustTrackEvent.Instance.TrackEventName("Banner_Show", new Dictionary());
}
- public void HideBanner()
+ public void HideBanner(BannerType bannerType)
{
- AdmobAdsManager.Instance.HideBanner();
+ AdmobAdsManager.Instance.HideBanner(bannerType);
}
#endregion
@@ -295,9 +295,9 @@ namespace WZ
if (isInterstitial)
{
AdPriceInfo priceInfo = new AdPriceInfo(
- maxPrice: MaxAdsManager.Instance.GetInterstitialRevenue(),
- admobPrice: AdmobAdsManager.Instance.GetInterstitialRevenue(),
- bigoPrice: BigoAdsManager.Instance.GetInterstitialRevenue(),
+ maxPrice: -1,//MaxAdsManager.Instance.GetInterstitialRevenue(),
+ admobPrice: -1,//AdmobAdsManager.Instance.GetInterstitialRevenue(),
+ bigoPrice: -1,//BigoAdsManager.Instance.GetInterstitialRevenue(),
kwaiPrice: KwaiAdsManager.Instance.GetInterstitialRevenue(),
toponAdUnitId: TpnAdsManager.Instance._topon_interstitial_units
);
@@ -306,9 +306,9 @@ namespace WZ
else
{
AdPriceInfo priceInfo = new AdPriceInfo(
- maxPrice: MaxAdsManager.Instance.GetRewardedRevenue(),
- admobPrice: AdmobAdsManager.Instance.GetRewardedRevenue(),
- bigoPrice: BigoAdsManager.Instance.GetRewardedRevenue(),
+ maxPrice: -1,//MaxAdsManager.Instance.GetRewardedRevenue(),
+ admobPrice: -1,//AdmobAdsManager.Instance.GetRewardedRevenue(),
+ bigoPrice: -1,//BigoAdsManager.Instance.GetRewardedRevenue(),
kwaiPrice: KwaiAdsManager.Instance.GetRewardedRevenue(),
toponAdUnitId: TpnAdsManager.Instance._topon_rewarded_units
);
diff --git a/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs
index 23b4fd5..63c48bd 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs
@@ -250,10 +250,10 @@ namespace WZ
#region 横幅广告功能
public void LoadBanner() { }
- public bool IsBannerAvailable() { return false; }
- public void DisplayBanner() { }
- public void HideBanner() { }
- public double GetBannerRevenue() { return 0; }
+ public bool IsBannerAvailable(BannerType bannerType) { return false; }
+ public void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType) { }
+ public void HideBanner(BannerType bannerType) { }
+ public double GetBannerRevenue(BannerType bannerType) { return 0; }
#endregion
diff --git a/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerAlignType.cs b/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerAlignType.cs
index 8faed6d..bd2e5bd 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerAlignType.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerAlignType.cs
@@ -4,10 +4,12 @@ using UnityEngine;
namespace WZ
{
- public enum BannerAliignType
+ public enum BannerAlignType
{
- BannerCenterBottomAlign = 0,
- BannerCenterTopAlign = 1,
+ // 底部居中
+ CenterBottom = 0,
+ // 顶部居中
+ CenterTop = 1,
}
}
diff --git a/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs b/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs
new file mode 100644
index 0000000..6475112
--- /dev/null
+++ b/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs
@@ -0,0 +1,16 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace WZ
+{
+ public enum BannerType
+ {
+ // 普通banner
+ Standard,
+ // 可折叠banner
+ Collapsible
+ }
+
+}
+
diff --git a/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs.meta b/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs.meta
new file mode 100644
index 0000000..860239f
--- /dev/null
+++ b/Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c4c8c6aa996184304b22cfa074be8873
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiAdsManager.cs
index ee53df0..a6e585b 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiAdsManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiAdsManager.cs
@@ -222,10 +222,10 @@ namespace WZ
#region 横幅广告功能
public void LoadBanner() { }
- public bool IsBannerAvailable() { return false; }
- public void DisplayBanner() { }
- public void HideBanner() { }
- public double GetBannerRevenue() { return 0; }
+ public bool IsBannerAvailable(BannerType bannerType) { return false; }
+ public void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType) { }
+ public void HideBanner(BannerType bannerType) { }
+ public double GetBannerRevenue(BannerType bannerType) { return 0; }
#endregion
#region 开屏广告功能
diff --git a/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs
index d5639b1..f34f90e 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs
@@ -418,10 +418,10 @@ namespace WZ
#region 横幅广告功能
public void LoadBanner() { }
- public bool IsBannerAvailable() { return false; }
- public void HideBanner() { }
- public double GetBannerRevenue() { return 0; }
- public void DisplayBanner() { }
+ public bool IsBannerAvailable(BannerType bannerType) { return false; }
+ public void HideBanner(BannerType bannerType) { }
+ public double GetBannerRevenue(BannerType bannerType) { return 0; }
+ public void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType) { }
#endregion
#region 广告收益上报
diff --git a/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs
index 0852752..6d17472 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs
@@ -284,10 +284,10 @@ namespace WZ
#region 横幅广告功能
public void LoadBanner() { }
- public bool IsBannerAvailable() { return false; }
- public void HideBanner() { }
- public double GetBannerRevenue() { return 0; }
- public void DisplayBanner() { }
+ public bool IsBannerAvailable(BannerType bannerType) { return false; }
+ public void HideBanner(BannerType bannerType) { }
+ public double GetBannerRevenue(BannerType bannerType) { return 0; }
+ public void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType) { }
#endregion
#region 广告收益上报
diff --git a/Assets/Script/SDKManager/AdsSDKManager/Utils/AdConfigParser.cs b/Assets/Script/SDKManager/AdsSDKManager/Utils/AdConfigParser.cs
index 0885ddc..ccab04a 100644
--- a/Assets/Script/SDKManager/AdsSDKManager/Utils/AdConfigParser.cs
+++ b/Assets/Script/SDKManager/AdsSDKManager/Utils/AdConfigParser.cs
@@ -51,19 +51,27 @@ namespace WZ
///
/// 获取 Admob 广告单元ID
///
- public static List GetAdmobAdUnits(AdsType adType)
+ public static List GetAdmobAdUnits(AdsType adType, BannerType bannerType = BannerType.Standard)
{
if (_config == null)
{
- return adType switch
+
+ switch (adType)
{
- AdsType.Banner => new List { StaticValue.AdmobNormalBannerId },
- AdsType.Rewarded => new List { StaticValue.AdmobRewardId },
- AdsType.Native => new List { StaticValue.AdmobNativeId, StaticValue.AdmobMinddleNativeId, StaticValue.AdmobSmallNativeId, StaticValue.AdmobFullNativeId },
- AdsType.Splash => new List { StaticValue.AdmobSplashId },
- AdsType.Interstitial => new List { StaticValue.AdmobInterId },
- _ => new List()
- };
+ case AdsType.Banner:
+ if (bannerType == BannerType.Standard) return new List() { StaticValue.AdmobNormalBannerId};
+ else return new List { StaticValue.AdmobCollapsibleBannerId };
+ case AdsType.Rewarded:
+ return new List { StaticValue.AdmobRewardId };
+ case AdsType.Native:
+ return new List { StaticValue.AdmobNativeId, StaticValue.AdmobMinddleNativeId, StaticValue.AdmobSmallNativeId, StaticValue.AdmobFullNativeId };
+ case AdsType.Splash:
+ return new List { StaticValue.AdmobSplashId };
+ case AdsType.Interstitial:
+ return new List { StaticValue.AdmobInterId };
+ default:
+ return new List();
+ }
}
switch (adType)
@@ -73,9 +81,20 @@ namespace WZ
{
return _config.admob_banner_units ?? new List();
}
+ else if (_configDict.ContainsKey("admob_normal_banner_units"))
+ {
+ return _config.admob_collbanner_units ?? new List();
+ }
else
- {
- return new List{ StaticValue.AdmobNormalBannerId };
+ {
+ if (bannerType == BannerType.Standard)
+ {
+ return new List { StaticValue.AdmobNormalBannerId };
+ }
+ else
+ {
+ return new List { StaticValue.AdmobCollapsibleBannerId };
+ }
}
case AdsType.Rewarded:
if (_configDict.ContainsKey("admob_rewarded_units"))
@@ -83,8 +102,8 @@ namespace WZ
return _config.admob_rewarded_units ?? new List();
}
else
- {
- return new List{ StaticValue.AdmobRewardId };
+ {
+ return new List { StaticValue.AdmobRewardId };
}
case AdsType.Native:
if (_configDict.ContainsKey("admob_native_units"))
@@ -92,7 +111,7 @@ namespace WZ
return _config.admob_native_units ?? new List();
}
else
- {
+ {
return new List{ StaticValue.AdmobNativeId,
StaticValue.AdmobMinddleNativeId,
StaticValue.AdmobSmallNativeId,
@@ -104,8 +123,8 @@ namespace WZ
return _config.admob_splash_units ?? new List();
}
else
- {
- return new List{ StaticValue.AdmobSplashId };
+ {
+ return new List { StaticValue.AdmobSplashId };
}
case AdsType.Interstitial:
if (_configDict.ContainsKey("admob_interstitial_units"))
@@ -113,10 +132,10 @@ namespace WZ
return _config.admob_interstitial_units ?? new List();
}
else
- {
- return new List{ StaticValue.AdmobInterId };
+ {
+ return new List { StaticValue.AdmobInterId };
}
- default:
+ default:
return new List();
@@ -334,6 +353,7 @@ namespace WZ
public List admob_splash_units;
public List admob_rewarded_units;
public List admob_banner_units;
+ public List admob_collbanner_units;
public List admob_native_units;
// TopOn 配置
diff --git a/Assets/Script/SDKManager/RushSDKManager.cs b/Assets/Script/SDKManager/RushSDKManager.cs
index 569a6f9..9a85aa0 100644
--- a/Assets/Script/SDKManager/RushSDKManager.cs
+++ b/Assets/Script/SDKManager/RushSDKManager.cs
@@ -180,23 +180,28 @@ public class RushSDKManager : D_MonoSingleton
}
}
- public void ShowBanner()
+ ///
+ ///
+ ///
+ /// banner样式,Standard:普通banner;Collapsible:可折叠banner
+ /// banner位置,CenterBottom:底部居中;CenterTop:顶部居中
+ public void ShowBanner(BannerType bannerType, BannerAlignType bannerAlignType)
{
AdsActionEvents.TrackAdPosition(AdsType.Banner, "");
- if (AdsSDKManager.Instance.IsBannerAdReady())
+
+ if (AdsSDKManager.Instance.IsBannerAdReady(bannerType))
{
- AdsSDKManager.Instance.ShowBanner();
+ AdsSDKManager.Instance.ShowBanner(bannerType, bannerAlignType);
}
else
{
AdsActionEvents.TrackAdFailToShow(AdsType.Banner, "", AdsShowFailType.NoFill);
}
-
}
- public void HideBanner()
+ public void HideBanner(BannerType bannerType)
{
- AdsSDKManager.Instance.HideBanner();
+ AdsSDKManager.Instance.HideBanner(bannerType);
}
public bool IsNativeFullReady()
diff --git a/Assets/Script/Version.meta b/Assets/Script/Version.meta
new file mode 100644
index 0000000..665fda7
--- /dev/null
+++ b/Assets/Script/Version.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1c4c2222d1fbb4a95ac19d4849cff0e6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Script/Version/Version.md b/Assets/Script/Version/Version.md
new file mode 100644
index 0000000..127267d
--- /dev/null
+++ b/Assets/Script/Version/Version.md
@@ -0,0 +1,14 @@
+# Version 1.0.1 2025.9.16
+## Bugs
+- None
+## Known issues
+- None
+## Changelog
+- 新增Kwai广告位竞价逻辑
+- 新增跳转谷歌商店接口
+- 新增adjust用户来源回调
+- 新增隐私协议接口
+- 优化native样式
+- 新增native自刷新功能
+- 支持Admob可折叠banner
+
diff --git a/Assets/Script/Version/Version.md.meta b/Assets/Script/Version/Version.md.meta
new file mode 100644
index 0000000..01a14ec
--- /dev/null
+++ b/Assets/Script/Version/Version.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e7a9965fdd7874369a19207565134a1a
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: