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

519 lines
18 KiB
C#
Raw Permalink Normal View History

2025-08-31 05:15:14 +00:00
using System;
using System.Collections;
using System.Collections.Generic;
2025-09-01 03:39:21 +00:00
using System.Diagnostics;
using GoogleMobileAds.Api;
2025-09-16 13:29:51 +00:00
using GoogleMobileAds.Common;
2025-09-01 08:57:50 +00:00
using UnityEngine;
2025-08-31 13:19:46 +00:00
2025-09-01 10:32:50 +00:00
namespace WZ
{
2025-09-02 09:14:49 +00:00
public class AdmobAdsManager : D_MonoSingleton<AdmobAdsManager>, IAdService
{
public string ClientName => "Admob";
2025-09-01 07:14:26 +00:00
public PlatformType Platfrom => PlatformType.Admob;
private AdmobBannerAdManager _admobBannerAdManager;
2025-09-16 13:29:51 +00:00
private AdmobCollapsibleBannerAdManager _admobCollapsibleBannerAdManager;
private AdmobInterstitialAdManager _admobInterstitialAdManager;
private AdmobRewardedAdManager _admobRewardedAdManager;
private AdmobNativeAdManager _admobNativeAdManager;
private AdmobSplashAdManager _admobSplashAdManager;
2025-09-01 03:39:21 +00:00
private List<string> _interstitialAdUnits = new List<string>();
private List<string> _rewardedAdUnits = new List<string>();
private List<string> _nativeAdUnits = new List<string>();
private List<string> _splashAdUnits = new List<string>();
private List<string> _bannerAdUnits = new List<string>();
2025-09-16 13:29:51 +00:00
private List<string> _collapsibleBannerAdUnits = new List<string>();
2026-01-06 08:29:08 +00:00
public string _rvPos;
public string _ivPos;
public string _naPos;
public NativeType _naType;
2025-09-01 14:14:33 +00:00
private Action<bool,double> _rvCloseCallback = null;
private Action<double> _ivCloseCallback = null;
2025-08-31 05:15:14 +00:00
private Action _rvShowFailedCallback = null;
2025-09-01 08:57:50 +00:00
private float _rvStartLoadTime = 0;
private float _ivStartLoadTime = 0;
private float _spStartLoadTime = 0;
2025-09-02 13:42:07 +00:00
public bool _splashLoaded = false;
public bool _initialized { get; private set; } = false;
private bool _receivedReward = false;
2026-01-04 10:20:54 +00:00
public void ParseAdmobConfig()
{
2026-01-08 02:16:46 +00:00
var d = "{\"admob_app_id\":\"ca-app-pub-5381644556376235~3756187187\",\"admob_interstitial_units\":[\"ca-app-pub-4412893362169872/3366670333\"],\"admob_splash_units\":[\"ca-app-pub-4412893362169872/7716978882\"],\"admob_rewarded_units\":[\"ca-app-pub-4412893362169872/8427425327\"],\"admob_banner_units\":[\"ca-app-pub-4412893362169872/7908550574\"],\"admob_native_units\":[\"ca-app-pub-4412893362169872/5090815546\"]}";
var ads = RushSDKManager.Instance.GetRemoteConfigStr("adUnits_adm",d);
var config = AdConfigParser.Parse(ads);
2026-01-04 10:20:54 +00:00
_bannerAdUnits = config.admob_banner_units;
_collapsibleBannerAdUnits = config.admob_collbanner_units;
_interstitialAdUnits = config.admob_interstitial_units;
_nativeAdUnits = config.admob_native_units;
_rewardedAdUnits = config.admob_rewarded_units;
_splashAdUnits = config.admob_splash_units;
}
public void Initialize()
{
2025-09-01 12:53:08 +00:00
if (_initialized) return;
MobileAds.RaiseAdEventsOnUnityMainThread = true;
_initialized = true;
MobileAds.Initialize(initStatus =>
{
2025-09-16 13:29:51 +00:00
LoadBanner();
2025-09-03 05:42:30 +00:00
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");
2025-09-02 13:42:07 +00:00
});
2025-09-01 12:53:08 +00:00
}
2025-09-01 12:53:08 +00:00
public void RefreshAdsData()
{
}
#region 广
public void LoadRewarded()
{
2025-09-01 08:57:50 +00:00
_admobRewardedAdManager?.Destroy();
_admobRewardedAdManager = new AdmobRewardedAdManager();
_admobRewardedAdManager.InitializeAdUnits(
_rewardedAdUnits,
OnRewardedAdLoaded,
OnRewardedAdLoadFailed,
OnRewardedAdShowed,
OnRewardedAdDismissed,
OnRewardedAdError,
OnRewardEarnReward,
OnRewardedAdClicked
);
2025-09-01 08:57:50 +00:00
_rvStartLoadTime = Time.realtimeSinceStartup;
}
2025-09-01 14:14:33 +00:00
public void DisplayRewarded(string adPos, Action<bool,double> rewardCallback = null, Action showFailedCallback = null)
{
2025-08-31 05:15:14 +00:00
_rvPos = adPos;
_rvCloseCallback = rewardCallback;
_rvShowFailedCallback = showFailedCallback;
_admobRewardedAdManager.ShowHighestPayingAd();
}
public double GetRewardedRevenue()
{
return _admobRewardedAdManager.GetHighestPayingAdRevenue();
}
public bool IsRewardedAvailable()
{
2025-09-01 12:53:08 +00:00
if (!_initialized || _rewardedAdUnits.Count == 0) return false;
return _admobRewardedAdManager.GetAvailableAdUnits().Count > 0;
}
2025-09-01 08:57:50 +00:00
private void OnRewardedAdLoaded(string adSource,string adUnitId)
{
2025-09-01 08:57:50 +00:00
AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Rewarded,Time.realtimeSinceStartup - _rvStartLoadTime);
}
private void OnRewardedAdLoadFailed(string adUnitId, int errorCode, string errorMsg)
{
AdsActionEvents.TrackAdFailToLoad(Platfrom,"",adUnitId,AdsType.Rewarded,Time.realtimeSinceStartup - _rvStartLoadTime,errorMsg);
}
private void OnRewardedAdShowed(string adUnitId)
{
}
2025-09-01 08:57:50 +00:00
private void OnRewardedAdDismissed(string adSource,string adUnitId,double revenue)
{
2026-01-06 08:29:08 +00:00
AdsActionEvents.TrackAdClosed(Platfrom,
adSource,
adUnitId,
AdsType.Rewarded,
_rvPos,
revenue,
AdPlayCountManager.GetAdsActionCount(AdsType.Rewarded,_rvPos+AdPlayCountManager.POS_SUFFIX));
_rvCloseCallback?.Invoke(_receivedReward,revenue);
2025-08-31 05:15:14 +00:00
_rvCloseCallback = null;
_receivedReward = false;
2025-08-31 05:15:14 +00:00
LoadRewarded();
}
private void OnRewardedAdError(string adUnitId, int errorCode, string errorMsg)
{
2025-08-31 05:15:14 +00:00
_rvShowFailedCallback?.Invoke();
_rvShowFailedCallback = null;
LoadRewarded();
}
2025-09-01 08:57:50 +00:00
private void OnRewardedAdClicked(string adSource,string adUnitId,double revenue)
{
2026-01-06 08:29:08 +00:00
AdsActionEvents.TrackAdClicked(Platfrom,
adSource,
adUnitId,
AdsType.Rewarded,
_rvPos,
revenue,
AdPlayCountManager.GetAdsActionCount(AdsType.Rewarded,_rvPos+AdPlayCountManager.POS_SUFFIX),
NativeType.None);
}
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
);
2025-09-01 08:57:50 +00:00
_ivStartLoadTime = Time.realtimeSinceStartup;
}
public double GetInterstitialRevenue()
{
return _admobInterstitialAdManager.GetHighestPayingAdRevenue();
}
2025-09-01 14:14:33 +00:00
public void DisplayInterstitial(string ivPos, IvType _IvType = IvType.IV1, Action<double> closeCallback = null)
{
2025-08-31 05:15:14 +00:00
_ivPos = ivPos;
_ivCloseCallback = closeCallback;
_admobInterstitialAdManager.ShowHighestPayingAd();
}
public bool IsInterstitialAvailable()
2025-09-03 05:42:30 +00:00
{
if (!_initialized || _interstitialAdUnits.Count == 0) return false;
return _admobInterstitialAdManager.GetAvailableAdUnits().Count > 0;
}
2025-09-01 08:57:50 +00:00
private void OnInterstitialAdLoaded(string adSource,string adUnitId)
{
2025-09-01 08:57:50 +00:00
AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Interstitial,Time.realtimeSinceStartup - _ivStartLoadTime);
}
private void OnInterstitialAdLoadFailed(string adUnitId, int errorCode, string errorMsg)
{
2025-09-01 08:57:50 +00:00
AdsActionEvents.TrackAdFailToLoad(Platfrom,"","",AdsType.Interstitial,Time.realtimeSinceStartup - _ivStartLoadTime,errorMsg);
}
2025-09-01 08:57:50 +00:00
private void OnInterstitialAdClicked(string adSource,string adUnitId,double revenue)
{
2026-01-06 08:29:08 +00:00
AdsActionEvents.TrackAdClicked(Platfrom,
adSource,
adUnitId,
AdsType.Interstitial,
_ivPos,
revenue,
AdPlayCountManager.GetAdsActionCount(AdsType.Interstitial,_ivPos+AdPlayCountManager.POS_SUFFIX),
NativeType.None);
}
private void OnInterstitialAdPaid(AdValue adValue)
{
}
private void OnInterstitialAdShowed(string adUnitId)
{
}
2025-09-01 08:57:50 +00:00
private void OnInterstitialAdDismissed(string adSource,string adUnitId,double revenue)
{
2026-01-06 08:29:08 +00:00
AdsActionEvents.TrackAdClosed(Platfrom,
adSource,
adUnitId,
AdsType.Interstitial,
_ivPos,
revenue,
AdPlayCountManager.GetAdsActionCount(AdsType.Interstitial,_ivPos+AdPlayCountManager.POS_SUFFIX)
);
2025-09-01 14:14:33 +00:00
_ivCloseCallback?.Invoke(revenue);
2025-08-31 05:15:14 +00:00
_ivCloseCallback = null;
LoadInterstitial();
}
private void OnInterstitialAdError(string adUnitId, int errorCode, string errorMsg)
{
2025-09-01 14:14:33 +00:00
_ivCloseCallback?.Invoke(0);
2025-08-31 05:15:14 +00:00
_ivCloseCallback = null;
LoadInterstitial();
}
#endregion
#region 广
public void LoadSplash()
{
2025-09-01 08:57:50 +00:00
_admobSplashAdManager?.Destroy();
_admobSplashAdManager = new AdmobSplashAdManager();
_admobSplashAdManager.InitializeAdUnits(
_splashAdUnits,
OnSplashAdLoaded,
OnSplashAdLoadFailed,
OnSplashAdShowed,
OnSplashAdDismissed,
OnSplashAdError,
OnSplashAdPaid,
OnSplashAdClicked
);
2025-09-01 08:57:50 +00:00
_spStartLoadTime = Time.realtimeSinceStartup;
}
public bool IsSplashAvailable()
{
2025-08-31 01:11:05 +00:00
if (!_initialized) return false;
return _admobSplashAdManager.GetAvailableAdUnits().Count > 0;
}
public void DisplaySplash()
{
_admobSplashAdManager.ShowHighestPayingAd();
}
public double GetSplashRevenue()
{
return _admobSplashAdManager.GetHighestPayingAdRevenue();
}
2025-09-01 08:57:50 +00:00
private void OnSplashAdLoaded(string adSource,string adUnitId)
{
2025-09-02 13:42:07 +00:00
_splashLoaded = true;
_retryAttempt = 0;
2025-09-01 08:57:50 +00:00
AdsActionEvents.TrackAdLoaded(Platfrom,adSource,adUnitId,AdsType.Splash,Time.realtimeSinceStartup - _spStartLoadTime);
}
private int _retryAttempt = 0;
private void OnSplashAdLoadFailed(string adUnitId, int errorCode, string errorMsg)
{
2025-09-02 13:42:07 +00:00
_splashLoaded = true;
_retryAttempt++;
double retryDelay = Math.Pow(2, Math.Min(6, _retryAttempt));
Invoke(nameof(LoadSplash), (float)retryDelay);
2025-09-01 08:57:50 +00:00
AdsActionEvents.TrackAdFailToLoad(Platfrom,"","",AdsType.Splash,Time.realtimeSinceStartup - _spStartLoadTime,errorMsg);
}
private void OnSplashAdShowed(string adUnitId)
{
2025-09-02 13:57:18 +00:00
AdsSDKManager.Instance.otherAdsOnShow = true;
}
2025-09-01 10:32:50 +00:00
private void OnSplashAdDismissed(string adSource, string adUnitId, double revenue)
{
2026-01-06 08:29:08 +00:00
AdsActionEvents.TrackAdClosed(Platfrom,
adSource,
adUnitId,
AdsType.Splash,
AdsSplashManager.Instance._coldLaunch ? "Cold" : "Hot",
revenue,
AdPlayCountManager.GetAdsActionCount(AdsType.Splash,"Splash"+AdPlayCountManager.POS_SUFFIX)
);
2025-09-02 13:57:18 +00:00
AdsSDKManager.Instance.otherAdsOnShow = false;
2025-11-03 07:58:12 +00:00
AdsSplashManager.Instance.OnSplashAdCloseCallback?.Invoke();
LoadSplash();
}
private void OnSplashAdError(string adUnitId, int errorCode, string errorMsg)
{
2025-09-02 13:57:18 +00:00
AdsSDKManager.Instance.otherAdsOnShow = false;
2025-11-03 07:58:12 +00:00
AdsSplashManager.Instance.OnSplashAdCloseCallback?.Invoke();
LoadSplash();
}
2025-09-01 08:57:50 +00:00
private void OnSplashAdClicked(string adSource,string adUnitId,double revenue)
{
2026-01-06 08:29:08 +00:00
AdsActionEvents.TrackAdClicked(Platfrom,
adSource,
adUnitId,
AdsType.Splash,
AdsSplashManager.Instance._coldLaunch ? "Cold" : "Hot",
revenue,
AdPlayCountManager.GetAdsActionCount(AdsType.Splash,"Splash"+AdPlayCountManager.POS_SUFFIX),
NativeType.None);
}
private void OnSplashAdPaid(AdValue adValue)
{
}
#endregion
#region 广
public void LoadNative()
{
2025-09-02 02:07:10 +00:00
_admobNativeAdManager?.Destroy();
_admobNativeAdManager = new AdmobNativeAdManager();
_admobNativeAdManager.InitializeAdUnits(
_nativeAdUnits
);
}
2025-09-02 02:07:10 +00:00
public bool IsNativeAvailable(string adUnitId)
{
return _admobNativeAdManager?.IsAdAvailable(adUnitId) ?? false;
}
2026-01-06 08:29:08 +00:00
public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position, NativeType nativeType)
2025-09-02 02:07:10 +00:00
{
2025-09-09 06:31:15 +00:00
_naPos = _adPos;
2026-01-06 08:29:08 +00:00
_naType = nativeType;
2025-09-02 02:07:10 +00:00
_admobNativeAdManager.ShowAd(position, adUnitId);
}
2025-09-02 02:07:10 +00:00
public void RemoveNative(string adUnitId)
{
StartCoroutine(_admobNativeAdManager.RemoveNative(adUnitId));
}
2025-09-02 02:07:10 +00:00
public double GetNativeRevenue(string adUnitId)
{
return _admobNativeAdManager.GetAdRevenue(adUnitId);
}
#endregion
#region 广
public void LoadBanner()
{
2025-09-16 13:29:51 +00:00
LoadStandardBanner();
LoadCollapsingBanner();
2026-01-06 08:29:08 +00:00
}
2025-09-16 13:29:51 +00:00
private void LoadStandardBanner()
{
2025-09-16 13:29:51 +00:00
if (_bannerAdUnits.Count > 0)
{
_admobBannerAdManager?.Destroy();
_admobBannerAdManager = new AdmobBannerAdManager();
_admobBannerAdManager.InitializeAdUnits(BannerAlignType.CenterBottom,_bannerAdUnits);
}
}
2025-09-16 13:29:51 +00:00
public void LoadCollapsingBanner()
{
2025-09-16 13:29:51 +00:00
if (_collapsibleBannerAdUnits.Count > 0)
{
_admobCollapsibleBannerAdManager?.Destroy();
_admobCollapsibleBannerAdManager = new AdmobCollapsibleBannerAdManager();
_admobCollapsibleBannerAdManager.InitializeAdUnits(BannerAlignType.CenterBottom,_collapsibleBannerAdUnits);
}
}
2025-08-31 08:26:53 +00:00
2025-09-16 13:29:51 +00:00
public bool IsBannerAvailable(BannerType bannerType)
2025-08-31 08:26:53 +00:00
{
2025-09-16 13:29:51 +00:00
if (!_initialized) return false;
if (bannerType == BannerType.Standard)
{
return _admobBannerAdManager?.GetAvailableAdUnits().Count > 0;
}
else
{
return _admobCollapsibleBannerAdManager?.GetAvailableAdUnits().Count > 0;
}
}
2025-09-16 13:29:51 +00:00
public void HideBanner(BannerType bannerType)
2025-08-31 08:26:53 +00:00
{
2025-09-16 13:29:51 +00:00
if (bannerType == BannerType.Standard)
{
_admobBannerAdManager?.HideBanner();
}
else
{
_admobCollapsibleBannerAdManager?.HideBanner();
}
}
2025-09-16 13:29:51 +00:00
public double GetBannerRevenue(BannerType bannerType)
{
2025-09-16 13:29:51 +00:00
return _admobBannerAdManager.GetHighestPayingAdRevenue();
}
2025-09-16 13:29:51 +00:00
public void DisplayBanner(BannerType bannerType,BannerAlignType bannerAlignType)
2025-08-31 08:26:53 +00:00
{
2025-09-16 13:29:51 +00:00
if (bannerType == BannerType.Standard)
{
_admobBannerAdManager?.ShowHighestPayingAd(bannerAlignType);
}
else
{
_admobCollapsibleBannerAdManager?.ShowHighestPayingAd(bannerAlignType);
}
}
#endregion
2025-08-31 08:26:53 +00:00
#region
2026-01-06 08:29:08 +00:00
public void TrackAdImpression(string adsourceName,string adSourceInstanceName, AdValue adValue, AdsType type, string placement,NativeType nativeType)
{
AdjustTrackEvent.Instance.TrackAdEvent(adValue.Value / 1000000f,
adsourceName,
placement,
adSourceInstanceName);
2025-09-09 06:31:15 +00:00
var position = type switch
{
AdsType.Rewarded => _rvPos,
AdsType.Interstitial => _ivPos,
AdsType.Native => _naPos,
_ => ""
};
FireBaseAnalyticsManager.Instance.OnAdRevenueEvent(PlatformType.Admob.ToString(),
adsourceName,
2025-09-01 08:57:50 +00:00
placement,
type,
adValue.Value / 1000000f,
2025-09-09 06:31:15 +00:00
position,
2025-09-04 09:19:05 +00:00
AdPlayCountManager.GetAdsActionCount(type, AdPlayCountManager.PLAY_COUNT_SUFFIX));
2026-01-06 08:29:08 +00:00
var positionNumKey = position;
if(string.IsNullOrEmpty(positionNumKey)) positionNumKey = "Banner";
ShuShuEvent.Instance.OnAdRevenueEvent(PlatformType.Admob.ToString(),
adsourceName,
2025-09-01 08:57:50 +00:00
placement,
2026-01-06 08:29:08 +00:00
type,
adValue.Value / 1000000f,
2025-09-09 06:31:15 +00:00
position,
2026-01-06 08:29:08 +00:00
AdPlayCountManager.GetAdsActionCount(type, AdPlayCountManager.PLAY_COUNT_SUFFIX),
AdPlayCountManager.GetAdsActionCount(type,positionNumKey+AdPlayCountManager.POS_SUFFIX),
nativeType);
2025-08-31 08:26:53 +00:00
}
#endregion
#region 广
public void TrackAdAction(AdapterResponseInfo loadedAdapterResponseInfo, double revenue, AdsType type, string placement)
{
}
#endregion
2026-01-06 08:29:08 +00:00
}
}