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 DKManager.AdsSDKManager.Constant;
|
|
|
|
|
|
using Script.Common;
|
|
|
|
|
|
using Script.SDKManager.AdsSDKManager.AdmobAdsManager;
|
|
|
|
|
|
using Script.SDKManager.AdsSDKManager.BigoAdsManager;
|
|
|
|
|
|
using Script.SDKManager.AdsSDKManager.MaxAdsManager;
|
|
|
|
|
|
using Script.SDKManager.AdsSDKManager.TpnAdsManager;
|
|
|
|
|
|
using Script.SDKManager.AdsSDKManager.Utils;
|
2025-08-31 07:12:52 +00:00
|
|
|
|
using Script.Utils;
|
2025-08-31 05:18:19 +00:00
|
|
|
|
using SDK.Utils;
|
2025-08-31 05:15:14 +00:00
|
|
|
|
using SDKManager.AdsSDKManager.Constant;
|
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
|
|
|
|
{
|
2025-08-31 07:12:52 +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);
|
2025-08-31 07:12:52 +00:00
|
|
|
|
|
|
|
|
|
|
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 07:12:52 +00:00
|
|
|
|
|
2025-08-31 05:15:14 +00:00
|
|
|
|
PlatformType result = GetBestPlatformType(false);
|
2025-08-31 07:12:52 +00:00
|
|
|
|
BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Rewarded);
|
2025-08-31 05:15:14 +00:00
|
|
|
|
if (result == PlatformType.Max)
|
|
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (result == PlatformType.Tpn)
|
|
|
|
|
|
{
|
|
|
|
|
|
TpnAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (result == PlatformType.Kwai)
|
2025-08-31 07:12:52 +00:00
|
|
|
|
{
|
2025-08-31 05:15:14 +00:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_showFailedCallback?.Invoke();
|
2025-08-31 07:12:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
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 07:12:52 +00:00
|
|
|
|
|
2025-08-31 05:15:14 +00:00
|
|
|
|
PlatformType result = GetBestPlatformType(true);
|
2025-08-31 07:12:52 +00:00
|
|
|
|
BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Interstitial);
|
2025-08-31 05:15:14 +00:00
|
|
|
|
if (result == PlatformType.Max)
|
|
|
|
|
|
{
|
2025-08-31 07:12:52 +00:00
|
|
|
|
MaxAdsManager.Instance.DisplayInterstitial(_adPos, _IvType,_closeCallback);
|
2025-08-31 05:15:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
else if (result == PlatformType.Admob)
|
|
|
|
|
|
{
|
2025-08-31 07:12:52 +00:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (result == PlatformType.Tpn)
|
|
|
|
|
|
{
|
|
|
|
|
|
TpnAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (result == PlatformType.Kwai)
|
2025-08-31 07:12:52 +00:00
|
|
|
|
{
|
2025-08-31 05:15:14 +00:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_closeCallback?.Invoke();
|
|
|
|
|
|
}
|
2025-08-31 07:12:52 +00:00
|
|
|
|
// 刷新其他类型广告
|
|
|
|
|
|
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(),
|
2025-08-31 07:12:52 +00:00
|
|
|
|
// 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(),
|
2025-08-31 07:12:52 +00:00
|
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-31 07:12:52 +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;
|
|
|
|
|
|
case PlatformType.Tpn:
|
|
|
|
|
|
RefreshTopOnAds(adType);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case PlatformType.Max:
|
|
|
|
|
|
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: 刷新激励广告
|
|
|
|
|
|
break;
|
|
|
|
|
|
case AdsType.Interstitial:
|
|
|
|
|
|
// todo: 刷新插屏广告
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-30 04:15:48 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 广告看完回调
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void OnRewardAdCallback(double price)
|
|
|
|
|
|
{
|
|
|
|
|
|
AdRewardCallback?.Invoke(price);
|
|
|
|
|
|
AdRewardCallback = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|