其實這個方法,不管是要開啟藍芽還是振動之類需要有權限的要求,都可以達成。
使用Eclipse可以看這篇Unity 使用Android Bluetooth (Eclipse)
建議可以先看過這篇文章(Unity使用Android的Toast),作法上有很多類似的地方。
而藍芽部分可以看這篇文章
開個新專案
我的Unity Android SDK最小為9,所以這邊最小也選9
由於只是將程式碼包起來給Unity呼叫,所以不需要Activity畫面
之後請到Unity的安裝路徑:Unity\Editor\Data\PlaybackEngines\androidplayer\development\bin
複製這個檔案到剛剛創建出來的專案libs資料夾內,路徑為:[你的專案位置]\app\libs
即可看到如下圖所示:
然後對該jar點選右鍵→Add As Library...
按下OK,即可成功導入專案內
打開AndroidBluetooth\app\src\main\java,可以看到一個空資料夾
在該空資料夾上點右鍵→New→Java Class,我建立了一個名為AndroidBluetoothForUnity的檔案
開始撰寫程式碼,該程式碼為假設「使用者的裝置有藍芽,且不會通知使用者直接開啟」
package com.androidbluetooth;
import android.bluetooth.BluetoothAdapter;
import com.unity3d.player.UnityPlayer;
public class AndroidBluetoothForUnity
{
public static void openBluetooth()
{
UnityPlayer.currentActivity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
BluetoothAdapter bluetoothAdapter;
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter.isEnabled() == false)
{
bluetoothAdapter.enable();
}
}
});
}
}
寫完後應該會出現錯誤,原因是沒有加入藍芽權限!
此時打開AndroidBluetooth\app\src\main\AndroidManifest.xml
加入藍芽權限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
加入後存檔(注意package名稱!要使用到該jar檔的Unity package名字要和這個名字相同)
P.S.Unity package名稱可以再Unity的Player Setting內找到,也就是Bundle identifier
再來點選Android Studio右邊的Gradle
專案第一次打開Gradle應該都是Nothing to show,此時按下左上的重新整理
打開該選項,會有兩個子選項,由於我們只是要將AndroidBluetooth\app內的腳本打包出來而已,所以選擇:app
然後選擇other→jarReleaseClasses
對jarReleaseClasses點右鍵,選擇Run
就會自動把Android Studio\app內的檔案打包成jar
之後可以在[專案存放路徑]\AndroidBluetooth\app\build\intermediates\packaged\release找到打包的jar檔(預設檔名為classes.jar,可以改成自己喜歡的名字)
而權限檔則在[專案存放路徑]\AndroidBluetooth\app\src\main內
打開Unity,新建一個專案,命名為 useBluetooth,並產生如下的資料夾(由於只是示範開啟藍芽,所以新建的專案為2D)
並將剛剛複製出來的的jar放到libs資料夾內
xml放到Android資料夾內
然後打開該xml檔案,將以下字串
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
替換成
<application
android:theme="@style/UnityThemeSelector"
android:icon="@drawable/app_icon"
android:label="@string/app_name">
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
如下圖
變成
改這個的用意在於「設定App的進入點、應用程式名字(name)、圖示(icon)、主題(theme)」
以上步驟都做好後,就新增三個C#腳本,分別命名為:AndroidBehaviour 、 Bluetooth 、Test
AndroidBehaviour腳本同開頭我提到的「Unity使用Android的Toast」那篇AndroidBehaviour腳本相同,所以就不再重複了
而Bluetooth腳本程式碼如下:
using UnityEngine;
using System.Collections;
public class Bluetooth : AndroidBehaviour<Bluetooth>
{
protected override string javaClassName
{
//要呼叫的class所在的Package名稱.要呼叫的java class名稱
get { return "com.androidbluetooth.AndroidBluetoothForUnity"; }
}
public static void openBT()
{
instance.CallStatic("openBluetooth");//要被呼叫的方法名稱
}
}
Test腳本程式碼如下
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start ()
{
Bluetooth.openBT();
}
}
都好之後將Test和Bluetooth放到同個物件上!
(在此範例我放到Camera上)
之後在 Player Setting 內的 Bundle Identifier 要和複製到該專案內的 AndroidManifest.xml 的 package 名稱一樣,且minSdk也要相同(Minimum API Level)
最後就Build成apk,丟到手機上安裝執行了!(其實也可以直接Build And Run)
P.S.Android Studio預設的SDK位置在 C:\Users\[你的使用者名稱]\AppData\Local\Android\sdk
↓可以看到藍芽開啟了!
完整檔案在此(包含 Android Studio 的 AndroidBluetooth 和 Unity 的 useBluetooth )

之後在 Player Setting 內的 Bundle Identifier 要和複製到該專案內的 AndroidManifest.xml 的 package 名稱一樣,且minSdk也要相同 且minSdk也要相同是什麼意思
minSdk Android專案在新建的時候可以選擇最小支援到哪個版本的Android 而Unity在Player Setting的Android部分也有minSdk的設定 這兩個設定要相同
您好: 請問一下,開啟藍芽後, 可以教學一下如何顯示裝置然後連線嗎?
http://oblivious9.pixnet.net/blog/post/71825169 或者看一下Eclipse那篇的發問,也可以找到解答
您好: 照著您的教學想要練習但是找不到要得class.jar C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer..沒有development資料夾 我是用免費版本,是否因此有關係?
新版的Unity,classes.jar移動到 Unity\Application\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes 裡面了
您好: 因為我是程式剛入門沒多久的新手,現在面臨一個問題要怎麼樣把已經包裹好的jar匯入unity(意思是他已經事先做好jar)。 那這樣可以直接讓unity呼叫jar嗎?或者是還有其他方式?還有不懂的地方是class.jar為什麼要事先丟到需要包裹的程式底下呢?
1.是的,不過有特定語法。 2."classes.jar",不是"class.jar",因為Unity提供classes.jar是讓Java和Unity互通的橋樑。
你好: 我想請問AndroidStudio找不到jarRelease選項, 請問該怎麼處理
有正確按照上面的步驟做嗎? 選的位置是否有正確?有先按過重新整理? 如果以上都做過,那就去AndroidBluetooth(root)內看看
你好 我照你的做法做完之後 public class AndroidBluetoothForUnity 下我建立了一個方法 public int call (int a) { a=10; return a; } 那我unity端要如果抓取這傳回的值? instance . CallStatic ( "call" ,0);
好像抓不到
你可以試試去搜尋一下"Android Unity 交互" 使用傳統的方法做 不好意思最近非常忙,沒時間去測試是否能成功
好棒~~感謝大大分享
各位,記得把project setting內的Build setting 裡面的gradle改成internal (錯誤一直找不到的路過...)