unity與android交互總結

在網上找了不少教程,基本上使用的方法都是在eclipse上新建普通android工程,讓主activity繼承UnityPlayerActivity,而後在該activity中寫供unity調用的接口或者主動要回調unity的接口,而後導出jar包到unity。java

這種方式只要人品很差就會出一堆亂七八糟的問題:android

  如新建工程時選擇SDK版本小於4.0時在unity build APK時報錯,由於style.xml就不會有parent="Theme.AppCompat.Light,而是parent="android:Theme.Light";eclipse

  如成功在unity打包出apk後運行時根本進不了unity中的場景內容而是直接進入了android中的activity(可能緣由是電腦上的android環境和unity(或者操做系統)是不一樣版本的,一個是32位一個是64位)ui

  如....spa

也試過用android studio,覺得官方的東西可能靠譜一些,結果發現android studio不能直接導出jar包,須要新建library再修改配置發佈文件等等多個複雜步聚……最終生成jar包了,然並卵,仍然不能使用,貌似生成的jar包內容不對,遂放棄,不想繼續研究了,也許是我方法出錯……操作系統

如下是我認爲最靠譜省事的辦法:插件

  1.unity中新建空項目。3d

  2.選擇導出android工程。code

  3.用eclipse打開該工程(若已有須要接入的android工程則進行合併),在eclipse中開始寫接口。xml

  4.接口完成後右鍵點擊src目錄Export->Java->JAR file導出jar包,注意只須要導出src目錄中的東西就能夠了,不要加入其它沒用的東西(有第三方插件時可能須要打包插件相關的東西)。

  5.回到unity,在Project中新建plugins/Android(unity5.x之前版本必須是該目錄結構)目錄,將上一步導出的jar包放進該目錄中(最好再建個bin目錄,放到bin中),另外將android項目中的AndroidMainFest.xml也複製到Android下(有第三方插件時res整個目錄也須要複製)。

  6.接下來就能夠在unity中自由使用剛作好的android插件吧!

這種方式導出的android工程省去了手動去unity安裝路徑中去尋找並導入class.jar及Bundle Identifier要與unity保持一致等問題。

 

接下來講說unity調用android接口的兩種方式:

1. 多數使用的:

1 if(GUILayout.Button("test",GUILayout.Height(100)))
2 {
3      AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
4       AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
5      jo.Call("AndroidFunction","teststring");
6 }

這種方式須要修改android主activity讓其繼承UnityPlayerActivity,經過得到的jo調用該activity中的各類接口。

2.在android工程中不修改任何代碼,直接在src中新建普通class(固然也能夠放在新建的包中),不須要繼承任何類,直接寫入你須要提供給unity調用的接口,後面unity調用方式以下:

1 if(GUILayout.Button("test",GUILayout.Height(100)))
2 {
3      AndroidJavaClass jc = new AndroidJavaClass("com.package.package.YourNewClass");
4      //或者AndroidJavaObject jo = new AndroidJavaObject("com.package.package.YourNewClass");
5      jc.CallStatic("AndroidFunction","teststring");
6      //或者jo.CallStatic("AndroidFunction","teststring");
7      //方法不管是public仍是private均可以調用到,如要調用非static的方法則只能使用jo
8 }

當你有多個插件SDK須要接入時就能夠分別寫在不一樣的類中,以下降偶合。固然若是SDK有UI交互則還是須要activity的(在android中須要得到當前unity的activity能夠經過UnityPlayer.currentActivity得到)。

android回調unity的兩種方法:

1. 簡單直接的:UnityPlayer.UnitySendMessage("TestGameObject", "Func", str)。

2. 首先在Java中定義接口,例如:

public interface IMyCallback {
    void OnDone();
    void OnDoneWithArg(String arg1);
}

而後經過AndroidJavaProxy在C#中實現接口,例如:

class AndroidMyCallback : AndroidJavaProxy
{
    public AndroidMyCallback()
    : base("com.mygame.IMyCallback")
    {
    }
    public void OnDone(AndroidJavaObject result)
    {
    }
    public void OnDoneWithArg(string arg1)
    {   
    }
}

在C#中實例化這個接口類型,並傳遞給Java:

javaClass.CallStatic("InvokeWithCallback", new AndroidMyCallback());

最後在Java裏面回調該接口:

public static void InvokeWithCallback(IMyCallback callback) {
    callback.OnDone();
    callback.OnDoneWithArg("");
}
相關文章
相關標籤/搜索