bigo ads
This commit is contained in:
parent
c6572464c2
commit
7a083da4fe
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f29d03f26edcc4074b581c302af83455
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,195 @@
|
||||||
|
using System;
|
||||||
|
namespace Script.Common
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 提供广告SDK功能的统一接口
|
||||||
|
/// </summary>
|
||||||
|
public interface IAdService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取广告客户端名称
|
||||||
|
/// </summary>
|
||||||
|
string ClientName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化广告SDK
|
||||||
|
/// </summary>
|
||||||
|
void Initialize();
|
||||||
|
|
||||||
|
#region 横幅广告功能
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载横幅广告
|
||||||
|
/// </summary>
|
||||||
|
void LoadBanner();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查横幅广告是否可用
|
||||||
|
/// </summary>
|
||||||
|
bool IsBannerAvailable();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示横幅广告
|
||||||
|
/// </summary>
|
||||||
|
void DisplayBanner();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 隐藏横幅广告
|
||||||
|
/// </summary>
|
||||||
|
void HideBanner();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取横幅广告收益信息
|
||||||
|
/// </summary>
|
||||||
|
double GetBannerRevenue();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 插页广告功能
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载插页广告
|
||||||
|
/// </summary>
|
||||||
|
void LoadInterstitial();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查插页广告是否可用
|
||||||
|
/// </summary>
|
||||||
|
bool IsInterstitialAvailable();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示插页广告
|
||||||
|
/// </summary>
|
||||||
|
void DisplayInterstitial();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取插页广告收益信息
|
||||||
|
/// </summary>
|
||||||
|
double GetInterstitialRevenue();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 激励广告功能
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载激励广告
|
||||||
|
/// </summary>
|
||||||
|
void LoadRewarded();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查激励广告是否可用
|
||||||
|
/// </summary>
|
||||||
|
bool IsRewardedAvailable();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示激励广告
|
||||||
|
/// </summary>
|
||||||
|
void DisplayRewarded();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取激励广告收益信息
|
||||||
|
/// </summary>
|
||||||
|
double GetRewardedRevenue();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 开屏广告功能
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载开屏广告
|
||||||
|
/// </summary>
|
||||||
|
void LoadSplash();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查开屏广告是否可用
|
||||||
|
/// </summary>
|
||||||
|
bool IsSplashAvailable();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示开屏广告
|
||||||
|
/// </summary>
|
||||||
|
void DisplaySplash();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取开屏广告收益信息
|
||||||
|
/// </summary>
|
||||||
|
double GetSplashRevenue();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 原生广告功能
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载原生广告
|
||||||
|
/// </summary>
|
||||||
|
void LoadNative();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查原生广告是否可用
|
||||||
|
/// </summary>
|
||||||
|
bool IsNativeAvailable();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示原生广告
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="position">广告位置和尺寸信息</param>
|
||||||
|
void DisplayNative(NativeAdPosition position);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除原生广告
|
||||||
|
/// </summary>
|
||||||
|
void RemoveNative();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取原生广告收益信息
|
||||||
|
/// </summary>
|
||||||
|
double GetNativeRevenue();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示处理回调的信息
|
||||||
|
/// </summary>
|
||||||
|
[Serializable]
|
||||||
|
public struct CallbackResult
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 回调消息
|
||||||
|
/// </summary>
|
||||||
|
public string Message;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指示广告是否准备就绪
|
||||||
|
/// </summary>
|
||||||
|
public bool IsReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示原生广告的位置和尺寸
|
||||||
|
/// </summary>
|
||||||
|
[Serializable]
|
||||||
|
public class NativeAdPosition
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// X坐标
|
||||||
|
/// </summary>
|
||||||
|
public int X;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Y坐标
|
||||||
|
/// </summary>
|
||||||
|
public int Y;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 广告宽度
|
||||||
|
/// </summary>
|
||||||
|
public int Width;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 广告高度
|
||||||
|
/// </summary>
|
||||||
|
public int Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8c783da4d1e92421e875e007d834b039
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cdbba6a75dfa94e48af5d951115e1816
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,219 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BigoAds.Scripts.Api;
|
||||||
|
using Script.Common;
|
||||||
|
using Script.Utils;
|
||||||
|
using SDK.Utils;
|
||||||
|
using Unity.VisualScripting;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Script.SDKManager.AdsSDKManager.BigoAdsManager
|
||||||
|
{
|
||||||
|
public class BigoAdsManager : NormalSingleton<BigoAdsManager>, IAdService
|
||||||
|
{
|
||||||
|
public string ClientName => "BigoAds";
|
||||||
|
private BigoRewardedAdManager _rewardedAdManager;
|
||||||
|
private BigoInterstitialAdManager _interstitialAdManager;
|
||||||
|
private List<string> _interstitialAdUnits;
|
||||||
|
private List<string> _rewardedAdUnits;
|
||||||
|
public string bigo_app_id;
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(bigo_app_id)) return;
|
||||||
|
_rewardedAdUnits = GetRewardedAdUnitsFromServer();
|
||||||
|
_interstitialAdUnits = GetInterstitialAdUnitsFromServer();
|
||||||
|
BigoAdSdk.OnInitFinish += () =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($" bigo sdk init success");
|
||||||
|
_rewardedAdManager = new BigoRewardedAdManager();
|
||||||
|
_rewardedAdManager.InitializeAdUnits(
|
||||||
|
_rewardedAdUnits,
|
||||||
|
onAdLoaded: OnRewardedAdLoaded,
|
||||||
|
onAdLoadFailed: OnRewardedAdLoadFailed,
|
||||||
|
onAdShowed: OnRewardedAdShowed,
|
||||||
|
onAdDismissed: OnRewardedAdDismissed,
|
||||||
|
onAdError: OnRewardedAdError,
|
||||||
|
onAdClicked: OnRewardedAdClicked
|
||||||
|
);
|
||||||
|
_interstitialAdManager = new BigoInterstitialAdManager();
|
||||||
|
_interstitialAdManager.InitializeAdUnits(
|
||||||
|
_interstitialAdUnits,
|
||||||
|
onAdLoaded: OnInterstitialAdLoaded,
|
||||||
|
onAdLoadFailed: OnInterstitialAdLoadFailed,
|
||||||
|
onAdShowed: OnInterstitialAdShowed,
|
||||||
|
onAdDismissed: OnInterstitialAdDismissed,
|
||||||
|
onAdError: OnInterstitialAdError,
|
||||||
|
onAdClicked: OnInterstitialAdClicked
|
||||||
|
);
|
||||||
|
};
|
||||||
|
// todo
|
||||||
|
var config = new BigoAdConfig.Builder()
|
||||||
|
.SetAppId(bigo_app_id)
|
||||||
|
.SetDebugLog(false)
|
||||||
|
.Build();
|
||||||
|
BigoAdSdk.Initialize(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Rewarded
|
||||||
|
// 各个回调处理方法
|
||||||
|
private void OnRewardedAdLoaded(string adUnitId)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnRewardedAdLoadFailed(string adUnitId, int code, string msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnRewardedAdShowed(string adUnitId)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
private void OnRewardedAdDismissed(string adUnitId)
|
||||||
|
{
|
||||||
|
_rewardedAdManager.Destroy();
|
||||||
|
LoadRewarded();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnRewardedAdError(string adUnitId, int code, string msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnRewardedAdClicked()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadRewarded()
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (var adUnitId in _rewardedAdUnits)
|
||||||
|
{
|
||||||
|
_rewardedAdManager.LoadAd(adUnitId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsRewardedAvailable()
|
||||||
|
{
|
||||||
|
return _rewardedAdManager.GetAvailableAdUnits().Count > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisplayRewarded()
|
||||||
|
{
|
||||||
|
_rewardedAdManager.ShowHighestPayingAd();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetRewardedRevenue()
|
||||||
|
{
|
||||||
|
return _rewardedAdManager.GetHighestPayingAdRevenue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从服务器获取广告位配置
|
||||||
|
private List<string> GetRewardedAdUnitsFromServer()
|
||||||
|
{
|
||||||
|
// todo
|
||||||
|
return new List<string> { "bigo_reward_unit_1", "bigo_reward_unit_2", "bigo_reward_unit_3" };
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Interstitial
|
||||||
|
private void OnInterstitialAdLoaded(string adUnitId)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInterstitialAdLoadFailed(string adUnitId, int code, string msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInterstitialAdShowed(string adUnitId)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
private void OnInterstitialAdDismissed(string adUnitId)
|
||||||
|
{
|
||||||
|
_interstitialAdManager.Destroy();
|
||||||
|
LoadInterstitial();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInterstitialAdError(string adUnitId, int code, string msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInterstitialAdClicked()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadInterstitial()
|
||||||
|
{
|
||||||
|
foreach (var adUnitId in _interstitialAdUnits)
|
||||||
|
{
|
||||||
|
_interstitialAdManager.LoadAd(adUnitId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsInterstitialAvailable()
|
||||||
|
{
|
||||||
|
// 检查是否有任意一个广告位可用
|
||||||
|
return _interstitialAdManager.GetAvailableAdUnits().Count > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisplayInterstitial()
|
||||||
|
{
|
||||||
|
_interstitialAdManager.ShowHighestPayingAd();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetInterstitialRevenue()
|
||||||
|
{
|
||||||
|
return _interstitialAdManager.GetHighestPayingAdRevenue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从服务器获取广告位配置
|
||||||
|
private List<string> GetInterstitialAdUnitsFromServer()
|
||||||
|
{
|
||||||
|
// 实现从服务器获取广告位ID列表的逻辑
|
||||||
|
// todo
|
||||||
|
return new List<string> { "bigo_interstitial_unit_1", "bigo_interstitial_unit_2", "bigo_interstitial_unit_3" };
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 开屏广告
|
||||||
|
|
||||||
|
public void LoadSplash() { }
|
||||||
|
public bool IsSplashAvailable() { return false; }
|
||||||
|
public void DisplaySplash() { }
|
||||||
|
public double GetSplashRevenue() { return 0; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 原生广告功能
|
||||||
|
public void LoadNative() { }
|
||||||
|
public bool IsNativeAvailable() { return false; }
|
||||||
|
public void DisplayNative(NativeAdPosition position) { }
|
||||||
|
public void RemoveNative() { }
|
||||||
|
public double GetNativeRevenue() { return 0; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 横幅广告功能
|
||||||
|
public void LoadBanner() { }
|
||||||
|
public bool IsBannerAvailable() { return false; }
|
||||||
|
public void DisplayBanner() { }
|
||||||
|
public void HideBanner() { }
|
||||||
|
public double GetBannerRevenue() { return 0; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 32bd7a6ecbc5e48da929eb774391fe49
|
|
@ -0,0 +1,209 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BigoAds.Scripts.Api;
|
||||||
|
using Script.Utils;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Script.SDKManager.AdsSDKManager.BigoAdsManager
|
||||||
|
{
|
||||||
|
|
||||||
|
public class BigoInterstitialAdManager
|
||||||
|
{
|
||||||
|
private Dictionary<string, BigoInterstitialAd> _interstitialAds = new Dictionary<string, BigoInterstitialAd>();
|
||||||
|
private Dictionary<string, int> _retryCounters = new Dictionary<string, int>();
|
||||||
|
private Dictionary<string, Action> _loadCallbacks = new Dictionary<string, Action>();
|
||||||
|
private Dictionary<string, double> _adRevenueCache = new Dictionary<string, double>();
|
||||||
|
|
||||||
|
public void InitializeAdUnits(List<string> adUnitIds, Action<string> onAdLoaded = null,
|
||||||
|
Action<string, int, string> onAdLoadFailed = null,
|
||||||
|
Action<string> onAdShowed = null,
|
||||||
|
Action<string> onAdDismissed = null,
|
||||||
|
Action<string, int, string> onAdError = null,
|
||||||
|
Action onAdClicked = null)
|
||||||
|
{
|
||||||
|
foreach (var adUnitId in adUnitIds)
|
||||||
|
{
|
||||||
|
CreateRewardedAd(adUnitId, onAdLoaded, onAdLoadFailed, onAdShowed, onAdDismissed, onAdError, onAdClicked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateRewardedAd(string adUnitId, Action<string> onAdLoaded,
|
||||||
|
Action<string, int, string> onAdLoadFailed,
|
||||||
|
Action<string> onAdShowed,
|
||||||
|
Action<string> onAdDismissed,
|
||||||
|
Action<string, int, string> onAdError,
|
||||||
|
Action onAdClicked)
|
||||||
|
{
|
||||||
|
if (_interstitialAds.ContainsKey(adUnitId))
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"Bigo Interstitial Ad unit {adUnitId} already exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var interstitialAd = new BigoInterstitialAd(adUnitId);
|
||||||
|
_interstitialAds[adUnitId] = interstitialAd;
|
||||||
|
_retryCounters[adUnitId] = 0;
|
||||||
|
_adRevenueCache[adUnitId] = 0;
|
||||||
|
|
||||||
|
interstitialAd.OnLoad += () =>
|
||||||
|
{
|
||||||
|
_retryCounters[adUnitId] = 0;
|
||||||
|
_adRevenueCache[adUnitId] = GetAdRevenue(interstitialAd);
|
||||||
|
LoggerUtils.Debug($"[Bigo] Interstitial -[Load]: {adUnitId} successfully");
|
||||||
|
onAdLoaded?.Invoke(adUnitId);
|
||||||
|
};
|
||||||
|
|
||||||
|
interstitialAd.OnLoadFailed += ((code, msg) =>
|
||||||
|
{
|
||||||
|
_retryCounters[adUnitId]++;
|
||||||
|
double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId]));
|
||||||
|
LoggerUtils.Debug($"[Bigo] Interstitial -[Load]: {adUnitId} failed, errorCode ={code}, error message = {msg}");
|
||||||
|
|
||||||
|
// 延迟重试加载
|
||||||
|
_loadCallbacks[adUnitId] = () => LoadAd(adUnitId);
|
||||||
|
TimerUtils.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke());
|
||||||
|
onAdLoadFailed?.Invoke(adUnitId, code, msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
interstitialAd.OnAdShowed += (() =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"[Bigo] Interstitial -[interaction]: {adUnitId} show");
|
||||||
|
onAdShowed?.Invoke(adUnitId);
|
||||||
|
});
|
||||||
|
|
||||||
|
interstitialAd.OnAdDismissed += (() =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"[Bigo] Interstitial -[interaction]: {adUnitId} dismiss");
|
||||||
|
onAdDismissed?.Invoke(adUnitId);
|
||||||
|
});
|
||||||
|
|
||||||
|
interstitialAd.OnAdError += ((code, msg) =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"[Bigo] Interstitial-[interaction]: {adUnitId} ad error, errorCode ={code}, error message = {msg}");
|
||||||
|
onAdError?.Invoke(adUnitId, code, msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
interstitialAd.OnAdClicked += () =>
|
||||||
|
{
|
||||||
|
onAdClicked?.Invoke();
|
||||||
|
};
|
||||||
|
LoadAd(adUnitId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadAd(string adUnitId)
|
||||||
|
{
|
||||||
|
if (_interstitialAds.TryGetValue(adUnitId, out var ad))
|
||||||
|
{
|
||||||
|
ad.Load(new BigoInterstitialRequest());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示价格最高的广告
|
||||||
|
public void ShowHighestPayingAd()
|
||||||
|
{
|
||||||
|
var highestPayingAdUnit = GetHighestPayingAdUnit();
|
||||||
|
if (!string.IsNullOrEmpty(highestPayingAdUnit))
|
||||||
|
{
|
||||||
|
ShowAd(highestPayingAdUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示特定广告位的广告
|
||||||
|
private void ShowAd(string adUnitId)
|
||||||
|
{
|
||||||
|
if (_interstitialAds.TryGetValue(adUnitId, out var ad))
|
||||||
|
{
|
||||||
|
ad.Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 检查特定广告位是否可用
|
||||||
|
private bool IsAdAvailable(string adUnitId)
|
||||||
|
{
|
||||||
|
return _interstitialAds.TryGetValue(adUnitId, out var ad) && ad.IsLoaded() && !ad.IsExpired();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有可用的广告位
|
||||||
|
public List<string> GetAvailableAdUnits()
|
||||||
|
{
|
||||||
|
var available = new List<string>();
|
||||||
|
foreach (var kvp in _interstitialAds)
|
||||||
|
{
|
||||||
|
if (kvp.Value.IsLoaded() && !kvp.Value.IsExpired())
|
||||||
|
{
|
||||||
|
available.Add(kvp.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return available;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取广告收益
|
||||||
|
private double GetAdRevenue(BigoInterstitialAd ad)
|
||||||
|
{
|
||||||
|
var bid = ad?.GetBid();
|
||||||
|
if (bid == null) return 0;
|
||||||
|
return bid.getPrice() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取特定广告位的收益信息
|
||||||
|
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 = 0;
|
||||||
|
|
||||||
|
foreach (var kvp in _adRevenueCache)
|
||||||
|
{
|
||||||
|
var adUnitId = kvp.Key;
|
||||||
|
var revenue = kvp.Value;
|
||||||
|
|
||||||
|
// 确保广告确实已加载并且价格更高
|
||||||
|
if (IsAdAvailable(adUnitId) && 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 _interstitialAds.Values)
|
||||||
|
{
|
||||||
|
ad.DestroyAd();
|
||||||
|
}
|
||||||
|
_interstitialAds.Clear();
|
||||||
|
_retryCounters.Clear();
|
||||||
|
_loadCallbacks.Clear();
|
||||||
|
_adRevenueCache.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5eeffddf05d3b49bfa0c72cb70f6636c
|
|
@ -0,0 +1,209 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BigoAds.Scripts.Api;
|
||||||
|
using Script.Utils;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Script.SDKManager.AdsSDKManager.BigoAdsManager
|
||||||
|
{
|
||||||
|
|
||||||
|
public class BigoRewardedAdManager
|
||||||
|
{
|
||||||
|
private Dictionary<string, BigoRewardedAd> _rewardedAds = new Dictionary<string, BigoRewardedAd>();
|
||||||
|
private Dictionary<string, int> _retryCounters = new Dictionary<string, int>();
|
||||||
|
private Dictionary<string, Action> _loadCallbacks = new Dictionary<string, Action>();
|
||||||
|
private Dictionary<string, double> _adRevenueCache = new Dictionary<string, double>();
|
||||||
|
|
||||||
|
public void InitializeAdUnits(List<string> adUnitIds, Action<string> onAdLoaded = null,
|
||||||
|
Action<string, int, string> onAdLoadFailed = null,
|
||||||
|
Action<string> onAdShowed = null,
|
||||||
|
Action<string> onAdDismissed = null,
|
||||||
|
Action<string, int, string> onAdError = null,
|
||||||
|
Action onAdClicked = null)
|
||||||
|
{
|
||||||
|
foreach (var adUnitId in adUnitIds)
|
||||||
|
{
|
||||||
|
CreateRewardedAd(adUnitId, onAdLoaded, onAdLoadFailed, onAdShowed, onAdDismissed, onAdError, onAdClicked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateRewardedAd(string adUnitId, Action<string> onAdLoaded,
|
||||||
|
Action<string, int, string> onAdLoadFailed,
|
||||||
|
Action<string> onAdShowed,
|
||||||
|
Action<string> onAdDismissed,
|
||||||
|
Action<string, int, string> onAdError,
|
||||||
|
Action onAdClicked)
|
||||||
|
{
|
||||||
|
if (_rewardedAds.ContainsKey(adUnitId))
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Ad unit {adUnitId} already exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var rewardedAd = new BigoRewardedAd(adUnitId);
|
||||||
|
_rewardedAds[adUnitId] = rewardedAd;
|
||||||
|
_retryCounters[adUnitId] = 0;
|
||||||
|
_adRevenueCache[adUnitId] = 0;
|
||||||
|
|
||||||
|
rewardedAd.OnLoad += () =>
|
||||||
|
{
|
||||||
|
_retryCounters[adUnitId] = 0;
|
||||||
|
_adRevenueCache[adUnitId] = GetAdRevenue(rewardedAd);
|
||||||
|
LoggerUtils.Debug($"[BigoRewarded]-[Load]: {adUnitId} successfully");
|
||||||
|
onAdLoaded?.Invoke(adUnitId);
|
||||||
|
};
|
||||||
|
|
||||||
|
rewardedAd.OnLoadFailed += ((code, msg) =>
|
||||||
|
{
|
||||||
|
_retryCounters[adUnitId]++;
|
||||||
|
double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId]));
|
||||||
|
LoggerUtils.Debug($"[BigoRewarded]-[Load]: {adUnitId} failed, errorCode ={code}, error message = {msg}");
|
||||||
|
|
||||||
|
// 延迟重试加载
|
||||||
|
_loadCallbacks[adUnitId] = () => LoadAd(adUnitId);
|
||||||
|
TimerUtils.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke());
|
||||||
|
onAdLoadFailed?.Invoke(adUnitId, code, msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
rewardedAd.OnAdShowed += (() =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"[BigoRewarded]-[interaction]: {adUnitId} show");
|
||||||
|
onAdShowed?.Invoke(adUnitId);
|
||||||
|
});
|
||||||
|
|
||||||
|
rewardedAd.OnAdDismissed += (() =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"[BigoRewarded]-[interaction]: {adUnitId} dismiss");
|
||||||
|
onAdDismissed?.Invoke(adUnitId);
|
||||||
|
});
|
||||||
|
|
||||||
|
rewardedAd.OnAdError += ((code, msg) =>
|
||||||
|
{
|
||||||
|
LoggerUtils.Debug($"[BigoRewarded]-[interaction]: {adUnitId} ad error, errorCode ={code}, error message = {msg}");
|
||||||
|
onAdError?.Invoke(adUnitId, code, msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
rewardedAd.OnAdClicked += () =>
|
||||||
|
{
|
||||||
|
onAdClicked?.Invoke();
|
||||||
|
};
|
||||||
|
LoadAd(adUnitId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadAd(string adUnitId)
|
||||||
|
{
|
||||||
|
if (_rewardedAds.TryGetValue(adUnitId, out var ad))
|
||||||
|
{
|
||||||
|
ad.Load(new BigoRewardedRequest());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示价格最高的广告
|
||||||
|
public void ShowHighestPayingAd()
|
||||||
|
{
|
||||||
|
var highestPayingAdUnit = GetHighestPayingAdUnit();
|
||||||
|
if (!string.IsNullOrEmpty(highestPayingAdUnit))
|
||||||
|
{
|
||||||
|
ShowAd(highestPayingAdUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示特定广告位的广告
|
||||||
|
private void ShowAd(string adUnitId)
|
||||||
|
{
|
||||||
|
if (_rewardedAds.TryGetValue(adUnitId, out var ad))
|
||||||
|
{
|
||||||
|
ad.Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 检查特定广告位是否可用
|
||||||
|
private bool IsAdAvailable(string adUnitId)
|
||||||
|
{
|
||||||
|
return _rewardedAds.TryGetValue(adUnitId, out var ad) && ad.IsLoaded() && !ad.IsExpired();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有可用的广告位
|
||||||
|
public List<string> GetAvailableAdUnits()
|
||||||
|
{
|
||||||
|
var available = new List<string>();
|
||||||
|
foreach (var kvp in _rewardedAds)
|
||||||
|
{
|
||||||
|
if (kvp.Value.IsLoaded() && !kvp.Value.IsExpired())
|
||||||
|
{
|
||||||
|
available.Add(kvp.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return available;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取广告收益
|
||||||
|
private double GetAdRevenue(BigoRewardedAd ad)
|
||||||
|
{
|
||||||
|
var bid = ad?.GetBid();
|
||||||
|
if (bid == null) return 0;
|
||||||
|
return bid.getPrice() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取特定广告位的收益信息
|
||||||
|
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 = 0;
|
||||||
|
|
||||||
|
foreach (var kvp in _adRevenueCache)
|
||||||
|
{
|
||||||
|
var adUnitId = kvp.Key;
|
||||||
|
var revenue = kvp.Value;
|
||||||
|
|
||||||
|
// 确保广告确实已加载并且价格更高
|
||||||
|
if (IsAdAvailable(adUnitId) && 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 _rewardedAds.Values)
|
||||||
|
{
|
||||||
|
ad.DestroyAd();
|
||||||
|
}
|
||||||
|
_rewardedAds.Clear();
|
||||||
|
_retryCounters.Clear();
|
||||||
|
_loadCallbacks.Clear();
|
||||||
|
_adRevenueCache.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c2a850afd5e804d71a3bda35898ee218
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f3dcbc43a8b6e4fe1a9fc9170c244785
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,55 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Unity.VisualScripting;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Script.Utils
|
||||||
|
{
|
||||||
|
public static class LoggerUtils
|
||||||
|
{
|
||||||
|
private static bool _enabled = true;
|
||||||
|
|
||||||
|
public static bool Enabled
|
||||||
|
{
|
||||||
|
get => _enabled;
|
||||||
|
set => _enabled = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Debug(object message, Object context = null)
|
||||||
|
{
|
||||||
|
if (!_enabled) return;
|
||||||
|
Log($"[DEBUG] {message}", context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Info(object message, Object context = null)
|
||||||
|
{
|
||||||
|
if (!!_enabled) return;
|
||||||
|
Log($"[INFO] {message}", context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Warning(object message, Object context = null)
|
||||||
|
{
|
||||||
|
if (!_enabled) return;
|
||||||
|
Log($"[WARNING] {message}", context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Error(object message, Object context = null)
|
||||||
|
{
|
||||||
|
if (!!_enabled) return;
|
||||||
|
Log($"[ERROR] {message}", context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Log(string message, Object context = null)
|
||||||
|
{
|
||||||
|
if (context != null)
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.Log(message, context);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.Log(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7e6c7794484654e39acf594e7200206a
|
|
@ -0,0 +1,165 @@
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace SDK.Utils
|
||||||
|
{
|
||||||
|
public abstract class NormalSingleton<T> where T : new()
|
||||||
|
{
|
||||||
|
private static T mInstance;
|
||||||
|
public static T Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (mInstance == null)
|
||||||
|
{
|
||||||
|
mInstance = new T();
|
||||||
|
}
|
||||||
|
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 动态(Dynamic)
|
||||||
|
/// </summary>
|
||||||
|
public abstract class D_MonoSingleton<T> : MonoBehaviour where T : D_MonoSingleton<T>
|
||||||
|
{
|
||||||
|
private static T mInstance = null;
|
||||||
|
|
||||||
|
public static T Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (mInstance == null)
|
||||||
|
{
|
||||||
|
GameObject tFramewokGo = GameObject.Find("TKFramework");
|
||||||
|
if (tFramewokGo == null)
|
||||||
|
{
|
||||||
|
tFramewokGo = new GameObject("TKFramework");
|
||||||
|
DontDestroyOnLoad(tFramewokGo);
|
||||||
|
}
|
||||||
|
GameObject tGo = new GameObject();
|
||||||
|
tGo.transform.SetParent(tFramewokGo.transform);
|
||||||
|
tGo.name = typeof(T).ToString();
|
||||||
|
tGo.transform.localPosition = Vector3.zero;
|
||||||
|
tGo.transform.localEulerAngles = Vector3.zero;
|
||||||
|
tGo.transform.localScale = Vector3.one;
|
||||||
|
mInstance = tGo.AddComponent<T>();
|
||||||
|
}
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Transform mTrans;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
mTrans = transform;
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Initialize()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
mInstance = null;
|
||||||
|
|
||||||
|
Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 静态(static)
|
||||||
|
/// </summary>
|
||||||
|
public abstract class S_MonoSingleton<T> : MonoBehaviour where T : S_MonoSingleton<T>
|
||||||
|
{
|
||||||
|
private static T mInstance = null;
|
||||||
|
public static T Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (mInstance != null && mInstance != (T)this)
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mInstance = (T)this;
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Initialize()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
mInstance = null;
|
||||||
|
|
||||||
|
Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 静态常驻
|
||||||
|
/// </summary>
|
||||||
|
public abstract class O_MonoSingleton<T> : MonoBehaviour where T : O_MonoSingleton<T>
|
||||||
|
{
|
||||||
|
private static T mInstance = null;
|
||||||
|
public static T Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
if (mInstance != null && mInstance != (T)this)
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mInstance = (T)this;
|
||||||
|
DontDestroyOnLoad(gameObject);
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Initialize()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
mInstance = null;
|
||||||
|
|
||||||
|
Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: eb54f82607e0946e4ac5cbfb0ca49967
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Script.Utils
|
||||||
|
{
|
||||||
|
public static class TimerUtils
|
||||||
|
{
|
||||||
|
private static MonoBehaviour _coroutineRunner;
|
||||||
|
|
||||||
|
public static void Initialize(MonoBehaviour runner)
|
||||||
|
{
|
||||||
|
_coroutineRunner = runner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DelayExecute(float delay, Action action)
|
||||||
|
{
|
||||||
|
if (_coroutineRunner != null)
|
||||||
|
{
|
||||||
|
_coroutineRunner.StartCoroutine(DelayExecuteCoroutine(delay, action));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerator DelayExecuteCoroutine(float delay, Action action)
|
||||||
|
{
|
||||||
|
yield return new WaitForSeconds(delay);
|
||||||
|
action?.Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6e18cf88978e94ad4bd074b3a427bbc9
|
Loading…
Reference in New Issue