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代碼:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM