2013年9月9日 星期一

Unity3D 呼叫 Android 端 Java 程式

http://milkmidi.blogspot.tw/2012/08/unity3d-android-java.html

大家好,我是奶綠茶
最近開始研究 Unity3D,
今天來分享如何使用 Unity3D 呼叫 Android 端的 Java 程式
或是 Android 呼叫 Unity3D

因為 Unity 編譯成 Android 平台時, 會發怖成 apk 檔, 並沒有原始碼
所以製作上有一點點的麻煩

1.新增一個新的 Android 專案
2.從 Unity 安裝路徑下 Unity\Editor\Data\PlaybackEngines\androidplayer\bin\
複製 classes.jar 至 Android 裡的 libs 資料夾下
 

3.寫一個 public 的函式給 Unity 呼叫
這邊要注意一下, 當 Unity3D 呼叫 Android 的函式時, 會因為 UI Thread 安全性關系, 所以不能彈出 AlertDialog, 需要透過一個 Handler 來決解這個問題

package milkmidi.unity3d.android;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity  {

 public static final int SHOW_ALERT_DIALOG = 0;
 
 private Handler mHandler = new Handler(){

  @Override
  public void handleMessage( Message msg ) {
   super.handleMessage( msg );
   switch ( msg.what ) {
    case SHOW_ALERT_DIALOG:
     
     AlertVO vo = (AlertVO) msg.obj;
     
     new AlertDialog.Builder(MainActivity.this)
     .setTitle( vo.title)
     .setMessage( vo.message)
     .setNegativeButton("取消", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       UnityPlayer.UnitySendMessage( "MainEntry", "alertDialogOnClick", "CANCEL" );
      }
     }).setNeutralButton("確定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       
       UnityPlayer.UnitySendMessage( "MainEntry", "alertDialogOnClick", "OK" );
       
      }
     }).create().show();
     break;

    default:
     break;
   }
  }
  
 };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    public void showAlertDialog(String title , String message){
     Message msg = mHandler.obtainMessage( SHOW_ALERT_DIALOG );
     msg.obj = new AlertVO( title, message );
     mHandler.sendMessage( msg );
     
     
    }


    class AlertVO{
     String title;
     String message;
  private AlertVO( String title, String message ) {
   super();
   this.title = title;
   this.message = message;
  }
     
    }
}





完成後,進到 Android 專案裡的 bin\classes 資料夾
4.進入 CMD 模式, 輸入 jar -cvf class.jar *
產生編譯好的 jar 檔

5.新增 Unity3D 專案, 在 Project 面版下新增
Plugins / Android
然後把 Android 裡所需的元素複製過去
同時新增一個 bin 資料夾, 把剛剛產生好的 class.jar 也複製過去
 


6. 新增一個 Unity3D C# 程式碼

void OnGUI(){  
  
  if(GUI.Button(new Rect(20,40,200,20), "show AlertDialog")) {
            // 新增一個 AndroidJavaClass, 屬性預設就為 com.unity3d.player.UnityPlayer 即可
            using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
                // 得到目前的 Activity
                AndroidJavaObject jo = jc.GetStatic("currentActivity");
                // 呼叫剛剛我們自己寫的 showAlertDialog, 並帶入參數
                jo.Call("showAlertDialog", "Title", "Message");
            }
   print("click1");
  }
 }

這樣就可以呼叫 Android 端的 Java 程式
如果要反過來的話
Android 端就可以寫
UnityPlayer.UnitySendMessage( "Unity3D 端的類別名", "函式名稱", "參數" );

Unity 端就寫一個 public 函式即可

 public void alertDialogOnClick(string result) {
        text.text = result;
        print(result);
    }

 
轉載請註明出處