Android項目實戰(三十九):Android整合Unity3D項目(圖文詳解)

來源:互聯網
上載者:User

標籤:ror   lan   滑鼠右鍵   滑鼠   his   遊戲   error:   圖文   info   

原文: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項目(圖文詳解)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.