最近在接觸unity、對於unity和Android的交互,網上找了好多,大多都是一種方式,下面就說一下我使用后的心得。
首先:
unity調用Android,
unity代碼:
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("login","");
Android代碼:
public void login( String str ) { // 寫上自己的操作 }
以上就是網上的方法。
當我自己實際測試的時候發現,Android這邊的login()不一定要寫在com.unity3d.palyer包名下的UnityPalyer類下。
你只需要把login()寫在你自己定義包名下的UnityPlayerActivity.java中就可以了。當然了,該類肯定是繼承Activity的。
你可以把鼠標放在unity代碼的Call上查看方法可以填寫的參數, 你會發現方法可以填寫的參數可以是params object[]。也就是可以傳遞多個參數,以數組的形式傳遞給Android。
接下來是Android調用unity了。
例(android代碼):
UnityPlayer.UnitySendMessage("btnTest", "showLog", "a#b#c");
這里要說明一下,UnitySendMessage的第一個參數是unity控件的名字,第二個參數是方法名,第三個參數是要傳遞的參數。而且只能傳遞一個參數(感覺好坑)。不過還好。你可以把你要傳遞的參數做成一個字符串傳遞過去,unity那邊做分割字符串就行了。例如上面就是把a,b,c用#連接起來。unity那邊用#作為分隔符去分割就OK了。
那么問題來了,腳本掛在的unity控件名字不好找怎么辦。其實還有個辦法輕松搞定,那就是在腳本的Start()方法中指定name為你方法傳遞的控件名字就OK了。
如我上面的方法中要找的控件是btnTest,則:
unity代碼:
void Start () { this.name = "btnTest"; }
void showLog(string str){
Debug.Log("str:" + str );
}
以上就是網上普遍轉載的方法。
unity調用Android,還可以傳遞多個參數。如下:
unity代碼:
public void PKBtnClick() {
this.test("test1", "test2", "test3");
}
public void test( params object[] args ){
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("login", args);
}
或者
public void PKBtnClick() {
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call("login", "test1", "test2", "test3");
}
以上是unity的兩種寫法,都是可以的
Android代碼:
public void login( String str1, String str2, String str3 ) { Log.e("test", str1 + "==" + str2 + "==" + str3 ); }
(Android的方法login()是在主activity里面)。
如果你想用下面的方法接受參數,是錯誤的。
Android代碼:
public void login( String []str1 ) { Log.e("test", str1[0] + "==" + str1[1] + "==" + str1[2] ); }
不過要記住!! unity傳遞多少個參數,java就必須接收多少個參數,不然肯定會報錯的!!
如果unity傳遞給Android整形數據或者布爾值,
則unity代碼:
public void PKBtnClick() { this.test("test1", "test2", "test3", 1, true); } public void test( params object[] args ){ AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("login", args); }
Android代碼:
public void login( String str1, String str2, String str3, int a, boolean isShow ) { if( isShow ){ Log.e("test", str1 + "==" + str2 + "==" + str3 + "==" + a ); } }
以上就是unity調用Android的非靜態方法,接下來介紹下unity調用Android的靜態方法:
unity代碼:
public void PKBtnClick() { this.test("test1", "test2", "test3", 1, true); } public void test( params object[] args ){ AndroidJavaClass jc = new AndroidJavaClass ("com.Indra.Dark.UnityPlayerActivity"); jc.CallStatic ("login", args); }
Android代碼:
public static void login( String str1, String str2, String str3, int a, boolean isShow ) { if( isShow ){ Log.e("test", str1 + "==" + str2 + "==" + str3 + "==" + a ); }
}
(unity代碼中"com.Indra.Dark.UnityPlayerActivity"為真實的包名.類名,即com.Indra.Dark是包名,UnityPlayerActivity為類名)
還有一種方式:(該方式行不通!!)
unity代碼:
public void PKBtnClick() { this.test("test1", "test2", "test3", 1, true); } public void test( params object[] args ){ AndroidJavaClass jc = new AndroidJavaClass ("com.Indra.Dark.UnityPlayerActivity"); jc.Call ("login", args); }
Android代碼:
public void login( String str1, String str2, String str3, int a, boolean isShow ) { if( isShow ){ Log.e("test", str1 + "==" + str2 + "==" + str3 + "==" + a ); }
UnityPlayerActivity為主activity, 經過測試,這種調用不成功!!! 看來如果調用主activity中的非靜態方法,只能通過最開始介紹的那種調用方式調用