2012年5月9日 星期三

Unity3D Plug-in for Android -- Activity 擴展方法

Unity3D 的 Android Plug-in 還有另一種實做方法。當需要使用 Android SDK 中的 Java 物件時,利用這個方法來將 Unity3D 與 Android SDK 結合是比較好的。

簡單的步驟,

1. 先在 Eclipse IDE 中,新建一個 Android Project。

2. 在 Project 的 Property 中,點選 Java Build Path,切到 Libraries 的分頁,按鈕 "Add External JARs…",然後選擇 Unity 安裝目錄,找到 "\Editor\Data\PlaybackEngines\androidplayer\bin" 子目錄裡的檔案 classes.jar 來加入
clip_image002

3. 修改 Activity 的 Java Code

Activity 改成自 UnityPlayerActivity 繼承 ( import com.unity3d.player.UnityPlayerActivity ),在 Activity 的 OnCreate 函式裡,把預先產生的 setContentView() 函式呼叫刪除掉不要使用。

一個範例程式碼如下: ( UnityPlayerExtendActivity.java )
這個範例裡,我們不但使用了 Toast,還用到了Android SDK 中的 藍芽 API。這兩項功能,都是Unity3D無法提供的。

package com.activity.unityextend;

import com.unity3d.player.UnityPlayerActivity;

import android.os.Bundle;

import android.widget.Toast;

import android.bluetooth.BluetoothAdapter;

public class UnityPlayerExtendActivity extends UnityPlayerActivity {

private BluetoothAdapter mBluetoothAdapter = null;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//setContentView(R.layout.main);

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (mBluetoothAdapter == null) {

Toast.makeText(this,

"Bluetooth is not available.",

Toast.LENGTH_LONG).show();

finish();

return;

}

if (!mBluetoothAdapter.isEnabled()) {

Toast.makeText(this,

"Please check your BT settings.", // and re-run this program

Toast.LENGTH_LONG).show();

//finish();

//return;

}

}

}

另外呢,AndroidManifest.xml 這個檔案,需要調整一下。因為我們用到了藍芽功能,所以要開啟應用程式的藍芽權限。

image

4. 接著從 Eclipse IDE Export 出 jar 檔案。

 clip_image002[6]
clip_image004

5. 下一步,開啟 Unity3D,修改 Player Settings 設定。要注意的是, Bundle Identifier 與 Minimum API Level 要與 Eclipse 上的 Android Project 相同。

6. 然後將 Eclipse 的 Android Project 檔案複製到 Unity 專案的目錄下, 這裡有幾個需要複製的檔案。

clip_image008 


a. 在 Assets 目錄下建立 Plugins 目錄,再建立 Android 子目錄。

b. 將 Android Project 中的 AndroidManifest.xml 複製到 Plugins/Android 目錄內。

c. 在 Plugins/Android 目錄內建立 bin 子目錄,將 Android Project 輸出的 jar 放進來。

d. 最後將 Android Project 內的 res 子目錄複製到 Plugins/Android 目錄內

7. 最後,從 Unity3D Build & Run,就可以使用 Android SDK 提供的功能了。

 

 

(Update 2012.7.5) 加入了 AndroidManifest.xml 該修改的部分

14 則留言:

卡拉卡拉 提到...

版主您好

請問您一下 , 這方法我試過好幾次 , 輸出到Android手機 無法正常執行

我的手機系統是ICS

藍斯洛 提到...

無法執行的因素有很多,你的狀況是什麼呢??

吳狄 提到...

斯洛大 我也同樣試了好幾次
但每次都是程式崩潰

不過我拿掉xml檔案後就不會崩潰了
(雖然這樣也無法plugin了XD)

想請教一下有可能是XML的問題嗎?
是不是要增加藍芽權限還是甚麼的?

卡拉卡拉 提到...

感謝版主的回應

Android ICS系統 , 使用Unity3D輸出到Android , 執行程式看到Unity3D畫面後,程式就自動跳出

不曉得是哪邊出問題.....

卡拉卡拉 提到...

忘記說我的環境

Unity3D 3.5
Android ICS

藍斯洛 提到...

啊....果然我忘了寫了....
藍芽權限要開...
在 AndroidManifest.xml中,設定藍芽權限

卡拉卡拉 提到...

版主請問您一下

如何在 AndroidManifest.xml 中寫 藍芽權限呢,能不能將語法貼出來,謝謝版主

藍斯洛 提到...

寫法是這樣的 :
uses-permission android:name="android.permission.BLUETOOTH"
uses-permission android:name="android.permission.BLUETOOTH_ADMIN"

(每行的前後有xml 的 tag)

或者,可以從 Eclipse 的 IDE 直接設定

吳狄 提到...

斯洛大~
想請教一下,從Android打包成jar給Unity做Plugin(假設是webwiew或是撥放影片),有可能讓整個畫面的控制權主要還是給Unity而不是jar的功能嗎?

藍斯洛 提到...

很抱歉,這個我沒有研究過了。>_<

吳狄 提到...

哈~沒關係>< 我在自己摸摸看~
謝啦 !!

卡拉卡拉 提到...

主控權是在Unity , SDK包成jar給Unity作擴充功能

卡拉卡拉 提到...

這篇文章也可參考看看,同樣方法但是做法不大一樣

http://www.mat-d.com/site/unity-gps-plugin-development-tutorial-building-a-android-plugin-for-unity-with-eclipse-and-ant/

測試過可在Android 2.3和4.03版本上執行

歡迎大家一起與我討論 MSN: s2611480@seed.net.tw

匿名 提到...

版主您好:
可以詢問一下
如何建立 Android Project
我的選項中只有 1.Android Application Project 2. Android Project Existing Project 3. Android Sample Project
抱歉問題可能很白癡,是我使用錯誤嗎,小弟剛學,麻煩指導一下,感激不盡