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包等按規定放進去。android

(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)的內容eclipse

classes.jar

在網上下載一個Java反編譯工具,好比JD-GUI,打開classes.jar,咱們能夠看見以下結構:

其中jnibridge應該是用來實現Java與其餘語言的通訊,而fmod是用來控制音頻的,剩下的com.unity3d.player纔是咱們須要重點關注的。一般咱們本身新建立的Activity,都是要繼承UnityPlayerActivity類,所以咱們首先查看該類,其部份內容以下:

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

回憶一下,咱們在Android裏定義本身的Activity:
public class UnityTestActivity extends UnityPlayerActivity
在Unity裏調用Android的方法的步驟:函數

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  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項目。ui

AndroidManifest.xml

咱們能夠直接在Android目錄下添加一個AndroidManifest.xml文件,這個文件會影響最終的Android項目中的清單文件。注意,這裏的程度只是影響,而不是徹底替換,好比package會最終替換爲Bundle Identifier的設置,若是沒有如下幾行3d

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<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

相關文章
相關標籤/搜索