Unity Android平台AdMob应用
开发环境
Window7
Unity3D 3.4.1
MB525defy Android 2.2.1
羽化的第二十一篇博客,这次一次发布三篇确实有点漫长。。。因为最近羽化一直很忙,没多少时间重新整理Android AdMob方面的东西,正好今天有空就把准备写的补上。其实羽化这方面也不是很熟悉,但知道的解决方法有两三种,这次就说一个最简单的解决方案,并送上代码,以后任何人开发都可以改改项目名称和ID就可以直接拿来用。很多方法来自官方的大牛们热议,大家可以可以借鉴下这些脚本写法。
最近通关了刺客信条启示录,作为Ezio和Altair时代的终结,本作应该算是前作兄弟会的延伸,创新点不多,但依然很有趣,刺客养成方面做得过于繁琐,也没有隐藏的装备了,这点实在是可惜。想当初羽化开始玩刺客信条系列的时候,大概读大一,XBOX360才刚买不久,家里还是一个纯平电视,第一次玩的时候感觉很兴奋,开阔的场景,密集的建筑,自由的攀爬,这就是游戏的乐趣,真正的次世代体验,但初代任务方面薄弱很多,幸运的是,刺客信条系列总是在不断改进和创新,可以看到开发团队在这方面的努力,这种开发游戏的态度值得游戏制作人学习,希望这个系列能做得更好,真正做到“万物皆虚,万事皆允”,应该下一作就是终结。
本次学习:
1. Eclipse报错解决方案
2. AdMob应用
本来不用写的,但羽化在打开Eclipse的时候遇到了几个蛋疼问题,下面羽化把这几个问题做个小小总结:
(1)Error: Unableto open class file XXX/R.java错误
有两种解决方案:首先是Project -> clean 再勾上Build Automatically,可以解决一类常出现的脑抽问题。。。其次是Window -> Preferences -> Java -> Build Path 中选择Project -> Apply,可以解决些意外问题。。。
(2)error generating final archive 错误
这类错误一般新手是遇不到的,因为这是证书过期引起的,一般证书有效期只有1年,超过1年后,所有新建的Android工程都会无故报错,解决方法是来到Window -> Preferences -> Android -> Build中 Default debug keystore目录下,复制里面地址打开删除debug.keystore及 ddms.cfg两个文件,重启eclipse就可以解决。
2.AdMob应用
首先是Eclipse上Android项目的写法,导入羽化的项目AdMob(Import –> Existing Projects into Workspace),肯定会报错。。。
这时修改引用,选中项目文件单击鼠标右键-> Properties -> Java Build Path里面的Libraries,把admob-sdk-android.jar和classes.jar文件重新Edit到当前的libs里面,再到Order and Export里面勾选上。
注意: admob-sdk-android.jar是网上一个大牛封装的AdMob SDK,有一些自己的方法,但不是最新版本,下载最新版本的同学注意Android系统版本最好超过3.2,否则广告栏会显示一段错误。classes.jar是Unity里面自带的一个jar包,通过搜寻就可以知道位置,羽化就不再介绍。
如果不出意外,现在应该完全不会报错,报错了请看上面的注意和Eclipse报错原因。。。下面我们看代码
AdMob.java
package com.LB.AdMob; //必须改变import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.widget.LinearLayout;
import android.os.Message;import com.unity3d.player.*;import com.admob.android.ads.AdView;
import com.admob.android.ads.SimpleAdListener;public class AdMob extends UnityPlayerActivity
{public AdView adView;private boolean adVisible = true;protected void onCreate(Bundle savedInstanceState){Log.i("AdMob", "onCreate");super.onCreate(savedInstanceState);setupAds();}private Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what){case 0: if(adVisible){adView.setVisibility(View.GONE);adVisible = false;}break;case 1:if (!adVisible){adView.setVisibility(View.VISIBLE);AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);animation.setDuration(400);animation.setFillAfter(true);animation.setInterpolator(new AccelerateInterpolator());adView.startAnimation(animation);adVisible = true;}break;default:break;}}};public void EnableAds(){handler.sendEmptyMessage(1);}public void DisableAds(){handler.sendEmptyMessage(0);} private void setupAds(){LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);addContentView(layout, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));adView = new AdView(this);layout.addView(adView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));adView.setBackgroundColor(0xff000000);adView.setPrimaryTextColor(0xffffffff); adView.setSecondaryTextColor(0xffcccccc);adView.setKeywords("kickoff Goal Pinball game spiel bundesliga male Flipper Bumper Parlotones kick off 3d soccer fussball football tor vuvuzela");// adView.setRequestInterval(20); //设置自动出现频率// add listener for easier debuggingadView.setAdListener( new SimpleAdListener(){public void onFailedToReceiveAd(com.admob.android.ads.AdView adView){Log.d("AdListener", "onFailedToReceiveAd: " + adView.toString());super.onFailedToReceiveAd(adView);}public void onFailedToReceiveRefreshedAd(com.admob.android.ads.AdView adView){Log.d("AdListener", "onFailedToReceiveRefreshedAd: " + adView.toString());super.onFailedToReceiveRefreshedAd(adView);}public void onReceiveAd(com.admob.android.ads.AdView adView){Log.d("AdListener", "onReceiveAd: " + adView.toString());super.onReceiveAd(adView);}public void onReceiveRefreshedAd(com.admob.android.ads.AdView adView){Log.d("AdListener", "onReceiveRefreshedAd: " + adView.toString());super.onReceiveRefreshedAd(adView);}} );adView.requestFreshAd();}
}
和AndroidMainifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.LB.AdMob"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".AdMob"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!-- The application's publisher ID assigned by AdMob //android:value中放入使用者ID --><meta-data android:value="a14ddb78fc3babe" android:name="ADMOB_PUBLISHER_ID" /><!-- AdMobActivity definition --><activity android:name="com.admob.android.ads.AdMobActivity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"android:configChanges="orientation|keyboard|keyboardHidden" /><!-- Track Market installs --><receiver android:name="com.admob.android.ads.analytics.InstallReceiver" android:exported="true"><intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /></intent-filter></receiver></application><!-- AdMob SDK requires Internet permission --><uses-permission android:name="android.permission.INTERNET" />
</manifest>
这是个典型的Android项目代码,有几点注意下,1.如果想用在自己的应用上,就照着羽化的引用结构自己新建一个工程,把这两个文件中所有的羽化自定义名称换掉即可。2. android:value中填入自己申请的AdMob ID。3.羽化把代码简化到最少,所以并没用使用res中的所有内容,若想自定义图标等就需要自己去修改AndroidManifests实现。4.这个可以加上阻止休眠命令,在羽化上一篇Android博客里面有提到。5.Unity中的Bundle Identifier必须与这里定义的package一致。6.这时把Eclipse项目运行肯定报错。7.这里只写了广告淡出效果,没写淡入效果- - 大家凑合看吧。。。
当上面的都没问题后就把AdMob.java打jar包,方法是选中AdMob鼠标右键 -> Export -> java -> JAR file -> Next
using UnityEngine;using System.Collections;using System;public class Ad : MonoBehaviour {void OnGUI() {if(Input.GetKey(KeyCode.Escape)){Application.Quit();}if(GUI.Button(new Rect(0,Screen.height-220,100,100),"EnableAds!")){EnableAds();}if(GUI.Button(new Rect(0,Screen.height-110,100,100),"DisableAds!")){DisableAds();}if(GUI.Button(new Rect(Screen.width-120,Screen.height-40,120,30),"Click to YUHUA!")) { Application.OpenURL("http://blog.csdn.net/libeifs"); }}public void EnableAds(){#if UNITY_ANDROIDAndroidJNI.AttachCurrentThread();// first we try to find our main activity..IntPtr cls_Activity = AndroidJNI.FindClass("com/unity3d/player/UnityPlayer");IntPtr fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity, "currentActivity", "Landroid/app/Activity;");IntPtr obj_Activity = AndroidJNI.GetStaticObjectField(cls_Activity, fid_Activity);//Debug.Log("obj_Activity = " + obj_Activity);IntPtr cls_OurAppNameActivityClass = AndroidJNI.FindClass("com/LB/AdMob/AdMob"); //this has to be changedIntPtr startAdsMethod = AndroidJNI.GetMethodID(cls_OurAppNameActivityClass, "EnableAds", "()V");//Debug.Log("m_startAdsMethod = " + startAdsMethod);if (AndroidJNI.IsInstanceOf(obj_Activity, cls_OurAppNameActivityClass) != false){//Debug.Log("Activity IS a OurAppNameActivity");jvalue[] myArray = new jvalue[1];AndroidJNI.CallVoidMethod(obj_Activity, startAdsMethod,myArray);}#elsem_adShowing = true;#endif //UNITY_ANDROID}public void DisableAds(){#if UNITY_ANDROIDAndroidJNI.AttachCurrentThread();// first we try to find our main activity..IntPtr cls_Activity = AndroidJNI.FindClass("com/unity3d/player/UnityPlayer");IntPtr fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity, "currentActivity", "Landroid/app/Activity;");IntPtr obj_Activity = AndroidJNI.GetStaticObjectField(cls_Activity, fid_Activity);IntPtr cls_OurAppNameActivityClass = AndroidJNI.FindClass("com/LB/AdMob/AdMob"); //this has to be changedIntPtr stopAdsMethod = AndroidJNI.GetMethodID(cls_OurAppNameActivityClass, "DisableAds", "()V");if (AndroidJNI.IsInstanceOf(obj_Activity, cls_OurAppNameActivityClass) != false){jvalue[] myArray = new jvalue[1];AndroidJNI.CallVoidMethod(obj_Activity, stopAdsMethod,myArray);}#else //UNITY_ANDROIDm_adShowing = false;#endif //UNITY_ANDROID}}
这个应该能满足大部分广告显示方式,置于显示位置就麻烦大家自行修改了,谢谢大家支持~ ~
老样子,项目送上:
http://dl.dbank.com/c0ya3iynro
下集预告:
Thinking inShader(5)
Unity Android平台AdMob应用相关推荐
- Unity Android平台接入支付宝SDK
这篇文章前面讲的创建Android Studio工程的流程是不正确的!!! 正确的流程请参见:Unity Android平台下插件/SDK开发通用流程 最近帮一个群里的朋友接了一下支付宝的SDK,开发 ...
- unity Android平台最佳效果探索(二)
上一篇 unity Android平台最佳效果探索(一) 上篇写到了实现PC版的效果 继续 3.切换到Android平台后效果 直接切换后,不能运行,报错挺多. 原因: (1)Android平台不支持 ...
- Unity Android平台下插件/SDK开发通用流程
本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...
- 自定义Mono,实现Unity Android平台代码更新
原理 在做这个之前,需要了解: 1.Unity是基于Mono的,我们写的代码都被编译成DLL,然后由Mono读取这个DLL并解析运行. 2.在Mono眼里,DLL和普通的资源文件没什么区别. 去年做过 ...
- Unity android平台读取文件
一.代码: 1.通过C#的IO进行文件内容读取: using UnityEngine.UI;public class Test : MonoBehaviour {Text text;string re ...
- Unity Android平台读取文件时添加了权限依然报错“Access to the path is denied“
Unity 调用Android读取文件"Access to the path is denied" 添加权限依然报错 记录一下Unity 调用Android读取文件"Ac ...
- Unity Android平台 视频播放
1.Unity版本:2018.1.1f 2.AVPro版本:AVPro Video 1.9.4 一.VideoPlayer VideoRawImage参数设置如图: 视频Texture大小设置如图: ...
- Unity 3D PC平台发布|| Unity 3D Web 平台发布||Unity 3D Android平台发布
Unity 3D PC平台发布 PC 是最常见的游戏运行平台. 随着欧美游戏的崛起,PC 平台随之发生游戏登陆大潮. 在 PC 平台上发布游戏的步骤: 打开要发布的 Unity 3D 工程,执行 Fi ...
- Unity直接以Android平台打开工程(不用手动切换平台)
一般项目版本管理,会有多个svn分支,拉新的svn分支后,打开工程默认以PC为平台,如果工程比较大的话,需要等好长一段时间,等所有资源都编译完之后,然后再手动在BuildSettings中切换成And ...
最新文章
- 机房设备与线路资源管理
- python实现希尔排序
- Floatingip
- php获取数据库不同,php – 从master数据库获取数据库凭据,然后连接到不同的数据库...
- vue页面跳转后返回原页面初始位置
- java random产生随机数_java的三种随机数生成方式,必掌握
- Android8.1怎么装谷歌,谷歌PixelXL安卓9.0/8.1/8.0/7.X安装面具ROOT方案
- 滑翔导弹末段多约束智能弹道规划
- rel=nofollow
- C++模板元编程---折叠表达式
- C#之Bcd码时间转成ToDateTime
- 【linux基础】cuDNN版本查询
- 【工具】ColorPix!分享一个超好用的桌面取色工具
- C语言 哲学家就餐问题
- 新西兰计算机预科学费多少钱,留学新西兰预科费用及课程
- 【海思篇】【Hi3516DV300】二、使用串口烧写映像
- PV UV IP的意义
- “1只老母鸡”估值180亿!老乡鸡发展20年,都做对了什么?
- bootstrap模态框弹出居中显示
- 给discuz x增加后台菜单管理功能