Unity3D使用腾讯广点通广告

1 篇文章 0 订阅
1 篇文章 0 订阅

Unity3D使用腾讯广点通广告

很多做Android开发、游戏开发的朋友找我咨询,开发的应用、游戏如何赚钱,今天我分享下我的经验吧。

App想在国内赚钱,“软件收费”是基本上做不起来的,大家都懂,没什么好说的。那么比较流行的是应用内加广告或者应用内计费。

“应用加广告”,很好理解,就是在应用内加上广告,那么广告从哪获取呢?实际上是需要与广告平台进行合作,目前口碑比较好的有腾讯广点通、百度联盟、Admob等,公司和个人开发者都可以做。而”应用内计费”,这个也很好理解,例如,平时我们玩的游戏,购买道具、金币或者角色复活等等都属于应用内计费范畴。应用内计费也是需要和支付平台进行合作的,国内主流的有百度、腾讯、360、移动MM、电信、联通等等,但是个人开发者就不要指望了,因为应用内计费的平台只与企业合作(之间牵扯一些责任、版权相关的东西,个人开发者提供不了相关文件)。

目前,游戏开发平台有很多,今天咱们主要介绍Unity3d开发的Android游戏加广点通广告。不啰嗦了,直接入主题。


准备工作:

  • 1.搭建Unity3D环境,准备好已经完成的游戏源码
  • 2.搭建Android环境
  • 3.注册腾讯广点通平台账号,并审核通过

主要步骤:

  • 1.下载广点通SDK
  • 2.新建Android项目,用于实现Android广告,实现Unity3d通讯接口调用
  • 3.将Android项目资源导出
  • 4.Unity3d导入Android项目资源
  • 5.Unity3d调用Android项目资源实现广告
  • 6.游戏打包
  • 7.提交审核,通过后正常显示广告

1. 下载广点通SDK

广点通网址:http://e.qq.com/dev/index.html

登录成功后,进入“移动联盟后台管理”,如下图:
这里写图片描述

在加广告、提交审核阶段我们主要使用“媒体管理”,“广告位管理”和“SDK下载”。
“媒体管理”—- 是指的用于显示广点通广告的载体,即你的游戏或app
“广告位管理”—- 是指你的游戏或app要显示的各种各样的广告
“SDK下载” —- 就是咱们开发者加广告所需要的开发工具包了

1.1 点击”媒体管理“

创建一个媒体,系统会自动分配给你一个AppId,如下图:
这里写图片描述
刚新建完成,默认状态是”未申请“,这个需要等到提交带广告的应用,并且审核通过后,才会显示”已开通“,所以不要着急。

1.2点击”广告位管理“

创建适合你游戏/app的广告位。广告位类型主要有:Banner(广告条)、插屏、开屏、应用墙,这个需要根据自己的游戏自行选择,如下图:
这里写图片描述
比如,我们新建了广告条,插屏,应用墙三种广告(后面按这三种广告做示例)

1.3点击”SDK下载“

这里写图片描述
我们选择下载Android SDK。在当前网页下方有腾讯介绍如何加SDK的指导帮助信息(可看可不看,毕竟是很早以前的了,没有更新过)

2. 新建Android项目

到这儿,很多同学可能会有疑问,我们明明是使用Unity3d开发的游戏,为什么我们要新建Android项目呢?其实从1.3的截图上我们可以看到,广告平台没有提供针对Unity3d的SDK,他们只是提供了Android和IOS的SDK,我们该如何解决呢??

解决的办法其实很简单,Unity3d是支持与Android通讯的,通讯的具体方式是:
—-》 Android项目中使用Unity3d接口
—-》 将Android项目以外部资源的方式导入到Unity3d项目中
—-》 Unity3d使用自带的类调用导入的Android项目,以实现通讯

具体,我后面会详细讲给大家。而如何加广告,咱们不看他们的官方文档了,直接从广点通SDK中提供的示例Demo中入手,会更简单一些

2.1打开eclipse,新建一个android项目,如下图:

这里写图片描述
包名很重要,请务必改为自己游戏的包名,一般包名的格式为:
com.xxx.yyy
“xxx”一般指公司名简写或团队名,
“yyy”一般指项目代号,可以和项目名称(Application Name)不一样

2.2解压广点通SDK,将他们的Demo导入到eclipse中,如下图:

这里写图片描述

而咱们新建的项目,如下图(与广点通demo长的很像,呵呵):
这里写图片描述

2.3打开广点通Demo中的AndroidManifest.xml,拷贝以下内容到咱们新建项目的AndroidManifest.xml中:

拷贝7条权限,到Application节点上面(请注意拷贝的位置),如下图:
这里写图片描述

拷贝service、activity共两个节点到Application节点里面,如下图:
这里写图片描述

2.4将广点通代码中的Constants.java文件拷贝到自己项目的包里面,如下图:

这里写图片描述

2.5打开拷贝到自己项目中的Constants.java文件,将APPId与广告位Id分别替换成自己在广点通网站上申请的媒体Id和广告位Id,如下图:

这里写图片描述
其中:
APPId是指的媒体Id(即:所属应用Id),
BannerPosId是指广告条Id,
APPWallPosId是指的应用墙广告Id,
InterteristalPosId是指的插屏广告Id,
大家替换的时候千万要跟自己的广告位类型匹配,否则广告出不来的。

2.6将广点通Demo代码中lib下的gdt_xxxx.jar包,拷贝到自己项目的lib下。另外,还需要到你的Unity3d安装目录下,找到一个叫classes.jar的包,自己项目的lib下,如下图:

这里写图片描述
右键选中这两个包,选择Build Path–》Add to Build Path,将这两个包加到引用里,这样咱们的代码就可以加广点通的广告,以及与Unity3d通讯了。

2.7打开MainActivity.java,添加与Unity3d的通信接口,以及Unity3d调用广告的方法,代码贴给大家,关键处有注释:
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
import android.widget.LinearLayout;

import com.qq.e.ads.AdListener;
import com.qq.e.ads.AdRequest;
import com.qq.e.ads.AdSize;
import com.qq.e.ads.AdView;
import com.qq.e.ads.InterstitialAd;
import com.qq.e.ads.InterstitialAdListener;
import com.qq.e.appwall.GdtAppwall;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    Handler mHandler;//用于多线程调用
    private AdView bannerAD;//显示广告条的容器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler = new Handler();
    }

    private void LoadingBannerAD() {
        try{
            this.bannerAD = new AdView(this, AdSize.BANNER_SMALL, Constants.APPId, Constants.BannerPosId);
            this.bannerAD.setAdListener(new AdListener() {
                @Override
                public void onNoAd() {
                    Log.i("admsg:","Banner AD LoadFail");
                }

                @Override
                public void onBannerClosed() {
                    //仅在开启广点通广告关闭按钮时生效
                    Log.i("admsg:","Banner AD Closed");
                }

                @Override
                public void onAdReceiv() {
                    Log.i("admsg:","Banner AD Ready to show");
                }

                @Override
                public void onAdExposure() {
                    Log.i("admsg:","Banner AD Exposured");
                }

                @Override
                public void onAdClicked() {                 
                    Log.i("admsg:","Banner AD Clicked");
                }

                @Override
                public void onNoAd(int arg0) {
                    Log.i("admsg:","Banner AD onNoAd:::"+arg0);

                }
            });

            // 创建布局来承载广告条
            LinearLayout layout = new LinearLayout(MainActivity.this);
            layout.addView(bannerAD, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));

            // 采用WindowManager,可以跨越Unity3d的多个场景显示广告条
            // 即切换Unity3d不同场景时,不会影响广告的正常显示
            WindowManager mWindowManager = (WindowManager) MainActivity.this.getSystemService(Context.WINDOW_SERVICE);
            WindowManager.LayoutParams mWmParams = new WindowManager.LayoutParams();
            mWmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
            //非常重要,决定广告条不会被拉伸
            mWmParams.height = indowManager.LayoutParams.WRAP_CONTENT;
            //非常重要,决定广告条不会被拉伸
            mWmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
            mWmParams.alpha = 1.0F;
            mWmParams.format = 1;
            mWmParams.gravity = Gravity.BOTTOM|Gravity.CENTER;
            mWindowManager.addView(layout, mWmParams);
            bannerAD.fetchAd(new AdRequest());
        }catch(Exception ex){

        }
    }

    private void bindInterstitialAdButton() {
        try{
            final InterstitialAd iad =new InterstitialAd(MainActivity.this, Constants.APPId, Constants.InterteristalPosId);
            iad.setAdListener(new InterstitialAdListener() {
                @Override
                public void onBack() {
                    Log.i("admsg:","Intertistial AD Closed");
                    iad.destory();
                    iad.loadAd();
                    iad.show();
                }

                @Override
                public void onFail() {
                    Log.i("admsg:","Intertistial AD Load Fail");
                }

                @Override
                public void onAdReceive() {
                    Log.i("admsg:", "Intertistial AD  ReadyToShow");

                    iad.show(MainActivity.this);
                    iad.destory();
                }

                @Override
                public void onClicked() {
                    //插屏广告发生点击时回调,由于点击去重等因素不能保证回调数量与联盟最终统计数量一致
                    Log.i("admsg:","Intertistial AD Clicked");
                }

                @Override
                public void onExposure() {
                    //插屏广告曝光时的回调
                    Log.i("admsg:","Intertistial AD Exposured");
                }

                @Override
                public void onFail(int arg0) {
                    Log.i("admsg:","Intertistial AD onFail:::"+arg0);

                }
            });
            iad.loadAd();
        }catch(Exception ex){

        }
    }

    /**
     * 显示横幅,用于被Unity3d调用
     */
    public void ShowBannerAd(){
        try{
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    //Toast.makeText(MainActivity.this, "ShowBannerAd", Toast.LENGTH_SHORT).show();
                    LoadingBannerAD();
                }
            });
        }catch(Exception ex){

        }
    }

    /**
     * 显示插屏,用于被Unity3d调用
     */
    public void ShowInterstitialAd(){       
        try{
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    //Toast.makeText(MainActivity.this, "ShowInterstitialAd", Toast.LENGTH_SHORT).show();
                    bindInterstitialAdButton() ;
                }
            });
        }catch(Exception ex){

        }
    }

    /**
     * 显示推荐,用于被Unity3d调用
     */
    public void ShowWallAd(){
        try{
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    //Toast.makeText(MainActivity.this, "ShowWallAd", Toast.LENGTH_SHORT).show();
                    GdtAppwall wall =new GdtAppwall(MainActivity.this, Constants.APPId, Constants.APPWallPosId, false);
                    wall.doShowAppWall();
                }
            });
        }catch(Exception ex){

        }
    }
}

☆★☆★☆
Android与Unity3d通信,有几个非常重要的点,需要大家注意:
—-》 MainActivity必须继承UnityPlayerActivity
—-》MainActivity的onCreate方法中必须去掉setContentView(R.layout.activity_main);
否则,将来你发布的游戏不会显示你的游戏界面,只是显示一个空白页面(里面有个hello world,嘿嘿!!)
—-》被Unity3d调用的这几个方法,例如:ShowBannerAd()等,一定要使用异步调用,否则,广告出不来。
在上面的代码中,咱们使用了由Android提供的Handler的Runnable()方法来实现异步调用,大家参考下。也可使用Unity3d提供的多线程调用。
—-》被Unity3d调用的这几个方法,一定要使用public修饰符。
—-》如果你的游戏,是横屏的,在AndroidManifest.xml中一定要将MainActivity配置为横屏,否则,发布的游戏已启动会直接闪退。
代码如下:android:screenOrientation=”landscape”,
截图如下:
这里写图片描述

3.将Android项目作为资源导出

Android项目导出给Unity3d使用的资源主要有以下几个内容:代码包,广点通的jar包,res下的所有资源,AndroidManifest.xml文件。

导出代码包时,很多人喜欢直接右键选择项目的src目录,导出.jar文件,其实这样做会连一些没用的资源也生成到jar文件里了,会增加Unity3d生成的游戏安装包的大小。这里,我们使用cmd命令生成纯净的代码包,具体做法如下:
—-》先选中咱们的Android项目
—-》选择project–》Clean
这里写图片描述
—-》再选择project–》Build Project
(注意:做以上两步操作时,请取消掉Build Automatically的勾选状态)
—-》右键选中咱们的Android项目,选择最下面的properties,获得项目的位置,如下图:
这里写图片描述
—-》打开CMD,进入到咱们的Android项目目录下的bin/classes,
执行以下命令:jar -cvf ..\gdt.jar *
如下图:
这里写图片描述
—-》再进入到咱们的Android项目目录下的bin/目录下,可以看到生成的jar文件了,如下图:
这里写图片描述

接下来,在桌面建个文件夹,名字随便,将生成的gdt.jar拷贝到桌面文件夹,再回到eclipse,把res、广点通提供的jar和AndroidManifest.xml拷贝到桌面文件夹,如下图:
这里写图片描述
这里写图片描述

至此,Android项目方面,搞定。

4. Unity3d导入Android项目资源

打开Unity3d游戏项目,在Assets下,新建Plugins/Android文件夹,把桌面文件夹里的4个文件拷贝到此目录下,如下图:
这里写图片描述

注意:Plugins/Android为Unity3d定义的调用外部项目资源的特定文件夹,大家建文件夹时注意别拼写错了。

5.Unity3d调用Android项目资源实现广告

Unity3d提供了调用Android代码的类:AndroidJavaClass 和AndroidJavaObject 。具体如何使用,咱们在代码中体现。
我们先假设在游戏启动的时候,弹出插屏广告和广告条,在点击主界面的”精彩推荐“按钮时,显示广告墙。
那么,我们先来实现游戏启动的时候,弹出插屏广告和广告条的功能:
新建两个脚本,代码分别如下:

/// <summary>
/// 广点通:横幅广告
/// </summary>
public class gdt_banner : MonoBehaviour {
    AndroidJavaClass mJc;
    AndroidJavaObject mJo;
    void Start()
    {
        try
        {
            mJc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            mJo = mJc.GetStatic<AndroidJavaObject>("currentActivity");
            mJo.Call("ShowBannerAd");
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }
  }
/// <summary>
/// 广点通:插屏广告
/// </summary>
public class gdt_in : MonoBehaviour
{
    AndroidJavaClass mJc;
    AndroidJavaObject mJo;
    void Start()
    {
        try
        {
            mJc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            mJo = mJc.GetStatic<AndroidJavaObject>("currentActivity");
            mJo.Call("ShowInterstitialAd");
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }

分别把这两个脚本托给Main Camera即可,效果图,如下:

这里写图片描述

推荐按钮的点击脚本,代码如下:

/// <summary>
/// 广点通:广告墙
/// </summary>
public class gdt_wall : MonoBehaviour
{
    AndroidJavaClass mJc;
    AndroidJavaObject mJo;
    void Start()
    {
        try
        {
            mJc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            mJo = mJc.GetStatic<AndroidJavaObject>("currentActivity");
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }

    /// <summary>
    /// 显示广告墙
    /// </summary>
    public void ShowWallAd()
    {
        if (mJo != null)
        {
            mJo.Call("ShowWallAd");
        }
    }
}

这里写图片描述

6.游戏打包

在Unity3d中,选择File–》build setting,如下图:
这里写图片描述
选择Android–》Player Setting…

打包很简单,其中有两点需要特别注意:
—-》包名一定要与咱们Android项目的包名一致,因为Unity3d是通过包名找Android类的,如果不一致是调用不到咱们Android代码中的显示广告的方法的。
这里写图片描述
—-》Unity3d设置了图标,如下图:
这里写图片描述
实际打包安装后,不会正常显示,却显示了一个小机器人,是因为被Android项目中res下的默认启动图标给覆盖了,解决办法:用你的图标把Android项目中res下的默认启动图标全替换成你自己的,注意:需要把名称改为原Android res下的启动图标名称,如下图:
这里写图片描述

7.提交审核,通过后正常显示广告

回到广点通网站,点击”媒体管理“,提交你使用Unity3d生成的Android游戏安装包,等待广点通审核。

注意:在审核通过前,是不会显示广告的,须等到审核通过后才会正常显示广告。咱们在第5步看到的广告截图,是我的游戏在审核通过后,才截的图,嘿嘿。


☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

至此,Unity3d加广点通广告所有内容,均介绍完毕。
大家如果有兴趣,这儿有一款我以前做的游戏,也使用了广点通,大家可以下载安装后,看看广告效果,如果感觉好玩,请给游戏来个好评,多谢大家。
http://android.myapp.com/myapp/detail.htm?apkName=com.xhh.zhaocha

这里写图片描述
这里写图片描述

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

大家加广告如果还有问题,建议加广告平台官方群咨询,会有很多开发者帮你!!

如果转载,请标明出处。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qixingchao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值