1. 程式人生 > 其它 >(轉)Unity - 接入Android SDK

(轉)Unity - 接入Android SDK

在網路上,關於Unity與Android如何進行互動,雨鬆MOMO大神已經有兩篇文章簡單介紹瞭如何操作(1)Unity3D研究院之開啟Activity與呼叫JAVA程式碼傳遞引數(2)Unity3D研究院之與Android相互傳遞訊息。這兩篇文章簡單介紹如何操作,但是具體的內部細節並沒有涉及到。下面介紹兩種Unity與Android互動的方式(或者說就是接入Android SDK),分別是(1)Unity匯出Android工程,然後你將SDK工程作為Library來接入(2)Plugins方式,這種方式就是在Assets目錄下新建Plugins/Android目錄,把你需要的資源、jar包等按規定放進去。

(1)Unity匯出Android專案

通過在Build Settings中選擇Google Android Project選項,點選Export,可以得到一個Unity生成的Android專案。



將專案匯入到Eclipse中,可以看見如下的專案結構:



讓我們先不管src的原始碼,首先關注libs。

libs目錄

libs有三部分:前兩者(armeabi-v7a, x86)表示手機的兩種硬體裝置,包含了各自所需的so檔案,我們可以在Unity的Player Settings->Other Settings->Device Filter中來進行選擇。而unity_classes.jar就是UnityPlayerActivity類所在的jar包,其實就是Unity目錄下的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\Classes\classes.jar。(注意,這個路徑是Unity5.3的路徑,不同版本的Unity中,該路徑是不同的)

下面我們來檢視classes.jar(即unity_classes.jar)的內容

classes.jar

在網上下載一個Java反編譯工具,比如JD-GUI,開啟classes.jar,我們可以看見如下結構:



其中jnibridge應該是用來實現Java與其他語言的通訊,而fmod是用來控制音訊的,剩下的com.unity3d.player才是我們需要重點關注的。通常我們自己新建立的Activity,都是要繼承UnityPlayerActivity類,因此我們首先檢視該類,其部分內容如下:



該類的內容十分簡單,其中最為重要的是UnityPlayer:



回憶一下,我們在Android裡定義自己的Activity:

  1. public class UnityTestActivity extends UnityPlayerActivity

在Unity裡呼叫Android的方法的步驟:

  1. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  2. AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  3. jo.Call("StartActivity0","第一個Activity");

因為我們繼承了UnityPlayerActivity,那麼當我們的UnityTestActivity呼叫onCreate方法時,就同時把自己這個例項傳遞到了UnityPlayer中的currentActivity。因此在Unity中我們就可以利用currentActivity來呼叫我們自定義的UnityTestActivity中的方法。

這時回頭檢視src的原始碼,可以發現其內容和classes.jar中差不多。

清單檔案 AndroidManifest.xml

一個預設的清單檔案中有以下重要內容:



這裡,package是在Player Settings->Other Settings->Bundle Identifier設定。預設UnityPlayerActivity為主Activity。

PS.

除了通過匯出Android工程來檢視自動生成的內容,也可以通過Unity安裝目錄下的Editor\Data\PlaybackEngines\AndroidPlayer來檢視,其目錄內容如下:



我們重點看Apk、Source、Variations,這三者裡面就包含預設的AndroidManifest.xml,res目錄和assets目錄等。


(2)Plugins/Android

我們可以通過在Plugins/Android中新增東西來影響Unity生成的Android專案。

AndroidManifest.xml

我們可以直接在Android目錄下新增一個AndroidManifest.xml檔案,這個檔案會影響最終的Android專案中的清單檔案。注意,這裡的程度只是影響,而不是完全替換,比如package會最終替換為Bundle Identifier的設定,如果沒有以下幾行

  1. <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  2. <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  3. <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />

如果是預設設定他也會預設加上去,等等。

PS: AndroidManifest.xml要放到Android目錄下才會對主清單檔案起作用,如果你放到其他目錄,比如test,則不會對最終的Android專案有作用。

res目錄

你可以在Android目錄下增加一個res目錄。不管這個目錄是空的還是有東西,匯出來的Android專案都會多一個叫unity-android-resources的Library工程,而我們的主Android工程則引用了該Library,如圖:



觀察這個Library就知道,這個工程主要就是存放資源的,比如我們這裡把東西放到res目錄中,則這些多出來的東西就會放到Library工程中。注意,res目錄的東西不能隨便亂放,要按照合格的目錄結構來,即一般如下:



如果你是隨便把資源放到res目錄下,或其他錯誤名字的子目錄,比如res/test等目錄下,都會報出以下的錯誤:

assets目錄

assets目錄和res目錄類似,都是存放資源的,只是res目錄裡面的資源會在R檔案中生成ID,而assets目錄不會生成ID,需要自己手動根據路徑來訪問資源。

jar包

在檢視網上的相關文章時,發現大多數文章都說要把jar包放到Plugins/Android目錄的libs或bin目錄。不知道是不是Unity5做出了修改,我發現jar包不管放到哪,只要在Assets目錄下,都能起作用,成為最終Android工程的libs中的內容。

Library工程

你可以在Plugins/Android目錄下放置一個Android Library工程,只要設定得當,這個工程就會被Unity識別並在最終生成的Android工程中引用。這個也是我接入Android SDK時主要使用的方式,十分方便並且易於管理(畢竟這讓你知道哪些資源、jar包是歸哪個SDK的。而如果所有資源都放在res目錄,jar包都放在libs目錄,這樣就不知道某個SDK原本的東西在哪了)


我的SDK接入工作流程

下面介紹我接入SDK時的流程,這只是我個人感覺比較方便的流程,如果大家有更好的流程,希望能在評論區告知。我一般會同時使用上述兩種方式,因為第一種方式的缺點是不好進行專案管理(畢竟有兩個分開的專案),並且要打包一個apk也比較麻煩;而第二種方式的缺點就是不直觀,除錯不方便。

(1)建立SDK的Android Demo工程

根據文件,將需要的功能以Unity易於呼叫的方式寫成介面,比如我一般定義函式簽名為void FuncName(String params, String callbackTarget, String callbackMethod)

這裡,params就是SDK介面需要的引數(或者是引數列表,以";"等分隔符連線具體的引數,比如: "Apple;12"),callbackTarget就是Unity裡呼叫回撥方法的GameObject的名字,而callbackMethod就是回撥方法的名字。

然後建立簡易的介面(比如幾個按鈕)來呼叫這些寫好的介面,確定介面的功能無誤

(2)將Demo工程轉換為Library工程

去掉Demo工程中測試用的Activity、佈局檔案,在清單檔案中去掉主Activity的設定,最後把專案設定為Library。

(3)Unity匯出Android工程,和上面的Library工程一起匯入到Eclipse中

匯入完成後,如果你的Library工程用到classes.jar,你需要先刪掉該classes.jar,然後再新增Unity的Android工程的unity_classes.jar引用。

(4)把Library工程新增到Unity工程

通過(3),我們可以得到一個設定正確的Library工程,這時候我們可以直接把該工程拖到Unity工程的Plugins/Android目錄下

(5)在Unity中編寫呼叫Library工程介面的程式碼


其他

(1)Unity在直接匯出Apk時,會在Temp目錄(與Assets目錄同級)下的StagingArea目錄生成一些臨時的Android程式碼

(2)在Eclipse中,如果adb一直提示斷開連線,可以用360手機助手連上手機,這時adb就能正常工作了


參考

Unity3D研究院之開啟Activity與呼叫JAVA程式碼傳遞引數

Unity3D研究院之與Android相互傳遞訊息

Creating a native Android plugin for Unity3d

Unity Android plugin tutorial

轉載地址:https://www.bbsmax.com/A/l1dyXkb5em/