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

377 lines
12 KiB
C#
Raw Normal View History

2025-08-30 04:15:48 +00:00
using System;
2025-08-31 05:15:14 +00:00
using System.Collections.Generic;
using System.Linq;
using Firebase.RemoteConfig;
using Newtonsoft.Json;
2025-08-31 05:15:14 +00:00
using Script.Common;
using Script.SDKManager.AdsSDKManager.AdmobAdsManager;
using Script.SDKManager.AdsSDKManager.BigoAdsManager;
2025-08-31 13:19:46 +00:00
using Script.SDKManager.AdsSDKManager.Constant;
2025-08-31 05:15:14 +00:00
using Script.SDKManager.AdsSDKManager.MaxAdsManager;
using Script.SDKManager.AdsSDKManager.TpnAdsManager;
using Script.SDKManager.AdsSDKManager.Utils;
using Script.Utils;
2025-08-30 04:15:48 +00:00
using UnityEngine;
2025-08-31 05:18:19 +00:00
public class AdsSDKManager : NormalSingleton<AdsSDKManager>
2025-08-30 04:15:48 +00:00
{
2025-08-31 05:15:14 +00:00
private List<IAdService> _adNetworks = new List<IAdService>();
2025-08-30 04:15:48 +00:00
/// <summary>
/// 看完广告的回调
/// </summary>
private Action<double> AdRewardCallback;
/// <summary>
/// 广告竞价开关激励、插屏、全屏Native广告竞价
/// </summary>
public bool IsMoreAdsBidding = false;
2025-08-31 05:48:26 +00:00
public void InitSDK()
2025-08-30 04:15:48 +00:00
{
// 初始化广告平台状态
BidPlatformManager.Instance.InitializePlatformStates(AdConfigParser.GetAdExpireInSec());
InitializeAdNetworks();
}
private void InitializeAdNetworks()
{
2025-08-31 05:15:14 +00:00
_adNetworks.Add(AdmobAdsManager.Instance);
_adNetworks.Add(BigoAdsManager.Instance);
_adNetworks.Add(TpnAdsManager.Instance);
_adNetworks.Add(MaxAdsManager.Instance);
foreach (var network in _adNetworks)
{
network.Initialize();
}
2025-08-30 04:15:48 +00:00
}
2025-08-31 05:15:14 +00:00
public bool IsRewardAdReady()
{
return _adNetworks.Any(network => network.IsRewardedAvailable());
}
2025-08-30 04:15:48 +00:00
/// <summary>
/// 展示激励广告
/// </summary>
/// <param name="callback"></param>
2025-08-31 05:15:14 +00:00
public void ShowRewardAd(string _adPos, Action<bool> _rewardCallback = null, Action _showFailedCallback = null)
{
if (!IsRewardAdReady())
{
_showFailedCallback?.Invoke();
return;
}
2025-08-31 05:15:14 +00:00
PlatformType result = GetBestPlatformType(false);
BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Rewarded);
2025-08-31 12:48:14 +00:00
if (result == PlatformType.AppLovin)
2025-08-31 05:15:14 +00:00
{
MaxAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Admob)
{
AdmobAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Bigo)
{
BigoAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
2025-08-31 12:48:14 +00:00
else if (result == PlatformType.Topon)
2025-08-31 05:15:14 +00:00
{
TpnAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Kwai)
{
2025-08-31 05:15:14 +00:00
}
else
{
_showFailedCallback?.Invoke();
}
2025-08-31 13:19:46 +00:00
AdPlayCountManager.IncrementAdPlayCount(AdsType.Rewarded);
CheckAndRefreshExpiredBids(AdsType.Rewarded);
2025-08-31 05:15:14 +00:00
}
public bool IsInterstitialReady()
{
return _adNetworks.Any(network => network.IsInterstitialAvailable());
}
/// <summary>
/// 展示激励广告
/// </summary>
/// <param name="callback"></param>
public void ShowInterstitialAd(string _adPos, IvType _IvType = IvType.IV1, Action _closeCallback = null)
{
if (!IsRewardAdReady())
{
_closeCallback?.Invoke();
_closeCallback = null;
return;
}
2025-08-31 05:15:14 +00:00
PlatformType result = GetBestPlatformType(true);
BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Interstitial);
2025-08-31 12:48:14 +00:00
if (result == PlatformType.AppLovin)
2025-08-31 05:15:14 +00:00
{
MaxAdsManager.Instance.DisplayInterstitial(_adPos, _IvType,_closeCallback);
2025-08-31 05:15:14 +00:00
}
else if (result == PlatformType.Admob)
{
AdmobAdsManager.Instance.DisplayInterstitial(_adPos, _IvType,_closeCallback);
2025-08-31 05:15:14 +00:00
}
else if (result == PlatformType.Bigo)
{
BigoAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
2025-08-31 12:48:14 +00:00
else if (result == PlatformType.Topon)
2025-08-31 05:15:14 +00:00
{
TpnAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
else if (result == PlatformType.Kwai)
{
2025-08-31 05:15:14 +00:00
}
else
{
_closeCallback?.Invoke();
}
2025-08-31 13:19:46 +00:00
AdPlayCountManager.IncrementAdPlayCount(AdsType.Interstitial);
// 刷新其他类型广告
CheckAndRefreshExpiredBids(AdsType.Interstitial);
2025-08-31 05:15:14 +00:00
}
private PlatformType GetBestPlatformType(bool isInterstitial)
2025-08-30 04:15:48 +00:00
{
2025-08-31 05:15:14 +00:00
if (isInterstitial)
{
AdPriceInfo priceInfo = new AdPriceInfo(
maxPrice: MaxAdsManager.Instance.GetInterstitialRevenue(),
admobPrice: AdmobAdsManager.Instance.GetInterstitialRevenue(),
bigoPrice: BigoAdsManager.Instance.GetInterstitialRevenue(),
// todo : 这里的kwaiPrice暂时设置为0后续需要根据实际情况设置
kwaiPrice: 0,
2025-08-31 05:15:14 +00:00
toponAdUnitId: TpnAdsManager.Instance.topon_interstitial_units
);
return AdsBidResult.GetPlatformType(priceInfo);
}
else
{
AdPriceInfo priceInfo = new AdPriceInfo(
maxPrice: MaxAdsManager.Instance.GetRewardedRevenue(),
admobPrice: AdmobAdsManager.Instance.GetRewardedRevenue(),
bigoPrice: BigoAdsManager.Instance.GetRewardedRevenue(),
// todo : 这里的kwaiPrice暂时设置为0后续需要根据实际情况设置
kwaiPrice: 0,
2025-08-31 05:15:14 +00:00
toponAdUnitId: TpnAdsManager.Instance.topon_rewarded_units
);
return AdsBidResult.GetPlatformType(priceInfo);
}
2025-08-30 04:15:48 +00:00
}
// 检查并刷新过期竞价
private void CheckAndRefreshExpiredBids(AdsType _adsType)
{
Dictionary<PlatformType, List<AdsType>> expiredBids = BidPlatformManager.Instance.GetExpiredBids();
foreach (var kvp in expiredBids)
{
PlatformType platformName = kvp.Key;
foreach (AdsType adType in kvp.Value)
{
if (_adsType == adType)
{
LoggerUtils.Debug($"{platformName} 平台 {adType} 广告竞价已过期,重新加载广告");
RefreshPlatformAds(platformName, adType);
}
}
}
}
private void RefreshPlatformAds(PlatformType platformName, AdsType adType)
{
switch (platformName)
{
case PlatformType.Admob:
RefreshAdmobAds(adType);
break;
2025-08-31 12:48:14 +00:00
case PlatformType.Topon:
RefreshTopOnAds(adType);
break;
2025-08-31 12:48:14 +00:00
case PlatformType.AppLovin:
RefreshMaxAds(adType);
break;
case PlatformType.Bigo:
RefreshBigoAds(adType);
break;
case PlatformType.Kwai:
RefreshKwaiAds(adType);
break;
default:
break;
}
}
private void RefreshAdmobAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
AdmobAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
AdmobAdsManager.Instance.LoadInterstitial();
break;
case AdsType.Banner:
AdmobAdsManager.Instance.LoadBanner();
break;
case AdsType.Native:
AdmobAdsManager.Instance.LoadNative();
break;
case AdsType.Splash:
AdmobAdsManager.Instance.LoadSplash();
break;
default:
break;
}
}
// 刷新TopOn广告
private void RefreshTopOnAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
TpnAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
TpnAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
// 刷新Max广告
private void RefreshMaxAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
MaxAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
MaxAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
// 刷新Bigo广告
private void RefreshBigoAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
BigoAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
BigoAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
private void RefreshKwaiAds (AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
// todo: 刷新激励广告
KwaiAdsManager.Instance.LoadRewardAd();
break;
case AdsType.Interstitial:
// todo: 刷新插屏广告
KwaiAdsManager.Instance.LoadInterstitialAd();
break;
default:
break;
}
}
2025-08-30 04:15:48 +00:00
/// <summary>
/// 广告看完回调
/// </summary>
public void OnRewardAdCallback(double price)
{
AdRewardCallback?.Invoke(price);
AdRewardCallback = null;
}
/// <summary>
/// 根据IvRules判断是否可以展示插屏
/// </summary>
/// <returns></returns>
public bool IvRulesShow(IvType ivadType)
{
//1.获取远程配置
string json = FireBaseRemoteConfigManager.Instance.GetRemoteConfigString("IV_RULES");
if (string.IsNullOrEmpty(json))
{
return true;
}
//2.解析配置
var dates = JsonConvert.DeserializeObject<IvRulesData[]>(json);
if (dates == null && dates.Length == 0)
{
return true;
}
//3.获取IVADType对应的配置
IvRulesData ivRulesData = null;
foreach (var data in dates)
{
if (data.type == (int)ivadType)
{
ivRulesData = data;
}
}
if (ivRulesData == null)
{
return true;
}
//4.判断skip(次安装跳过几次触发不展示广告)
int skipLevel = ivRulesData.skipLevel;
int currentSkipLevel = PlayerPrefsUtils.GetPlayerPrefsInt(IvRulesKey.KEY_SKIPLEVEL, 0);
LoggerUtils.Debug($"[SDK] skipLevel is {skipLevel}, currentSkipLevel is {currentSkipLevel}");
if (currentSkipLevel < skipLevel)
{
PlayerPrefsUtils.SavePlayerPrefsInt(IvRulesKey.KEY_SKIPLEVEL, currentSkipLevel + 1);
return false;
}
//5.判断overLevel(没跳过几次触发)
int overLevel = ivRulesData.overLevel;
int currentOverLevel = IvRulesConst.CurrentOverLevel;
LoggerUtils.Debug($"[SDK] overLevel is {overLevel}, currentOverLevel is {currentOverLevel}");
if (currentOverLevel < overLevel)
{
IvRulesConst.CurrentOverLevel++;
return false;
}
//6.判断interval(广告时间间隔)
int interval = ivRulesData.interval;
long currentInterval = IvRulesConst.CurrentInterval;
long localTimestamp = TimeUtils.GetLocalTimestamp();
LoggerUtils.Debug($"[SDK] interval is {interval}, currentInterval is {currentInterval}, localTimestamp is {localTimestamp}");
if (localTimestamp < currentInterval + (interval * 1000L))
{
return false;
}
return true;
}
2025-08-30 04:15:48 +00:00
}