com.guru.unity.sdk.core/Runtime/GuruCore/Runtime/Ads/ADService.cs

194 lines
5.3 KiB
C#

using System;
using UnityEngine;
namespace Guru
{
using System.Collections.Generic;
/// <summary>
/// 通用的ADService
/// </summary>
public class ADService: ADServiceBase<ADService>
{
/// <summary>
/// 版本号
/// </summary>
public static readonly string Version = "1.6.0";
#region 初始化
/// <summary>
/// 初始化服务
/// </summary>
protected override void InitService()
{
base.InitService();
InitChannels(_isDebug); // 启动各广告渠道代理
}
#endregion
#region 渠道管理
private HashSet<IAdChannel> _adChannels;
private AdChanelMax _chanelMax;
private IAsyncRequestChannel _asyncLoader;
/// <summary>
/// 各渠道初始化
/// </summary>
private void InitChannels(bool isDebug)
{
_adChannels = new HashSet<IAdChannel>();
IAdChannel channel = null;
_asyncLoader = null;
_chanelMax = new AdChanelMax(); // 默认持有MAXChannel
_chanelMax.Initialize(isDebug);
if(_initSpec != null) _chanelMax.SetBannerBackColor(_initSpec.bannerColorHex);
//------------ 以下为扩展的广告渠道 ------------------
// 请根据项目需求实现各渠道接入的逻辑
// 开启渠道需要添加对应的宏
channel = new AdChanelAmazon();
channel.Initialize(isDebug);
_adChannels.Add(channel); // Amazon
_asyncLoader = channel as IAsyncRequestChannel;
if (_asyncLoader != null)
{
_asyncLoader.OnBannerRequestOver = (success, firstLoad) =>
{
Debug.Log($"--- [Amazon] Async banner response, success:{success} -> OnLoadMaxBanner");
// if (success && firstLoad) OnLoadMaxBanner(); // 广告频率足够快, 不需要再次调用
};
_asyncLoader.OnInterstitialRequestOver = (success, firstLoad) =>
{
Debug.Log($"--- [Amazon] Async IV response, success:{success} -> OnLoadMaxIV");
// if (success && firstLoad) OnLoadMaxIV();
};
_asyncLoader.OnRewardRequestOver = (success, firstLoad) =>
{
Debug.Log($"--- [Amazon] Async RV response, success:{success} > OnLoadMaxRV");
// if (success && firstLoad) OnLoadMaxRV();
};
}
channel = new AdChannelPubMatic();
channel.Initialize();
_adChannels.Add(channel); // PubMatic
#if UNITY_EDITOR
Debug.Log($"---- Editor Ads Init Over ----");
_onSdkInitReady?.Invoke();
#endif
}
#endregion
#region Banner 广告
/// <summary>
/// 加载Banner广告
/// </summary>
public override void RequestBannerAD()
{
if (!IsInitialized) return;
OnChannelLoadBannerAD(); // 调用各渠道请求Banner
}
/// <summary>
/// 请求Banner广告
/// </summary>
private void OnChannelLoadBannerAD()
{
IAsyncRequestChannel loader = null;
foreach (var channel in _adChannels)
{
channel?.LoadBannerAD();
}
// if (null == _asyncLoader)
OnLoadMaxBanner();
}
private void OnLoadMaxBanner()
{
_badsloadStartTime = DateTime.UtcNow;
_chanelMax.LoadBannerAD();
OnBannerStartLoad?.Invoke(_chanelMax.MaxBADSSlotID);
}
#endregion
#region Interstitial 广告
public override void RequestInterstitialAD()
{
if (!IsInitialized) return;
if (IsIadsLoading) return;
OnChannelLoadInterstitialAD();
}
/// <summary>
/// 请求插屏广告
/// </summary>
private void OnChannelLoadInterstitialAD()
{
foreach (var channel in _adChannels)
{
channel?.LoadInterstitialAD();
}
// if (_asyncLoader == null)
OnLoadMaxIV();
}
private void OnLoadMaxIV() {
_iadsLoadStartTime = DateTime.UtcNow; // 更新计时器
_chanelMax.LoadInterstitialAD();
OnInterstitialStartLoad?.Invoke(_chanelMax.MaxIADSSlotID);
}
#endregion
#region Reward 广告
public override void RequestRewardedAD()
{
if (!IsInitialized) return;
if (IsRadsLoading) return;
OnChannelLoadRewardAD();
}
/// <summary>
/// 请求激励视频
/// </summary>
private void OnChannelLoadRewardAD()
{
// 各 Channel 都去加载激励视频
foreach (var channel in _adChannels)
{
channel?.LoadRewardAD();
}
// 最后 Max 渠道进行加载
OnLoadMaxRV();
}
private void OnLoadMaxRV()
{
_radsLoadStartTime = DateTime.UtcNow; // 更新计时器
_chanelMax.LoadRewardAD();
OnRewardedStartLoad?.Invoke(_chanelMax.MaxRADSSlotID);
}
#endregion
}
}