unity與android交互總結


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

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

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

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

  如....

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

以下是我認為最靠譜省事的辦法:

  1.unity中新建空項目。

  2.選擇導出android工程。

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

  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("");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM