Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益
Unity 之 最新Ads原生广告接入流程详解和工具类分享
- 一,注册 Unity Ads 广告 SDK
- 二,下载 Unity Ads 广告 SDK
- 三,配置 Unity Ads 广告 SDK
- 3.1 广告位展示流程
- 3.2 代码初始化
- 四,集成 Unity Ads 广告 SDK
- 4.1 相关介绍
- 4.2 代码分享
- 五,测试 Unity Ads 广告 SDK
- 5.1 搭建场景
- 5.2 后台数据
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;
#endifif (!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;
#endifif (!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 插屏广告// 插屏广告IDstring _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;
#endifLoadRewardedAd();}/// <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();}#endregionpublic 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 的流程。需要正确配置广告选项,并根据应用程序的需求选择合适的广告类型。
相关文章:

Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益
Unity 之 最新Ads原生广告接入流程详解和工具类分享 一,注册 Unity Ads 广告 SDK二,下载 Unity Ads 广告 SDK三,配置 Unity Ads 广告 SDK3.1 广告位展示流程3.2 代码初始化 四,集成 Unity Ads 广告 SDK4.1 相关介绍4.2 代码分享 五…...
ChatGPT是否可以进行逻辑推理?
ChatGPT在逻辑推理方面的能力存在一定的限制。虽然它可以处理一些简单的逻辑问题,但由于其基于统计模型和语言模式的生成方式,它在复杂的逻辑推理和推断任务上可能会遇到挑战。以下是对ChatGPT在逻辑推理方面能力的详细分析: 1. 基于统计模型…...

TP6在composer包里写控制器
前提:首先要了解下如何自建composer包。 1.先建一个空包,加一个文件:composer.json {"name": "test/ctrs","type": "library","license": "MIT","autoload": {&quo…...

Java面试Day11
1. MySQL 事务有哪些隔离级别、分别有什么特点,以及 MySQL 的默认隔离级别是什么? 在MySQL中事务的隔离级别是为了解决常见的并发问题,在保证数据库性能的同时保持事务的隔离性,常见的并发问题有: 脏读:如果…...

python生成日报
目录 一:日报生成工具二:日报工具使用方式三:最终日报生成展示 一:日报生成工具 #!/usr/bin/python # coding:utf8class GetHtml(object):def __init__(self):self._html_head """<html><body style&qu…...
【机器学习】——续上:卷积神经网络(CNN)与参数训练
目录 引入 一、CNN基本结构 1、卷积层 2、下采样层 3、全连接层 二、CNN参数训练 总结 引入 卷积神经网络(CNN)是一种有监督深度模型框架,尤其适合处理二维数据问题,如行人检测、人脸识别、信号处理等领域,是带…...

鲸鱼算法WOA优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码...
鲸鱼优化算法(Whale optimization algorithm, WOA)是Mirjalili根据座头鲸的捕食行为而提出来的,算法对座头鲸的狩猎行为进行模仿,通过对猎物的寻找,然后攻击进行觅食,以此来达到优化的目的,已有很多学者将算法用于实际…...

ELK日志收集系统集群实验
ELK日志收集系统集群实验 目录 一、实验拓扑 二、环境配置 三、 安装node1与node2节点的elasticsearch 1. 安装 2.配置 3.启动elasticsearch服务 4.查看节点信息 四、在node1安装elasticsearch-head插件 1.安装node 2.拷贝命令 3.安装elasticsearch-head 4.修改el…...

用Python写了一个下载网站所有内容的软件,可见即可下
目录标题 前言效果展示环境介绍:代码实战获取数据获取视频采集弹幕采集评论 GUI部分尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 今天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI,把这些功能放到一起让朋友用起来更方便~ 效果…...
gin使用embed打包html
embed 使用类似的注释打包html文件 //go:embed pages/dist/* 打包的代码如下 package mainimport ("embed""io/fs""net/http""github.com/gin-gonic/gin" )//go:embed pages/dist/* var embedFs embed.FSfunc main() {e : gin.Defau…...

Android启动优化实践
作者:95分技术 启动优化是Android优化老生常谈的问题了。众所周知,android的启动是指用户从点击 icon 到看到首帧可交互的流程。 而启动流程 粗略的可以分为以下几个阶段 fork创建出一个新的进程创建初始化Application类、创建四大组件等 走Applicatio…...

ROS:通信机制实操
目录 ROS:通信机制一、话题发布实操1.1需求1.2分析1.3实现流程1.4实现代码1.4.1C版1.4.2Python版 1.5执行 二、话题订阅实操2.1需求2.2分析2.3流程2.4实现代码2.4.1启动无辜GUI与键盘控制节点2.4.2C版 ROS:通信机制 一、话题发布实操 1.1需求 编码实现…...

C/C++内存管理(内存分布、动态内存分配、动态内存分配与释放、内存泄漏等)
喵~ 内存之5大区(栈区、堆区、静态区、常量区、代码区)C/C中各自的内存分配操作符内存泄露?内存泄漏检测方法 内存之5大区(栈区、堆区、静态区、常量区、代码区) 1、栈区(stack):由编译器自动分…...

【云原生】软件架构的演进以及各个架构的优缺点
文章目录 1. 什么是软件架构?2. 单机架构3. 应用数据分离架构4. 应用服务集群架构5. 读写分离架构6. 冷热分离架构7.垂直分库架构8. 微服务架构9. 容器编排架构10. 小结 1. 什么是软件架构? 软件架构是指在设计和构建软件系统时,对系统的组织结构、组件、模块、接…...
力扣刷题笔记——二叉树
首先定义二叉树节点的结构体 struct TreeNode{TreeNode* left;TreeNode* right;int val;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* l,TreeNode* R):val(val),left(l),right(R){…...
【华为OD机试】工号不够用了怎么办?(python, java, c++, js)
工号不够用了怎么办? 前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。 题目…...
【leetcode】198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非…...

【react全家桶学习】react的 (新/旧) 生命周期(重点)
目录 生命周期(旧) 挂载时的生命周期 constructor(props) componentWillMount()-------------新生命周期已替换 render() componentDidMount()--- 组件…...
Gradio私网和公网的使用
Gradio私网问题 如果部署的服务器只有私有地址,那么无法直接从外部网络中的其他计算机访问该服务器和其中运行的 Gradio 应用程序。在这种情况下,你可以考虑使用端口转发技术,将服务器的私有地址映射到一定的公开地址上,从而可以…...

ant design vue 配置菜单外部打开
实现如下 菜单配置 前端项目地址:http://localhost:3000 菜单路径:dataCenter/HealthData 打开方式:外部 在项目中src-->config-->router.config.js文件 将需要再外部打开的菜单地址进行如下配置 菜单地址:/dataCenter/Hea…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...