1. 程式人生 > >unity和Android互動

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

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 = 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中的非靜態方法,只能通過最開始介紹的那種呼叫方式呼叫