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包替换原来的即可
Android项目实战(三十九):Android集成Unity3D项目(图文详解)的更多相关文章
- Java并发编程原理与实战三十九:JDK8新增锁StampedLock详解
1.StampedLock是做什么的? ----->它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足. 2.Ree ...
- Spring Boot教程(三十九)使用MyBatis注解配置详解(2)
增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...
- “全栈2019”Java第五十九章:抽象类与抽象方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解
前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...
- Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator
Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...
- Android笔记(三十九) Android中的数据存储——SQLite(一) create
SQLite是内置于Android的一款轻量级关系型数据库,她运算速度快,占用资源少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用. SQLite不仅支持标准的SQL语法,还遵循数据库 ...
- Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制
什么是Handler 之前说过了,Android不允许主线程(MainThread)外的线程(WorkerThread)去修改UI组件,但是又不能把所有的更新UI的操作都放在主线程中去(会造成ANR) ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十九之铭文升级版
铭文一级:(没有内容) 铭文二级: 创建Spring boot项目: 看官网,Quick Start下面有两个依赖,必须得使用 但是如果用IDEA构建Spring boot,则会自动添加 New Pr ...
- 潭州课堂25班:Ph201805201 django 项目 第三十九课 后台 文章发布,图片上传到 FastDFS后端实现 七牛云讲解(课堂笔记)
文章发布: # 1,从前台获取参数# 2,校验参数# 3,把数据保存到数据库# 4,返回执行结果到前台,(创建成功或失败) 自定义 froms.py 校验参数 上传图片到七牛云 注册 https:// ...
- vue2.0项目实战(4)生命周期和钩子函数详解
最近的项目都使用vue2.0来开发,不得不说,vue真的非常好用,大大减少了项目的开发周期.在踩坑的过程中,因为对vue的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪 ...
随机推荐
- VMware下Linux网络配置局域网和外网访问
要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设 ...
- Centos6.9安装vsftpd并配置多用户的方法
本文介绍了Centos6.9安装vsftpd并配置多用户的方法,分享给大家,具体如下: 一.安装vsftpd ? 1 2 3 4 5 6 7 8 #安装vsftpd yum -y install vs ...
- Python 面向对象(五) 描述器
使用到了__get__,__set__,__delete__中的任何一种方法的类就是描述器 描述器的定义 一个类实现了__get__,__set__,__delete__中任意一个,这个类就是描述器. ...
- [DFS遍历图]UVA10562 Undraw the Trees
传送门: 1. UVA - 10562 2. Vjudge [看图写树] 将题目中给出的树改写为 括号表示法 即 (ROOT (SON1(...) (SON2(...)...(SONn(... ...
- idea+scala+spark遇到的一些问题
1.windows中以本地模式运行spark遇到"Could not locate executable null\bin\winutils.exe in the Hadoop binari ...
- 如何清除PHP中不需要的Layout模板
最简单的办法就是在需要清除的静态页的最前端加上 {__NOLAYOUT__} 就可以清除所有的layout效果, 继而设置自己的css.js效果.
- 高质量PHP代码的50个实用技巧必备(下)
26. 避免直接写SQL, 抽象之 不厌其烦的写了太多如下的语句: ? 1 2 <span style="color:#333333;font-family:''Helvetica, ...
- Windows下Tomcat调优
windows tomcat 优化 1. tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...
- 小白的Python之路 day1 模块初识
模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持,以后的课程中会深入讲解常用到的各种库,现在,我们先来象征性的学2个简单的. ...
- Java 面试宝典
1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序 答:先静态.先父后子. 先静态:父静态 > 子静态 优先级:父类 > 子类 静态代码块 ...