(轉)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/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章