using System; using System.Collections.Generic; using System.Diagnostics; using GoogleMobileAds.Api; using UnityEngine; namespace WZ { public class AdmobAdsManager : D_MonoSingleton, IAdService { public string ClientName => "Admob"; public PlatformType Platfrom => PlatformType.Admob; private AdmobBannerAdManager _admobBannerAdManager; private AdmobInterstitialAdManager _admobInterstitialAdManager; private AdmobRewardedAdManager _admobRewardedAdManager; private AdmobNativeAdManager _admobNativeAdManager; private AdmobSplashAdManager _admobSplashAdManager; private List _interstitialAdUnits = new List(); private List _rewardedAdUnits = new List(); private List _nativeAdUnits = new List(); private List _splashAdUnits = new List(); private List _bannerAdUnits = new List(); private string _rvPos; private string _ivPos; private Action _rvCloseCallback = null; private Action _ivCloseCallback = null; 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; private bool _receivedReward = false; public void Initialize() { if (_initialized) return; MobileAds.RaiseAdEventsOnUnityMainThread = true; _initialized = true; MobileAds.Initialize(initStatus => { if (_bannerAdUnits.Count > 0) LoadBanner(); if (_interstitialAdUnits.Count > 0) LoadInterstitial(); if (_rewardedAdUnits.Count > 0) LoadRewarded(); if (_splashAdUnits.Count > 0) AdsSplashManager.Instance.InitSplash(); if (_nativeAdUnits.Count > 0) LoadNative(); LoggerUtils.Debug("[Admob] init success"); }); } public void RefreshAdsData() { _bannerAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Banner); _interstitialAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Interstitial); _nativeAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Native); _splashAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Splash); _rewardedAdUnits = AdConfigParser.GetAdmobAdUnits(AdsType.Rewarded); } #region 激励广告功能 public void LoadRewarded() { _admobRewardedAdManager?.Destroy(); _admobRewardedAdManager = new AdmobRewardedAdManager(); _admobRewardedAdManager.InitializeAdUnits( _rewardedAdUnits, OnRewardedAdLoaded, OnRewardedAdLoadFailed, OnRewardedAdShowed, OnRewardedAdDismissed, OnRewardedAdError, OnRewardEarnReward, OnRewardedAdClicked ); _rvStartLoadTime = Time.realtimeSinceStartup; AdsActionEvents.TrackAdStartLoad(Platfrom, "", "", AdsType.Rewarded); } public void DisplayRewarded(string adPos, Action rewardCallback = null, Action showFailedCallback = null) { _rvPos = adPos; _rvCloseCallback = rewardCallback; _rvShowFailedCallback = showFailedCallback; _admobRewardedAdManager.ShowHighestPayingAd(); } public double GetRewardedRevenue() { return _admobRewardedAdManager.GetHighestPayingAdRevenue(); } public bool IsRewardedAvailable() { if (!_initialized || _rewardedAdUnits.Count == 0) return false; return _admobRewardedAdManager.GetAvailableAdUnits().Count > 0; } private void OnRewardedAdLoaded(string adSource,string adUnitId) { AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Rewarded,Time.realtimeSinceStartup - _rvStartLoadTime); } private void OnRewardedAdLoadFailed(string adUnitId, int errorCode, string errorMsg) { AdsActionEvents.TrackAdFailToLoad(Platfrom,"","",AdsType.Rewarded,Time.realtimeSinceStartup - _rvStartLoadTime,errorMsg); } private void OnRewardedAdShowed(string adUnitId) { } private void OnRewardedAdDismissed(string adSource,string adUnitId,double revenue) { AdsActionEvents.TrackAdClosed(Platfrom,adSource,adUnitId,AdsType.Rewarded,_rvPos,revenue); _rvCloseCallback?.Invoke(_receivedReward,revenue); _rvCloseCallback = null; _receivedReward = false; LoadRewarded(); } private void OnRewardedAdError(string adUnitId, int errorCode, string errorMsg) { _rvShowFailedCallback?.Invoke(); _rvShowFailedCallback = null; LoadRewarded(); } private void OnRewardedAdClicked(string adSource,string adUnitId,double revenue) { AdsActionEvents.TrackAdClicked(Platfrom,adSource,adUnitId,AdsType.Rewarded,_rvPos,revenue); } private void OnRewardEarnReward(bool reward) { _receivedReward = reward; } #endregion #region 插页广告功能 public void LoadInterstitial() { _admobInterstitialAdManager?.Destroy(); _admobInterstitialAdManager = new AdmobInterstitialAdManager(); _admobInterstitialAdManager.InitializeAdUnits( _interstitialAdUnits, OnInterstitialAdLoaded, OnInterstitialAdLoadFailed, OnInterstitialAdShowed, OnInterstitialAdDismissed, OnInterstitialAdError, OnInterstitialAdPaid, OnInterstitialAdClicked ); _ivStartLoadTime = Time.realtimeSinceStartup; AdsActionEvents.TrackAdStartLoad(Platfrom,"","",AdsType.Interstitial); } public double GetInterstitialRevenue() { return _admobInterstitialAdManager.GetHighestPayingAdRevenue(); } public void DisplayInterstitial(string ivPos, IvType _IvType = IvType.IV1, Action closeCallback = null) { _ivPos = ivPos; _ivCloseCallback = closeCallback; _admobInterstitialAdManager.ShowHighestPayingAd(); } public bool IsInterstitialAvailable() { return _admobInterstitialAdManager.GetAvailableAdUnits().Count > 0; } private void OnInterstitialAdLoaded(string adSource,string adUnitId) { AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Interstitial,Time.realtimeSinceStartup - _ivStartLoadTime); } private void OnInterstitialAdLoadFailed(string adUnitId, int errorCode, string errorMsg) { AdsActionEvents.TrackAdFailToLoad(Platfrom,"","",AdsType.Interstitial,Time.realtimeSinceStartup - _ivStartLoadTime,errorMsg); } private void OnInterstitialAdClicked(string adSource,string adUnitId,double revenue) { AdsActionEvents.TrackAdClicked(Platfrom, adSource, adUnitId, AdsType.Interstitial, "", revenue); } private void OnInterstitialAdPaid(AdValue adValue) { } private void OnInterstitialAdShowed(string adUnitId) { } private void OnInterstitialAdDismissed(string adSource,string adUnitId,double revenue) { AdsActionEvents.TrackAdClosed(Platfrom, adSource, adUnitId, AdsType.Interstitial, "", revenue); _ivCloseCallback?.Invoke(revenue); _ivCloseCallback = null; LoadInterstitial(); } private void OnInterstitialAdError(string adUnitId, int errorCode, string errorMsg) { _ivCloseCallback?.Invoke(0); _ivCloseCallback = null; LoadInterstitial(); } #endregion #region 开屏广告功能 public void LoadSplash() { _admobSplashAdManager?.Destroy(); _admobSplashAdManager = new AdmobSplashAdManager(); _admobSplashAdManager.InitializeAdUnits( _splashAdUnits, OnSplashAdLoaded, OnSplashAdLoadFailed, OnSplashAdShowed, OnSplashAdDismissed, OnSplashAdError, OnSplashAdPaid, OnSplashAdClicked ); _spStartLoadTime = Time.realtimeSinceStartup; AdsActionEvents.TrackAdStartLoad(Platfrom,"","",AdsType.Splash); } public bool IsSplashAvailable() { if (!_initialized) return false; return _admobSplashAdManager.GetAvailableAdUnits().Count > 0; } public void DisplaySplash() { _admobSplashAdManager.ShowHighestPayingAd(); } public double GetSplashRevenue() { return _admobSplashAdManager.GetHighestPayingAdRevenue(); } private void OnSplashAdLoaded(string adSource,string adUnitId) { _splashLoaded = true; AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Splash,Time.realtimeSinceStartup - _spStartLoadTime); } private void OnSplashAdLoadFailed(string adUnitId, int errorCode, string errorMsg) { _splashLoaded = true; AdsActionEvents.TrackAdFailToLoad(Platfrom,"","",AdsType.Splash,Time.realtimeSinceStartup - _spStartLoadTime,errorMsg); } private void OnSplashAdShowed(string adUnitId) { AdsSDKManager.Instance.otherAdsOnShow = true; } private void OnSplashAdDismissed(string adSource, string adUnitId, double revenue) { AdsActionEvents.TrackAdClosed(Platfrom, adSource, adUnitId, AdsType.Splash, "", revenue); AdsSDKManager.Instance.otherAdsOnShow = false; AdsSDKManager.Instance.OnSplashAdCloseCallback?.Invoke(); } private void OnSplashAdError(string adUnitId, int errorCode, string errorMsg) { AdsSDKManager.Instance.otherAdsOnShow = false; AdsSDKManager.Instance.OnSplashAdCloseCallback?.Invoke(); } private void OnSplashAdClicked(string adSource,string adUnitId,double revenue) { AdsActionEvents.TrackAdClicked(Platfrom,adSource,adUnitId,AdsType.Splash,"",revenue); } private void OnSplashAdPaid(AdValue adValue) { } #endregion #region 原生广告功能 public void LoadNative() { _admobNativeAdManager?.Destroy(); _admobNativeAdManager = new AdmobNativeAdManager(); _admobNativeAdManager.InitializeAdUnits( _nativeAdUnits ); AdsActionEvents.TrackAdStartLoad(Platfrom, "", "", AdsType.Native); } public bool IsNativeAvailable(string adUnitId) { return _admobNativeAdManager.IsAdAvailable(adUnitId); } public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position) { _admobNativeAdManager.ShowAd(position, adUnitId); } public void RemoveNative(string adUnitId) { _admobNativeAdManager.RemoveNative(adUnitId); } public double GetNativeRevenue(string adUnitId) { return _admobNativeAdManager.GetHighestPayingAdRevenue(); } #endregion #region 横幅广告功能 public void LoadBanner() { _admobBannerAdManager?.Destroy(); _admobBannerAdManager = new AdmobBannerAdManager(); _admobBannerAdManager.InitializeAdUnits(BannerAliignType.BannerCenterBottomAlign, _bannerAdUnits, OnBannerAdLoaded, OnBannerAdLoadFailed, OnBannerAdPaid, OnBannerAdClicked ); _bvStartLoadTime = Time.realtimeSinceStartup; AdsActionEvents.TrackAdStartLoad(Platfrom,"","",AdsType.Banner); } public bool IsBannerAvailable() { if (!_initialized) return false; return _admobBannerAdManager.GetAvailableAdUnits().Count > 0; } public void HideBanner() { _admobBannerAdManager.HideBanner(); } public double GetBannerRevenue() { return _admobBannerAdManager.GetHighestPayingAdRevenue(); } public void DisplayBanner() { _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) { } #endregion #region 收益上报 public void TrackAdImpression(AdapterResponseInfo loadedAdapterResponseInfo, AdValue adValue, AdsType type, string placement) { AdjustTrackEvent.Instance.TrackAdEvent(adValue.Value / 1000000f, loadedAdapterResponseInfo.AdSourceName, placement, loadedAdapterResponseInfo.AdSourceInstanceName); FireBaseAnalyticsManager.Instance.OnAdRevenueEvent(PlatformType.Admob.ToString(), loadedAdapterResponseInfo.AdSourceName, placement, type, adValue.Value / 1000000f, type == AdsType.Rewarded ? _rvPos : "", AdPlayCountManager.GetAdsActionCount(type, AdPlayCountManager.PLAY_COUNT_SUFFIX)); ShuShuEvent.Instance.OnAdRevenueEvent(PlatformType.Admob.ToString(), loadedAdapterResponseInfo.AdSourceName, placement, type.ToString(), adValue.Value / 1000000f, type == AdsType.Rewarded ? _rvPos : "", AdPlayCountManager.GetAdsActionCount(type, AdPlayCountManager.PLAY_COUNT_SUFFIX)); } #endregion #region 广告行为事件上报 public void TrackAdAction(AdapterResponseInfo loadedAdapterResponseInfo, double revenue, AdsType type, string placement) { } #endregion } }