Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益
Unity 之 最新Ads原生广告接入流程详解和工具类分享
Unity Ads 是由 Unity Technologies 开发的广告平台,可以用于在移动应用程序中显示广告。它提供了多种广告类型,包括插屏广告、横幅广告、视频广告等。
在本文中,我们将详细介绍如何接入 Unity Ads 广告 SDK。
一,注册 Unity Ads 广告 SDK
在使用 Unity Ads 广告 SDK 之前,需要先登录Unity Ads后台。地址: https://dashboard.unity3d.com/gaming/organizations
-
登录在Unity账号,注意要和本地Hub使用同一账号。
-
登录成功后,在“项目管理” 可进入到这个界面,然后在“Projects” 面板中创建一个项目即可:
-
创建项目之后,返回到上一层,找到广告配置界面:
其他的数据看吧想不用管,广告位置ID也不用改,先按照默认操作集成即可。其他面板也可以等集成成功后慢慢看。
二,下载 Unity Ads 广告 SDK
Unity Ads 广告 SDK 可以从 Unity Asset Store 中下载,并导入到您的 Unity 项目中。在 Unity 中,选择菜单栏的“Window”>“Package Manager”,然后在“Packages”选项卡中搜索“Advertisement Legacy”,点击“Install”按钮即可下载和安装:
-
安装
-
安装完成后,在Project Setting中找到Services --> Ads,点击OFF 打开
-
打开后选择1步骤中后台创建的项目,完成后即可入到如下界面
可以看到 GameId
中的 Android
和iOS
都已经有了和后台项目创建的一致。
注意:TestMode是测试模式,正式发布前需要取消:Enable test mode
选项。
三,配置 Unity Ads 广告 SDK
3.1 广告位展示流程
- 广告初始化
- 成功 --> 加载广告位
- 失败 --> 设定几秒后重新加载
- 广告位加载广告
- 成功 --> 可展示广告
- 失败 --> 设定几秒后重新加载
- 在指定位置展示广告
- 成功 --> 监听展示结果,比如:激励广告完成发放奖励
- 失败 --> 加载成功后几乎不会有展示失败的情况
3.2 代码初始化
注意配置的广告ID换成自己的,测试模式是否开启手动控制。初始化代码如下:
[SerializeField] string _androidGameId = "5309904";
[SerializeField] string _iOSGameId = "5309905";
[SerializeField] bool _testMode = true;
private string _gameId;
void Awake()
{
InitializeAds();
}
public void InitializeAds()
{
#if UNITY_IOS
_gameId = _iOSGameId;
#elif UNITY_ANDROID
_gameId = _androidGameId;
#elif UNITY_EDITOR
_gameId = _androidGameId;
#endif
if (!Advertisement.isInitialized && Advertisement.isSupported)
{
Advertisement.Initialize(_gameId, _testMode, this);
}
}
四,集成 Unity Ads 广告 SDK
4.1 相关介绍
-
设置Banner位置:
在代码中,使用 Unity Ads SDK 的 Banner API 来显示横幅广告。使用Advertisement.Banner.SetPosition(_bannerPosition)
方法设置广告位置,然后使用Show()
方法显示广告。 -
插屏和激励视频
对于插屏广告和奖励视频广告,可以使用 Unity Ads SDK 的Interstitial API
和Rewarded Video API
来显示广告。
在显示广告时,可以通过监听广告事件来处理广告的状态。例如,在插屏广告显示完成后,可以使用以下代码来处理广告事件:
在此示例中,我们通过实现 IUnityAdsListener
接口来监听广告事件。在 Start()
方法中,我们添加了一个监听器,并使用 Initialize()
方法初始化广告 SDK。然后,我们使用 Show()
方法显示插屏广告。当广告状态发生变化时,Unity Ads SDK 将调用相应的事件方法。
4.2 代码分享
测试代码如下:注意更换自己的项目id
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Advertisements;
public class UnityAdsManager : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
{
public static UnityAdsManager Ins;
[SerializeField] string _androidGameId = "5309985";
[SerializeField] string _iOSGameId = "5309984";
[SerializeField] bool _testMode = true;
private string _gameId;
void Awake()
{
Ins = this;
InitializeAds();
}
public void InitializeAds()
{
#if UNITY_IOS
_gameId = _iOSGameId;
#elif UNITY_ANDROID
_gameId = _androidGameId;
#elif UNITY_EDITOR
_gameId = _androidGameId;
#endif
if (!Advertisement.isInitialized && Advertisement.isSupported)
{
Advertisement.Initialize(_gameId, _testMode, this);
}
}
public void OnInitializationComplete()
{
Debug.Log("Unity Ads 广告初始化完成.");
InitAdUnit();
InitRewardAD();
InitBanner();
}
public void OnInitializationFailed(UnityAdsInitializationError error, string message)
{
Debug.Log($"Unity Ads 广告初始化失败: {error.ToString()} - {message}");
}
#region 插屏广告
// 插屏广告ID
string _androidAdUnitId = "Interstitial_Android";
string _iOsAdUnitId = "Interstitial_iOS";
string _adInterstitialId;
private bool _InterstitialLoaded = false;
void InitAdUnit()
{
_adInterstitialId = (Application.platform == RuntimePlatform.IPhonePlayer)
? _iOsAdUnitId
: _androidAdUnitId;
LoadInterstitialAd();
}
/// <summary>
/// 加载插屏
/// </summary>
public void LoadInterstitialAd()
{
if (_InterstitialLoaded) return;
Debug.Log("Loading Ads 加载插屏广告ID: " + _adInterstitialId);
Advertisement.Load(_adInterstitialId, this);
}
/// <summary>
/// 展示插屏
/// </summary>
public void ShowInterstitialAd()
{
if (_InterstitialLoaded)
{
Debug.Log("Showing Ads 显示广告ID: " + _adInterstitialId);
Advertisement.Show(_adInterstitialId, this);
}
else
{
LoadInterstitialAd();
}
}
#endregion 插屏
#region 激励视频
string _androidRewardedUnitId = "Rewarded_Android";
string _iOSRewardedId = "Rewarded_iOS";
string _adRewardedId = null;
private bool _RewardLoaded = false;
void InitRewardAD()
{
#if UNITY_IOS
_adRewardedId = _iOSRewardedId;
#elif UNITY_ANDROID
_adRewardedId = _androidRewardedUnitId;
#endif
LoadRewardedAd();
}
/// <summary>
/// 加载激励视频
/// </summary>
public void LoadRewardedAd()
{
if (_RewardLoaded) return;
Debug.Log("Loading Ad: " + _adRewardedId);
Advertisement.Load(_adRewardedId, this);
}
private Action<bool> RewardedAdClose;
/// <summary>
/// 展示激励视频
/// </summary>
public void ShowRewardedAd(Action<bool> OnClose)
{
RewardedAdClose = OnClose;
Advertisement.Show(_adRewardedId, this);
}
#endregion
#region Banner
[SerializeField] BannerPosition _bannerPosition = BannerPosition.BOTTOM_CENTER;
string _androidBannerId = "TpxxlLobbyPopBanner";
string _iOSBannerId = "Banner_iOS";
string _adBannerId = null;
private bool _adBannerLoaded = false;
void InitBanner()
{
// Get the Ad Unit ID for the current platform:
#if UNITY_IOS
_adBannerId = _iOSBannerId;
#elif UNITY_ANDROID
_adBannerId = _androidBannerId;
#endif
// 设置Banner显示位置
Advertisement.Banner.SetPosition(_bannerPosition);
}
public void LoadBanner()
{
if (_adBannerLoaded) return;
// Set up options to notify the SDK of load events:
BannerLoadOptions options = new BannerLoadOptions
{
loadCallback = OnBannerLoaded,
errorCallback = OnBannerError
};
// Load the Ad Unit with banner content:
Advertisement.Banner.Load(_adBannerId, options);
}
void OnBannerLoaded()
{
_adBannerLoaded = true;
Debug.Log("Banner Ads 加载完成");
}
void OnBannerError(string message)
{
_adBannerLoaded = false;
Debug.Log($"Banner Ads 加载失败 Error: {message}");
// 可选地执行附加代码,例如尝试加载另一个广告。
}
/// <summary>
/// 展示Banner
/// </summary>
public void ShowBannerAd()
{
if (!_adBannerLoaded)
{
LoadBanner();
}
else
{
BannerOptions options = new BannerOptions
{
clickCallback = OnBannerClicked,
hideCallback = OnBannerHidden,
showCallback = OnBannerShown
};
// Show the loaded Banner Ad Unit:
Advertisement.Banner.Show(_adBannerId, options);
}
}
/// <summary>
/// 隐藏Banner
/// </summary>
public void HideBannerAd()
{
Advertisement.Banner.Hide();
}
void OnBannerClicked() { }
void OnBannerShown() { }
void OnBannerHidden()
{
LoadBanner();
}
#endregion
public void OnUnityAdsAdLoaded(string adUnitId)
{
// 如果广告单元成功加载内容,则可选择执行代码。
Debug.Log("Showing Ads 加载广告完成ID: " + adUnitId);
if (adUnitId == _androidAdUnitId || adUnitId == _iOsAdUnitId)
{
_InterstitialLoaded = true;
}
else if (adUnitId == _androidRewardedUnitId || adUnitId == _iOSRewardedId)
{
_RewardLoaded = true;
}
}
public void OnUnityAdsFailedToLoad(string _adUnitId, UnityAdsLoadError error, string message)
{
Debug.Log($"Error Ads 加载广告失败 Unit: {_adUnitId} - {error.ToString()} - {message}");
if (_adUnitId == _androidAdUnitId || _adUnitId == _iOsAdUnitId)
{
_InterstitialLoaded = false;
}
else if (_adUnitId == _androidRewardedUnitId || _adUnitId == _iOSRewardedId)
{
_RewardLoaded = false;
}
}
public void OnUnityAdsShowFailure(string _adUnitId, UnityAdsShowError error, string message)
{
Debug.Log($"Error Ads 展示广告失败 Unit {_adUnitId}: {error.ToString()} - {message}");
// 如果广告单元无法显示,可以选择执行代码,例如加载另一个广告
if (_adUnitId == _androidAdUnitId || _adUnitId == _iOsAdUnitId)
{
_InterstitialLoaded = false;
}
else if (_adUnitId == _androidRewardedUnitId || _adUnitId == _iOSRewardedId)
{
_RewardLoaded = false;
}
}
public void OnUnityAdsShowStart(string _adUnitId) { }
public void OnUnityAdsShowClick(string _adUnitId) { }
// 视频展示完成发放奖励:
public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
{
if (adUnitId.Equals(adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
{
Debug.Log("Unity Ads 激励视频播放完成");
// 发放奖励
RewardedAdClose(true);
}
// 加载新的激励视频
if (adUnitId == _androidRewardedUnitId || adUnitId == _iOSRewardedId)
{
_RewardLoaded = false;
LoadRewardedAd();
}
else if (adUnitId == _androidAdUnitId || adUnitId == _iOsAdUnitId)
{
_InterstitialLoaded = false;
LoadInterstitialAd();
}
}
}
五,测试 Unity Ads 广告 SDK
5.1 搭建场景
搭建测试场景如下:
注意:红框中的广告位ID要和后台创建的对应上,测试时要先等加载完成再执行展示即可。
5.2 后台数据
以上就是接入 Unity Ads 广告 SDK 的流程。需要正确配置广告选项,并根据应用程序的需求选择合适的广告类型。
点击链接下载接入SDK的源码,没有积分的童鞋,
点击下面??卡片,回复 UnityAds 也可以获得文中接入SDK的源码~