在網上找了很多教程,基本上使用的方法都是在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(""); }
