Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益

news2024/11/27 13:44:46

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

  1. 登录在Unity账号,注意要和本地Hub使用同一账号。

  2. 登录成功后,在“项目管理” 可进入到这个界面,然后在“Projects” 面板中创建一个项目即可:

  3. 创建项目之后,返回到上一层,找到广告配置界面:

其他的数据看吧想不用管,广告位置ID也不用改,先按照默认操作集成即可。其他面板也可以等集成成功后慢慢看。


二,下载 Unity Ads 广告 SDK

Unity Ads 广告 SDK 可以从 Unity Asset Store 中下载,并导入到您的 Unity 项目中。在 Unity 中,选择菜单栏的“Window”>“Package Manager”,然后在“Packages”选项卡中搜索“Advertisement Legacy”,点击“Install”按钮即可下载和安装:

  1. 安装

  2. 安装完成后,在Project Setting中找到Services --> Ads,点击OFF 打开

  3. 打开后选择1步骤中后台创建的项目,完成后即可入到如下界面

可以看到 GameId 中的 AndroidiOS 都已经有了和后台项目创建的一致。

注意:TestMode是测试模式,正式发布前需要取消:Enable test mode 选项。


三,配置 Unity Ads 广告 SDK

3.1 广告位展示流程

  1. 广告初始化
  • 成功 --> 加载广告位
  • 失败 --> 设定几秒后重新加载
  1. 广告位加载广告
  • 成功 --> 可展示广告
  • 失败 --> 设定几秒后重新加载
  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 相关介绍

  1. 设置Banner位置:
    在代码中,使用 Unity Ads SDK 的 Banner API 来显示横幅广告。使用 Advertisement.Banner.SetPosition(_bannerPosition) 方法设置广告位置,然后使用 Show() 方法显示广告。

  2. 插屏和激励视频
    对于插屏广告和奖励视频广告,可以使用 Unity Ads SDK 的 Interstitial APIRewarded 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 的流程。需要正确配置广告选项,并根据应用程序的需求选择合适的广告类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发日记-凌鲨中数据库代理的实现

凌鲨定位于连接研发过程中一切信息和工具。下面是数据库代理的大概框架&#xff1a; 技术选型 使用golang开发各种数据库协议代理,redis-proxy,mysql-proxy,mongo-proxy使用swagger提供代理协议的调试 选型原因 我们的客户端使用了tauri作为框架&#xff0c;在实现扩展功能的…

基于阴影检测和平衡亮度差阴影消除算法的MATLAB完整程序分享

完整代码: clc; clear; close all; warning off; addpath(genpath(pwd)); I=imread(1.png);%%此处导入自己需要检测的图片 [x,y,z]=size(I); figure(Name,Processing Steps),subplot(3,2,1), imshow(I),title(Image 1: Original Image); I=uint8(I); temp1=I; half_intens…

MySQL优化--MVCC

目录 概念 MVCC的具体实现 隐式字段 undo log日志 概念 undo log版本链 readview 接上文&#xff0c;redo log保证了事务的持久性&#xff0c;undo log 保证了事务的原子性和一致性 那&#xff0c;隔离性是如何保证的呢&#xff1f; 锁&#xff1a;排他锁&#xff08;如…

Linux下Redis 存储

命令使用 目录 命令使用 RDB持久化 AOF持久化 yum安装 [rootlocalhost ~]# yum -y install redis 已加载插件&#xff1a;fastestmirror Loading mirror speeds from cached hostfile* c7-media: * epel: ftp.yz.yamagata-u.ac.jpvim到文件etc/redis.conf 取消注释requirep…

Paddle lite 初识与简单使用

一、何为Paddle lite 官方解释如下&#xff1a; Paddle Lite是飞桨基于Paddle Mobile全新升级推出的端侧推理引擎&#xff0c;在多硬件、多平台以及硬件混合调度的支持上更加完备&#xff0c;为包括手机在内的端侧场景的AI应用提供高效轻量的推理能力&#xff0c;有效解决手机…

Android——事务处理(十二)

1. 事件处理简介 1.1 知识点 &#xff08;1&#xff09;了解事件处理的作用&#xff1b; &#xff08;2&#xff09;了解常用的事件及相关处理接口&#xff1b; 1.2 具体内容 在android当中&#xff0c;基本上每一个组件都有用相应的事件处理&#xff0c;但是不过有多少种事…

chatgpt赋能python:Python抢单软件:如何优化SEO?

Python抢单软件&#xff1a;如何优化SEO&#xff1f; 导言 随着互联网技术的飞速发展&#xff0c;越来越多的人开始关注SEO&#xff08;Search Engine Optimization&#xff09;技术。而对于Python编程工程师来说&#xff0c;了解SEO技术也是非常重要的。那么&#xff0c;如何…

day10 伪操作与混合编程

伪操作 伪操作&#xff1a;不会生成代码&#xff0c;只是在编译之前告诉编译器怎么编译 .global symbol 将symbol声明成全局符号.local symbol 将symbol声明成局部符号.equ DATA, 0xFFMOV R1, #DATA.macro FUNCMOV R1, #1MOV R2, #2.endmFUNC.if 0MOV R1, #1MOV R2, #2.endif…

简要介绍 | 快速傅里叶变换:从原理到应用

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对快速傅里叶变换进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 快速傅里叶变换&#xff1a;从原理到应用 Denoising Data with Fast Fourier Transform 1. 背景介绍 傅里叶变换&#xff08;F…

vcruntime140_1.dll修复,vcruntime140_1.dll丢失推荐的修复方法-一键修复

vcruntime140_1.dll是什么什么文件呢&#xff1f;为什么电脑在运行一些游戏的时候会出现丢失vcruntime140_1.dll&#xff0c;然后游戏运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。 本教程操作系统&#xff1a;Windows vcruntime140_1.dll丢失…

第十四章 json模块

1. json模块介绍 Python 中的json 模块提供了对JSON 的支持&#xff0c;用于将JSON 格式字符串转换为Python 对象。首先需要了解一下什么是JSON。 什么是JSON JSON 是基于JavaScript 语言的轻量级的数据交换格式&#xff0c;是JavaScript 对象的表示法&#xff08;JavaScrip…

mariadb 高可用集群

目录 1.相同操作&#xff1a;修改hosts文件 把四台机IP写进去 2. www 管理机 4.管理 简介&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由日本DeNA公司youshimaton&#xff08;现就职于…

C51/C52--LCD1602

目录 一、LCD1602简介 二、LCD1602的工作&#xff08;显示&#xff09;原理 三、技术参数 四、外形参数&#xff0c;引脚功能 五、连接方式 六、示例程序与结果 一、LCD1602简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#xff0…

chatgpt赋能python:如何使用Python找出重复元素

如何使用Python找出重复元素 在Python编程中&#xff0c;有时候需要查找并删除重复的元素。这些元素可以是列表、字符串等数据类型。在本文中&#xff0c;将介绍如何使用Python查找并删除重复元素。以下是我们将要涉及到的一些主题&#xff1a; 为什么需要查找重复元素&#…

深挖面试题讲解

面试题讲解&#x1f374; 文章目录 面试题讲解&#x1f374;和equals()的区别&#x1f354;1️⃣注意事项2️⃣明确问题3️⃣总结 什么是HashCode&#x1f347;1️⃣HashCode的描述2️⃣常见误区3️⃣hashCode的作用4️⃣总结 String、StringBuffer、StringBuilder的区别&#…

chatgpt赋能python:Python编程:如何找出给定的n个数中的最大值及其对应的最小下标

Python编程&#xff1a;如何找出给定的n个数中的最大值及其对应的最小下标 当需要在一组数字中找到最大值时&#xff0c;Python提供了内置函数 max() 。 但是&#xff0c;如果我们需要找出最大值的同时还需要找出其最小下标&#xff0c;该怎么办呢&#xff1f; 在本文中&#…

初始化命令

创建项目 vue2 vue3 create demo vue3 vue3 create demo vue2 webpack vue2 init webpack demo vue3 vite yarn create vite demo --template vue sass cnpm下载 --save-dev -D 开发环境 --save -S 生产环境 cnpm i node-sass4.14.1 sass-loader7.3.1 --save-…

[架构之路-215]- 架构 - 概念架构 - 模块(Module)、组件(Component)、包(Package)、对象、函数的区别

前言&#xff1a; 在软件架构中&#xff0c;一个重要的任务就是切分系统&#xff0c;而切分系统进程涉及到一个基本的概念&#xff0c;如模块&#xff08;Module&#xff09;、组件&#xff08;Component&#xff09;、包&#xff08;Package&#xff09;、对象&#xff0c;本…

管理类联考——写作——技巧篇——论证有效性——谬误概念汇总简释

批判性思维常见逻辑谬误 有些错误出现在我们澄清或定义某个观点的时候&#xff0c;有些错误出现在我们收集证据或者用证据和理由支撑某个观点的时候&#xff0c;有些错误出现在我们尝试从证据得出结论的时候&#xff0c;有些错误甚至出现在我们评估他人的观点或者理由的时候。…

美味度配方

8 种配料每种配料可以放 1 到 5 克&#xff0c;美味度为配料质量之和&#xff0c;给定一个美味度 n&#xff0c;求解 8 种配料的所有搭配方案及方案数量 。 (本笔记适合学了 Python 循环&#xff0c;正在熟炼的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a…