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