Android项目实战(三十九):Android集成Unity3D项目(图文详解)
需求:
Unity3D 一般用于做游戏 而且是跨平台的。原本设计是Android 应用端A(原生开发)进行一些业务处理,最后由A 打开Android 应用端B(Unity3D 游戏开发)进行游戏操作。
这样导致的问题:
1、A应用打开B应用 , 数据之间的传递不方便
2、正常关闭,异常关闭的交互及技术上处理麻烦
3、版本迭代,需要分开考虑
4、体验差
5. ......................
最终要合并成一个Android应用 , 提高用户体验。 实现思路即 Android工程继承(引入)Unity3D项目(依赖的Android项目 生成一个类库)。
下面开始详细步骤:
一、Unity3D 工程师 将 项目生成一个类库
这个不多说,让Unity3D 工程师去做 ,我们只需要这个类库就行
二、Android工程导入类库
注:三个都要选中
导入成功之后 ,会有一些错误,要进行修改
三、修改
(1)、找到类库目录下的build.gradle文件
将第一行: apply plugin: 'com.android.application' 改为: apply plugin: 'com.android.library'
将 compileSdkVersion 和 buildToolsVersion 改为和 app目录的下build.gradle 一致
将defaultConfig{}下的 applicationId 一行删除
Sync Now...
最终如下:
(2)、找到类库目录下的AndroidManifest.xml 文件
删除application 下的几条属性
android:debuggable="false"
android:label=""
android:theme=""
android:icon="@mipmap/ic_launcher"
找到主入口Activity 即有 <intent-filter></intent-filter> 的 ,添加一条属性:android:process="e.unity3d",这是让Unity3D的主Activity退出的时候 可以回到Android部分,否则会有异常问题
然后删除<intent-filter>内部的所有部分 , 这一部分是标注该Activity作为主入口 并且 在手机桌面上显示的,去掉了,不在桌面显示,因为Android部分调用这个进入Unity3D部分,所以默认具有主入口的功能。
效果如下:
<application android:allowBackup="true" android:name="com.xxxxx.SensorS.XApplication" android:supportsRtl="true" android:isGame="true"> <activity android:configChanges="orientation|keyboardHidden|screenSize" android:name="com.xxxxx.SensorS.MainActivity" android:process="e.unity3d" android:screenOrientation="landscape"> </activity>
//... 注意
// 打开MainActivity界面是在一个新的进程中的, 见参数android:process="e.unity3d"
// 如果其他的服务 或 activity 界面 需要在同一个进程 也需要添加 android:process="e.unity3d"
</application>
(3)、依赖该类库
选择类库依赖
(4)、Android部分调打开Unity3D主Activity , 即打开类库中的某个Activity
Intent intent = new Intent(); // unity3d部分的主activity
intent.setClass(TaskListActivity.this,MainActivity.class); startActivity(intent);
另:可能出现的错误
1、你的硬件不支持!
这个出现的几率比较大,首先看一下unity3d类库的文件目录 , 只有armeabi-v7a 和 x86 两个文件夹
所以我们要解决的就是 查看一下app目录下的 和 所有类库下的 libs文件夹或者jniLibs文件夹下 也只能有这两个文件夹 , 多的需要删除
还要注意:
如果你的app目录或者module目录下的build.gradle文件夹中有如下代码:
ndk { //选择要添加的对应cpu类型的.so库。 abiFilters 'armeabi-v7a' ,'x86' }
记得也必须只能有这两个,多的也要删除。
只要保持一致,这个问题就解决了。
2、jar包冲突的问题,这个属于常见问题,类库和app中保留一个就行,不多说了。
3、BuildConfig.class 文件冲突
Error:Execution failed for task ':ipark2:transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/xxxxx/xxxxx/xxxx/BuildConfig.class
这个就说你的 com/xxxxx/xxxxx/xxxx/ 目录下的BuildConfig.class 文件冲突了 。 一般是在类库中,jar包下有这么一个文件,而原来项目中是没有的,是生成类库的时候系统给生成的。
解决方法就是 把该文件从 jar包中删除。
举例:
1、现在有一个jar包
2、打开该文件所在的目录 , 按Shift + 鼠标右键 选择 ‘从此处打开命令窗口’
输入命令: jar xf SensorS.jar 注:SensorS 即你的jar包的名字
执行命令之后 会发现目录下多了一个jar包解压后的文件,在该文件夹下按目录找到BuildConfig.class 文件, 删除
3、重新把处理后的文件夹压缩成jar包
jar cvf SensorSSS.jar com 注:SensorSSS 即重新生成的jar包的名字 , com即 要被压缩成jar包的文件夹(即原先jar包解压缩出来的文件并删除BuildConfig.class文件)
最后将处理后的jar包替换原来的即可
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。