Unity3d Android SDK接入解析(二)Unity3d Android SDK的設計與兩種接入方式

來源:互聯網
上載者:User

標籤:

一、前言

上篇說清楚了Unity和Android調用的方式,但很多實際接入的部分沒有講的很詳細,因為重頭在這篇,會詳細講述具體接入Android SDK的方式,和怎麼去做一個方便Unity接入的SDK。

傳送門:
前篇:Unity3d 與 Android之間的互相調用
http://blog.csdn.net/yang8456211/article/details/51331358
後篇:Unity3d Android SDK接入解析(三)接入Android Library的理解
http://blog.csdn.net/yang8456211/article/details/51435465

二、中篇:Unity3d Android SDK的設計與兩種接入方式(Android SDK的接入一般分為兩種)

1)一種是把Unity的工程匯出google project的形式進行接入
2)另一種是通過把Android的工程做成Plugins的形式進行接入

對比:

類別(形式) google project U3d Plugins
優點 容易理解、方便接入原生SDK、幾乎所有SDK都可以接入 接入方便、容易在Unity中進行擴充與管理
缺點 接入比較繁瑣,對U3d項目不友好 不是所有SDK都提供U3d Plugins形式
apk匯出 Android IDE匯出 Unity 匯出

建議:

如果做一個sdk,還是推薦分開Android形式的SDK(可以是Library),與Unity3d形式的SDK(Plugins),因為一般項目會有自己的SDK架構,而讓他們打破這個架構,匯出Google project的形式進行接入,這無疑是很難被接受的。下面我們就來說一下具體的操作:
首先我們會自己寫一個SDK,並說明白其中的注意點,然後會用兩種方式接入這個SDK。
2.1 一個簡單Android SDK

這個SDK實現幾個小功能,實現四個方法:

  • init方法,用來傳入上下文
  • 傳入兩個數返回他們的和
  • 傳入msg,彈出一個Toast提示
  • 彈出一個提示視窗,視窗需要的文字資訊從strings.xml裡面擷取,點擊確認關閉

先回答一個可能困惑大家問題:

1)實現SDK時一定要存在一個中介軟體Activity繼承UnityPlayerActivity嗎?

網上幾乎所有教程都是這樣教的,建立一個MyActivity,然後繼承UnityPlayerActivity,在MyActivity裡面寫介面,然而根本沒有講清楚為什麼要這樣做。。

有關於這種方式的一些研究請看前篇:
http://blog.csdn.net/yang8456211/article/details/51331358。

2)讓我們拋棄MyActivity吧

對於1)的問題,答案是NO,簡單說一下我的理解,只有當需要在Activity的生命週期中執行一些操作時,我們才需要一個中間Activity去完成這些與生命週期相關的操作,而其他情況下,一個Class足以。那就讓我們開始吧:

  • 建立一個Android Project callAndroid

  • 刪除其中MainActivity和activity_main.xml

  • 建立一個Java class 取名CallMethod,寫好上述四個方法。(可以自己先寫寫,然後看跟我寫的有什麼不一樣)

public class CallMethod {    private static Context unityContext;    private static Activity unityActivity;    private static AlertDialog.Builder alert;    //init方法,用來傳入上下文        public static void init(Context paramContext){        unityContext = paramContext.getApplicationContext();        unityActivity = (Activity) paramContext;    }    //傳入兩個數返回他們的和    public static int add(int arg0, int arg1){        return arg0 + arg1;    }    //傳入msg,彈出一個Toast提示    public static void showMessage(final String msg){        unityActivity.runOnUiThread(new Runnable()        {                public void run()                {                    Toast.makeText(unityContext,msg, Toast.LENGTH_LONG).show();            }        });    }    //彈出一個提示視窗,視窗需要的文字資訊從strings.xml裡面擷取,點擊確認關閉    public static void showAlertView(){        alert = new AlertDialog.Builder(unityActivity).setTitle("快顯視窗").setMessage(unityContext.getResources().getIdentifier("msgAlert", "string", unityContext.getPackageName())).setPositiveButton("確認", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface arg0, int arg1) {                // TODO Auto-generated method stub                unityActivity.finish();            }        });        unityActivity.runOnUiThread(new Runnable()            {                public void run()                {                    alert.show();            }        });    }}

這一小段代碼,含金量可不小,能解決絕大部分你所遇到的問題~

1. 不使用Activity,那Activity上下文怎麼來?

使用init的方法讓Unity傳當前上下文進來,我們就能拿到當前的Activity和應用上下文。(至於Unity怎麼拿上下文,前篇我沒有明確指出,但是我是有提的~請保持思考!)

2. 怎麼快顯視窗?怎麼對介面進行操作?

Unity調用Android方法預設不是在UI主線程上執行的,所以如果你想要對UI介面進行操作,那就要使用runOnUiThread才行。

3. 使用Plugins接入的時候,怎麼才能讀到R的資源?

這個問題困擾了我挺久的,因為直接把libs放入到Plugins中會導致讀取不到資源,最後是通過反編譯各種第三方SDK,才找到方法。此處是通過unityContext.getResources().getIdentifier(“msgAlert”, “string”, unityContext.getPackageName())這種java反射機制擷取。(這裡是擷取了一個string,類比其他)

4. 只能使用靜態方法嗎?

當然不是,也可以使用執行個體方法,只是靜態方法更容易調用,想要使用執行個體方法,我們可以建立一個單例,然後使用這個單例去調用執行個體方法。

    private static CallMethod invokeSingleTon = null;    public static CallMethod getInvokeClass(){        if (invokeSingleTon == null){            invokeSingleTon = new CallMethod();        }        return invokeSingleTon;    }    public void sayhello(){        //方法內容    }
3)怎麼發布我們的SDK呢?

此時我們就已經寫好了我們的SDK,這個SDK比較健壯,怎麼發布都行,可以勾上isLibrary以Android的庫檔案的形式進行發布;也可以分離出jar和res,以代碼和資源的方式進行發布。

2.2 一個簡單Unity工程

在寫完AndroidSDK之後,我們簡單的寫一個Unity的工程,用來調用Android設定的介面。

  • 首先建立一個空的Unity工程,命名為UnityCall
  • 選中攝像機MainCamera,建立一個CS指令碼callAnd

  • 綁定到Main Camera
    選中Main Camera,在add component的地方,選擇剛才寫的callAnd指令碼

cs指令碼的代碼:

    AndroidJavaClass unityPlayer;    AndroidJavaObject currentActivity;    AndroidJavaClass androidCall;    void Start () {        //擷取context        unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");        androidCall = new AndroidJavaClass("com.atany.callandroid.CallMethod");        androidCall.CallStatic("init",currentActivity);    }    void Update () {    }    void OnGUI()      {          GUI.skin.textArea.fontSize = 50;        GUI.skin.button.fontSize = 50;        // add        if(GUI.Button(new Rect(100,300,450,300),"add"))          {              int sum = androidCall.CallStatic<int>("add",1,2);            print ("sum is "+ sum);        }         // showMessage        if(GUI.Button(new Rect(600,300,450,300),"showMessage"))        {            androidCall.CallStatic("showMessage","顯示這一段的文字");                   }        // showAlertView        if(GUI.Button(new Rect(100,700,450,300),"showAlertView"))        {            androidCall.CallStatic("showAlertView");                    }    }

畫了三個button,用於調用我們設定好的Android三個不同的功能。

2.3 匯出Android工程進行接入

首先呢,我們就先試一試匯出Android工程的接入形式,把我們的Unity工程匯出,然後接入我們的Android SDK。

  • 匯出Android 工程(快速鍵 Shift+Ctrl+b調出Build Settings)

  • 匯入到IDE 這裡使用eclipse,當然Idea也是一樣的

注意:這裡一定要選Existing Android Code Into Workspace,不要選Existing projects into Workspace

  • 我們把Android SDK打成jar+res(就一個stringnew.xml)的形式發布,加入到Unity匯出的工程中。

-可以看到,我們就加入了兩個東西,一個jar和一個xml,讓我們跑起來看看效果

add:
點擊add成功收到Unity3d列印的傳回值。

showMessage:
點擊showMessage,成功在當前介面顯示了toast。

showAlertView:
點擊showAlertView,成功在介面彈出了對話方塊

OK,到這裡我使用匯出google project的方法實現的android sdk的接入!也說明我們的資源讀取的方式是正確的(取到stringnew裡面的字串資源),能夠彈出對話方塊和Toast就意味著你能夠實現各種可視化的介面操作。接著,我們看看怎麼使用Unity外掛程式的形式進行接入。

2.4 使用Unity外掛程式形式進行接入

這種形式更加簡單,簡而言之就是以U3d要求的一種形式放好你的資源和jar包,然後就能夠運行了~

  • 構建Plugins的形式
    我們還是用之前建立的U3d的工程,記得開始的時候我們只添加了一個指令碼,現在我們要在assets下面建立如下的結構:

    Plugins:assets 下的根目錄(下面可能有Android或者IOS)Android:主目錄bin:放中介軟體的工程(我們沒有建立MyActivity的中介軟體,如果有的話放在這裡)libs:放所有jar包res:放所需要的資源
  • 放入我們剛匯出的Android SDK的libs和res

注意:
1.callAndroid的jar是放在libs裡面的,stringnew這個xml是放在values裡面的,我是通過多選讓大家看看我添加的所有檔案
2.如果bin裡面有加入中介軟體MyActivity,或者有需要添加的許可權以及Android的組件,需要放入AndroidManifest到Android目錄下。

  • 運行效果和匯出google project的效果是一樣的,我就不重新貼圖貼一次了。
總結:

如果你跟著我做完了,你應該理解到的內容:
1. 正確的完成一個方便Unity接入的SDK
2. 使用匯出工程的模式完成SDK的接入
3. 使用Unity外掛程式的形式進行Android的接入

後篇我會講講具體的例子,怎麼接入一個具體的Android的Library工程。

三、demo地址Android接入demo分為三個工程:
  1. UnityCall:Plugins形式的Unity3d的工程
  2. EclipseProj:Android的兩個工程
    UnityPlayerNativeActivity:Unity3d匯出式的工程
    callAndroid:Android的sdk工程

http://download.csdn.net/detail/yang8456211/9517718

楊光(atany)原創,轉載請註明博主與博文連結,未經博主允許,禁止任何商業用途。
博文地址:http://download.csdn.net/detail/yang8456211/9517718
部落格地址:http://blog.csdn.net/yang8456211
本文遵循“署名-非商業用途-保持一致”創作公用協議

Unity3d Android SDK接入解析(二)Unity3d Android SDK的設計與兩種接入方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.