unity和Android互動
近在接觸unity、對於unity和Android的互動,網上找了好多,大多都是一種方式,下面就說一下我使用後的心得。
首先:
unity呼叫Android,
unity程式碼:
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("login","");
Android程式碼:
1 2 3 |
|
以上就是網上的方法。
當我自己實際測試的時候發現,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 = newAndroidJavaClass ("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 = newAndroidJavaClass ("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 = newAndroidJavaClass ("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中的非靜態方法,只能通過最開始介紹的那種呼叫方式呼叫