From e024f00451a74eb0b83d96945e8d1740e7e6950b Mon Sep 17 00:00:00 2001 From: juncong lee Date: Tue, 16 Sep 2025 21:29:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8F=AF=E6=8A=98=E5=8F=A0ba?= =?UTF-8?q?nner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Common/IAdService.cs | 8 +- .../AdmobAdsManager/AdmobAdsManager.cs | 116 +++++---- .../AdmobAdsManager/AdmobNativeAdManager.cs | 1 - .../AdsSDKManager/AdmobAdsManager/Banner.meta | 8 + .../{ => Banner}/AdmobBannerAdManager.cs | 65 +++-- .../{ => Banner}/AdmobBannerAdManager.cs.meta | 0 .../Banner/AdmobCollapsibleBannerAdManager.cs | 236 ++++++++++++++++++ .../AdmobCollapsibleBannerAdManager.cs.meta | 11 + .../SDKManager/AdsSDKManager/AdsSDKManager.cs | 32 +-- .../BigoAdsManager/BigoAdsManager.cs | 8 +- .../AdsSDKManager/Constant/BannerAlignType.cs | 8 +- .../AdsSDKManager/Constant/BannerType.cs | 16 ++ .../AdsSDKManager/Constant/BannerType.cs.meta | 11 + .../KwaiAdsManager/KwaiAdsManager.cs | 8 +- .../MaxAdsManager/MaxAdsManager.cs | 8 +- .../TpnAdsManager/TpnAdsManager.cs | 8 +- .../AdsSDKManager/Utils/AdConfigParser.cs | 58 +++-- Assets/Script/SDKManager/RushSDKManager.cs | 17 +- Assets/Script/Version.meta | 8 + Assets/Script/Version/Version.md | 14 ++ Assets/Script/Version/Version.md.meta | 7 + 21 files changed, 503 insertions(+), 145 deletions(-) create mode 100644 Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner.meta rename Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/{ => Banner}/AdmobBannerAdManager.cs (76%) rename Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/{ => Banner}/AdmobBannerAdManager.cs.meta (100%) create mode 100644 Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs create mode 100644 Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Banner/AdmobCollapsibleBannerAdManager.cs.meta create mode 100644 Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs create mode 100644 Assets/Script/SDKManager/AdsSDKManager/Constant/BannerType.cs.meta create mode 100644 Assets/Script/Version.meta create mode 100644 Assets/Script/Version/Version.md create mode 100644 Assets/Script/Version/Version.md.meta 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: