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

  需求:java

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

 

  这样致使的问题: api

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

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

  三、版本迭代,须要分开考虑ui

  四、体验差this

  5. ......................spa

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

  

  下面开始详细步骤:设计

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

    这个很少说,让Unity3D 工程师去作 ,咱们只须要这个类库就行

  

     2、Android工程导入类库

    

     

    注:三个都要选中

        

 

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

    

 3、修改

  (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);

 

  

  另:可能出现的错误

  一、你的硬件不支持! 

  

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

  

   因此咱们要解决的就是 查看一下app目录下的 和 全部类库下的 libs文件夹或者jniLibs文件夹下 也只能有这两个文件夹 , 多的须要删除

    还要注意:

   若是你的app目录或者module目录下的build.gradle文件夹中有以下代码: 

   ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters  'armeabi-v7a' ,'x86'
        }

   记得也必须只能有这两个,多的也要删除。

   只要保持一致,这个问题就解决了。

  

  二、jar包冲突的问题,这个属于常见问题,类库和app中保留一个就行,很少说了。

    

  三、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包中删除。

     举例:

   一、如今有一个jar包 

 

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

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

     

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

    三、从新把处理后的文件夹压缩成jar包  

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

     

 

 

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

相关文章
相关标签/搜索