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的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪 ...
随机推荐
- fio——IO基准测试
简介 fio是IO工具,既可以用于基准测试,也可以用于硬件的压力测试验证(stress/hardware verification). 支持13种不同的IO引擎(sync.mmap.libaio.po ...
- Python 爬虫练习(三) 利用百度进行子域名收集
不多介绍了,千篇一律的正则匹配..... import requests import re head = {'User-Agent': \ 'Mozilla/5.0 (Windows NT 6.3; ...
- Java中常用加减密方式
1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...
- 关于tolua的使用
一.首先在引擎的跟目录下找到cocos2d-x自带的工具tolua++ 二.使用tolua++生成自定义类的声明 打开tool文件夹中的readme文件如下: 1. Generating the lu ...
- Spark SQL中的几种join
1.小表对大表(broadcast join) 将小表的数据分发到每个节点上,供大表使用.executor存储小表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在SparkSQ ...
- MySQL .msi 安装失败改用.zip安装步骤
一开始官网下载.msi安装包,安装到配置server时无法启动,长时间卡在这里,无法继续下去.上网看了一下解决办法,发现用.zip安装包进行安装比较简单可靠. 一.利用.msi安装包安装失败后的处理 ...
- [C#]使用Gembox.SpreadSheet向Excel写入数据及图表
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- 快速增加controller节点
# controller1节点部署成功后,再添加controller节点,复制配置文件并修改即可openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p ...
- [C#]使用Label标签控件模拟窗体标题的移动
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- ORACLE+PYTHON实战:复制A表数据到B表
最近在学习python ,看到了pythod的oracle,不仅可以一次fetch多条,也可以一次insert多条,想写一个复制A表数据到B表的程序来看看实际效率能不能提高.写完发现,非常惊艳!效率提 ...