需求: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包替換原來的便可