Android项目实战(三十九):Android集成Unity3D项目(图文详解)

时间:2022-08-03 23:14:34

  需求:

  Unity3D 一般用于做游戏 而且是跨平台的。原本设计是Android 应用端A(原生开发)进行一些业务处理,最后由A 打开Android 应用端B(Unity3D 游戏开发)进行游戏操作。

 

  这样导致的问题: 

  1、A应用打开B应用 , 数据之间的传递不方便

  2、正常关闭,异常关闭的交互及技术上处理麻烦

  3、版本迭代,需要分开考虑

  4、体验差

  5. ......................

  最终要合并成一个Android应用 , 提高用户体验。 实现思路即 Android工程继承(引入)Unity3D项目(依赖的Android项目 生成一个类库)。

  

  下面开始详细步骤:

  一、Unity3D 工程师 将 项目生成一个类库

    这个不多说,让Unity3D 工程师去做 ,我们只需要这个类库就行

  

     二、Android工程导入类库

    Android项目实战(三十九):Android集成Unity3D项目(图文详解)

    

    注:三个都要选中

        Android项目实战(三十九):Android集成Unity3D项目(图文详解)

      导入成功之后 ,会有一些错误,要进行修改

    

 三、修改

  (1)、找到类库目录下的build.gradle文件

       将第一行: apply plugin: 'com.android.application'  改为: apply plugin: 'com.android.library'

       将 compileSdkVersion 和 buildToolsVersion 改为和 app目录的下build.gradle 一致

      将defaultConfig{}下的 applicationId 一行删除

Sync Now...

      最终如下:

      Android项目实战(三十九):Android集成Unity3D项目(图文详解)

    

 (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)、依赖该类库

      Android项目实战(三十九):Android集成Unity3D项目(图文详解)

       选择类库依赖

      

   

  (4)、Android部分调打开Unity3D主Activity , 即打开类库中的某个Activity

Intent intent = new Intent();
// unity3d部分的主activity
intent.setClass(TaskListActivity.this,MainActivity.class);
startActivity(intent);

  

  另:可能出现的错误

  1、你的硬件不支持! 

  Android项目实战(三十九):Android集成Unity3D项目(图文详解)

  这个出现的几率比较大,首先看一下unity3d类库的文件目录 , 只有armeabi-v7a 和 x86 两个文件夹

  Android项目实战(三十九):Android集成Unity3D项目(图文详解)

   所以我们要解决的就是 查看一下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包 Android项目实战(三十九):Android集成Unity3D项目(图文详解)

   2、打开该文件所在的目录 , 按Shift + 鼠标右键 选择 ‘从此处打开命令窗口’

      输入命令: jar xf SensorS.jar    注:SensorS 即你的jar包的名字

     Android项目实战(三十九):Android集成Unity3D项目(图文详解)

      执行命令之后 会发现目录下多了一个jar包解压后的文件,在该文件夹下按目录找到BuildConfig.class 文件, 删除

    3、重新把处理后的文件夹压缩成jar包

    jar cvf SensorSSS.jar com    注:SensorSSS 即重新生成的jar包的名字  , com即 要被压缩成jar包的文件夹(即原先jar包解压缩出来的文件并删除BuildConfig.class文件)

     Android项目实战(三十九):Android集成Unity3D项目(图文详解)

     最后将处理后的jar包替换原来的即可

Android项目实战(三十九):Android集成Unity3D项目(图文详解)的更多相关文章

  1. Java并发编程原理与实战三十九:JDK8新增锁StampedLock详解

    1.StampedLock是做什么的? ----->它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足.   2.Ree ...

  2. Spring Boot教程(三十九)使用MyBatis注解配置详解(2)

    增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...

  3. &OpenCurlyDoubleQuote;全栈2019”Java第五十九章:抽象类与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. ElasticSearch实战系列八&colon; Filebeat快速入门和使用---图文详解

    前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

  5. Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator

    Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...

  6. Android笔记(三十九) Android中的数据存储——SQLite(一) create

    SQLite是内置于Android的一款轻量级关系型数据库,她运算速度快,占用资源少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用. SQLite不仅支持标准的SQL语法,还遵循数据库 ...

  7. Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制

    什么是Handler 之前说过了,Android不允许主线程(MainThread)外的线程(WorkerThread)去修改UI组件,但是又不能把所有的更新UI的操作都放在主线程中去(会造成ANR) ...

  8. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十九之铭文升级版

    铭文一级:(没有内容) 铭文二级: 创建Spring boot项目: 看官网,Quick Start下面有两个依赖,必须得使用 但是如果用IDEA构建Spring boot,则会自动添加 New Pr ...

  9. 潭州课堂25班:Ph201805201 django 项目 第三十九课 后台 文章发布,图片上传到 FastDFS后端实现 七牛云讲解(课堂笔记)

    文章发布: # 1,从前台获取参数# 2,校验参数# 3,把数据保存到数据库# 4,返回执行结果到前台,(创建成功或失败) 自定义 froms.py 校验参数 上传图片到七牛云 注册 https:// ...

  10. vue2&period;0项目实战(4)生命周期和钩子函数详解

    最近的项目都使用vue2.0来开发,不得不说,vue真的非常好用,大大减少了项目的开发周期.在踩坑的过程中,因为对vue的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪 ...

随机推荐

  1. zabbix利用api批量添加item,并且批量配置添加graph

    关于zabbix的API见,zabbixAPI 1item批量添加 我是根据我这边的具体情况来做的,本来想在模板里面添加item,但是看了看API不支持,只是支持在host里面添加,所以我先在一个ho ...

  2. jQuery与Struts2综合应用&lbrack;stream&sol;json&rsqb;

    一.使用stream类型的Result实现Ajax 具体步骤: ① 定义InputStream类型的成员变量及getter和setter ②具体业务方法中将要发送到客户端的json字符串赋值给成员变量 ...

  3. nodejs&colon; C&plus;&plus;扩展

    Nodejs的C++扩展首先保证nodejs和v8都正确安装 下载NodeJS源码,我的放在D盘. NodeJS的C++扩展要用VS2010开发,新建一个空的Win32控制台项目,右键——属性,在常规 ...

  4. 贪心法基础题目 HDU

    贪心算法的基本步骤: 1.从问题的某个初始解出发.2.采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模.3.将所有部分解综合起来,得到问题的最终解. ...

  5. 201521123049 《JAVA程序设计》 第1周学习总结

    1. 本章学习总结 1.认识了新的一门计算机编程语言JAVA: 2.JAVA的编写与C语言类似,都是不能利用指针进行编写: 3.在实验课上初步认识JAVA并利用JAVA进行简单的编程,在实践上得到进一 ...

  6. 2MySQL Server 系统架构

    2.2MySQL Server 系统架构 总的来说,MySQL 可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限 ...

  7. &lpar;73&rpar;Wangdao&period;com第十二天&lowbar;JavaScript consol 对象与控制台

    consol 对象 console对象是 JavaScript 的原生对象 它有点像 Unix 系统的标准输出stdout和标准错误stderr, 可以输出各种信息到控制台,并且还提供了很多有用的辅助 ...

  8. STL容器-- forward&lowbar;list 用法

    http://www.cplusplus.com/reference/forward_list/

  9. mysql主从不同步问题 Error&lowbar;code&colon; 1197

    首先查看从的状态   mysql> show slave status \G *************************** 1. row *********************** ...

  10. layerui如何隐藏按钮?

    https://www.layui.com/doc/modules/layer.html#btn 建议把 btn: ['取消'],btnAlign: 'c',yes: function (index) ...