将Unity3D游戏移植到Android平台上
将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出apk即可。通常,我们的工作不仅限于此,一般还需要给手机游戏加入计费、广告等功能。这些功能一般没有提供Unity3D插件,我们需要将游戏导出为Android工程,然后添加这些功能;或者,我们根据这些计费sdk来做自己想要的Unity3D插件,然后直接在Unity3D中使用。
1.从Unity3D到Android工程
为了实现交互,我们采用的是简单的函数相互调用。如果我们在Unity3D中想调用Android代码,那么可以在脚本文件C#中这样写:
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
activity.Call("UnlockGame")
第一行代码构造了"com.unity3d.player.UnityPlayer"类的一个对象,然后获取了本类的静态成员"currentActivity",取得了activity就可以调用Android代码了(如果你在Unity导出的Eclipse工程中查看unity-class.jar这个文件中的类,你会发现com.unity3d.player这个package下就有UnityPlayer.class这个类,这个类中有个currentActivity)。这个UnlockGame函数是简单的成员方法,一般直接写在MainActivity中,也就是说Android代码中必须要有UnlockGame这个函数,然后才能调用;而"com.unity3d.player.UnityPlayer"和"currentActivity"都是默认的参数。
如果要在Android工程中调用Unity3D中的方法,我们需要新建一个Android工程。可以这样写java代码:
UnityPlayer.UnitySendMessage("AndroidManager", "AndroidCallBackUnlockGame", "");
这里调用了Unity3D中"AndroidCallBackUnlockGame"这个方法,最终激活了游戏。第一个参数表示Unity3D中某个gameObject,第二个参数是这个gameObject上的脚本中的某个方法,第三个参数是这个方法的参数。
上面只是讲述了交互的基本原理,下面是详细步骤。
(1)在Unity3D中创建脚本,如上面第一段代码所示,加入调用Android函数的代码;如果Android要调用C#代码,也要写下被Android代码回调的C#函数。然后,把Unity项目导出为Android工程即可。这里需要注意下图红色部分,其中Bundle Identifier就是导出的Android工程的包名。

(2)打开Eclipse,导入工程,选择import->Existing Android Code Into Workspace,最好把Copy Into WorkSpace选项也选上,这个工程通常叫做“UnityPlayerProxyActivity”。导入工程后,我们可以直接运行这个工程了。但这里是为了与Android代码交互,所以还不能这样做。通常的方法是,我们新建一个Android Application Project,包名必须与导入的工程包名相同;然后把导入的工程作为新工程的Library Project,在工程的Properties里设置,如下图所示。


(3)将导入的Unity工程assets目录里的bin和libs目录(新版的没有lib目录)拖放到新工程的assets目录里,即移动资源位置而已。说明一点,新建的Android工程作为了主工程,导入的Unity工程作为了Library Project,它们的Assets和Res资源将会最终合并在一起,但主工程必须要添加Library工程中所有需要的配置信息,也就是AndroidManifest.xml中的内容。这里还可能遇到资源ID冲突的现象,优先级高的主工程将覆盖优先级低的工程。
(4)好了,现在我们有两个工程,一个是新建的,一个是从Unity3D中导入的。这里必须学点Android开发的基础知识,onCreate函数是入口函数,其它的自学吧。想在Android里调用Unity3D代码,就用本文开头的第二段代码即可。通常,我们在新工程里创建一个Activity,在AndroidManifest.xml里进行设置要启动的Activity。假设要启动的是MainActivity,那么对于MainActivity这个类,我们要让它继承UnityPlayerActivity这个类,然后在Oncreate里调用super.onCreate即可。然后,运行新工程,我们的Unity3D游戏也跟着启动了。我们的主工程是新建的,没有设置任何视图,之所以启动了游戏,是因为继承了UnityPlayerActivity这个类,然后调用super.onCreate通过父类启动了游戏。
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
}
既然是基础,我在说的详细点。首先创建新的Android Application Project,注意包名与导入的工程一致,并且不要创建Activity, 我们手动创建。然后新建一个类,类名暂且为MainActivity,package name必须与前面说的一致。然后写上上图中的代码。如果有错误提示,按下ctrl + shift + O可以导入所需类库。如果还有红色错误,请检查你是否引用了Unity工程。我们要手动创建Activity,还要在AndroidManifest.xml这个文件里做设置,如下所示。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard"
android:screenOrientation="landscape"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
其中的android:name=".MainActivity"表示这个Activity关联的类是前面创建的MainActivity类,这里省略了前面的包名。已经设置完了,现在可以run了。有一点要记住,如果你在Unity的C#代码里调用了某个Android函数,MainActivity类中一定要添加这个函数。另外,如果你不添加android:screenOrientation可能会导致程序启动崩溃。
2.从Android工程到Unity3D
(1)新建一个Android工程,不要创建Activity,在properties属性里把工程设置为library.
(2)到安装目录C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin下面复制classes.jar这个文件到Android工程的libs目录下面。
(3)新建一个类,这里是MainActivity,写法如下,我们会在Unity3D中调用TextToast这个函数。这里同样要注意包名,要与Unity3D中Bundle Identifier相同。注意这里必须使用runOnUiThread处理UI线程。
public class MainActivity extends UnityPlayerActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
protected void TextToast(final String msg){
runOnUiThread(new Runnable(){
public void run(){
Text(msg);
}
});
}
public void Text(String msg){
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
(4)在菜单里选择Project->Clean,然后在工程目录的bin下面找到刚生成的jar文件,我们可以直接把这个jar文件导入Unity3D中作为插件使用,即放到目录Assets/Plugins/Android下面即可。在Unity3D的安装目录C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer下面找到AndroidManifest.xml这个文件,也复制到Assets/Plugins/Android这个目录下。打开这个xml文件,修改Activity名称与eclipse工程中的Activity一致,即把com.unity3d.player.UnityPlayerProxyActivity修改为包名.MainActivity,我这里是com.activ8.ppt.MainActivity。设置完成,我们现在可以在Unity3D中使用该插件了,使用方法见本文开头第一段代码。Unity4.3以后,配置文件修改方法已经改变,还要修改package为你的包名,建议查看Unity Manual文档,查找”Building Plugins for Android",然后查找”AndroidManifest.xml“文件即可看到相关设置代码。
将Unity3D游戏移植到Android平台上的更多相关文章
- Android平台上的Aplay与TinyAlsa移植使用
ALSA是高级Linux声音架构.提供了一系列音频的逻辑接口,包括PCM.CONTROL等.这些,不影响它的使用,了解一下就可以. 在Android设备上,linux 2.x的版本,要控制录制播放音频 ...
- Cocos2d-x游戏移植到Android平台
1.所需环境支持:Android SDK.NDK.Eclipse.Cygwin.(本人所用系统WIN7-64位) (1)Cygwin的下载安装: Cygwin是Windows下的Linux模拟环境,用 ...
- Cocos2dx开发游戏移植到Android平台
第一步:安装配置安卓SDK,下载NDK并解压,下载cygwin并安装 第二步:导入platform文件夹下,android文件夹下java文件夹 在eclispe的windows--pereferen ...
- Android平台上PMEM的使用及Platform设备注册(一)
Android中PMEM驱动程序是物理内存的驱动程序,可用于分配物理内存.PMEM在camera和video系统中频繁使用.下面,简单记录一下PMEM的使用方法.另外,由于PMEM设备做为Platfo ...
- Android平台上PMEM的使用及Platform设备注册(二)
三.注册PMEM设备 这里我们除了描述PMEM设备,还将注册一个拥有memory空间和IRQ资源的示例设备example_device. 对于example_device,定义如下结构体: stati ...
- android平台上AES,DES加解密及问题
在使用java进行AES加密的时候,会用到如下方法: SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 但是在andr ...
- J2ME项目移植到Android平台六大注意事项
很多J2ME项目如何移植到Android平台呢?Java虽然号称是跨平台应用但是目前的移植问题还是比较严重的,不知道未来Sun推出JavaFx或F3时会出现什么问题,如何从J2ME移植到Android ...
- [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...
- Unity3D游戏开发之Unity与Android交互调用研究
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...
随机推荐
- 【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
Drip Coffee
- 【Android 界面效果21】Android ViewPager使用详解
这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那如 ...
- leetcode题解: Remove Duplicates from Sorted List(已排序单链表去重)
题目: Given a sorted linked list, delete all duplicates such that each element appear only once. For e ...
- Oracle基础 (十一)字符串函数
一.字符串函数 LENGTH(char1,char2) SELECT LENGTH('abc def gh') FROM dual; --获取字符串的长度,包含空格 结果: CONCAT(char1, ...
- 使用jsoup进行网页内容抓取
对网页内容的抓取比较的感兴趣,于是就简单的学习了一下,如果不使用任何的框架去抓取网页的内容,感觉有点难度,我就简单点来吧,这里所使用的jsoup框架,抓取网页的内容与使用jquery选择网页的内容差不 ...
- sqlserver数据库触发器和存储过程案例学习
--创建表 create table zhuangzhan ( name ), code ) ); --往表添加一列 alter table zhuangzhan add descition in ...
- 剑指Offer02 替换空格
/************************************************************************* > File Name: 02_Replac ...
- jQuery图片提示和文字提示
图片提示: 效果如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- Pascal 语言中约瑟夫问题:幸运观众
[题目]节目主持人准备从n名学生中挑选一名幸运观众,因为大家都想争当幸运观众,老师只好采取这样的办法:全体同学站成一列,由前面往后面依顺序报数.1,2,1,2……报单数的同学退出队伍,剩下的同学向前靠 ...
- jQuery - 中文輸入法與KeyDown/KeyPress事件
最近專案中引用了Telerik ASP.NET擴充元件AutoComplete輸入欄位,測試時發現偶爾會不聽始喚,輸入文字時無法觸發資料查詢,在Javascript Source Code裡反覆追蹤測 ...