- iOS & macOS Unity Bluetooth Native Plugin
- Generate Xcode projects by UnityPluginXcodeTemplate
- xcode11+
- Unity 2018+
- xcodegen
- rust (if change script)
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>UnityエディタとiOSで動くBluetoothのプラグイン作った#unity pic.twitter.com/EeHz0iqcmL
— ふじき (@fzkqi) September 24, 2019
UnityにはBluetoothで通信する機能がないです。 iOSでdaydreamのコントローラを使いたかったので、プラグインを自作しました。 Unity Editorにも対応しており、editorで実際に接続して実装して、実機は動作確認だけという開発が可能です。
- Unity Packageを配布しています。
Daydreamのコントローラの生データを取得します
下記の条件のcharacteristicに接続すると、コントローラの生データを取得可能です。 BLEデバイスは複数のserviceを持っており、serviceは複数のcharacteristicを持っています。characteristicごとに決められた機能が提供されており、今回はcharacteristic uuidは同名のidが複数存在するので、notifyのusageのcharacteristicを使って生データを受け取ります。
項目 | 接続する端末の条件 |
---|---|
デバイス名 | Daydream controller |
service uuid | FE55 |
characteristic usage | notify |
UnityCoreBluetoothはシングルトンで使用します。 bluetooth機能がpowerOnになったら、BLEデバイスのスキャンを開始させます。 コールバックの設定が全て終了したら、StartCoreBluetoothを呼び出して開始します。
UnityCoreBluetooth.CreateSharedInstance();
UnityCoreBluetooth.Shared.OnUpdateState((string state) =>
{
Debug.Log("state: " + state);
if (state != "poweredOn") return;
UnityCoreBluetooth.Shared.StartScan();
});
//~~中略~~
UnityCoreBluetooth.Shared.StartCoreBluetooth();
UnityCoreBluetooth.Shared.OnDiscoverPeripheral((UnityCBPeripheral peripheral) =>
{
if (peripheral.name != "")
Debug.Log("discover peripheral name: " + peripheral.name);
if (peripheral.name != "Daydream controller") return;
UnityCoreBluetooth.Shared.StopScan();
UnityCoreBluetooth.Shared.Connect(peripheral);
});
UnityCoreBluetooth.Shared.OnConnectPeripheral((UnityCBPeripheral peripheral) =>
{
Debug.Log("connected peripheral name: " + peripheral.name);
peripheral.discoverServices();
});
UnityCoreBluetooth.Shared.OnDiscoverService((UnityCBService service) =>
{
Debug.Log("discover service uuid: " + service.uuid);
if (service.uuid != "FE55") return;
service.discoverCharacteristics();
});
通知を有効にすることで、daydreamコントローラから連続して生データを受け取ることが可能になります。
UnityCoreBluetooth.Shared.OnDiscoverCharacteristic((UnityCBCharacteristic characteristic) =>
{
string uuid = characteristic.uuid;
string usage = characteristic.propertis[0];
Debug.Log("discover characteristic uuid: " + uuid + ", usage: " + usage);
if (usage != "notify") return;
characteristic.setNotifyValue(true);
});
※ リアルタイムで受け取れるのですが、メインスレッド保証ではないです。
UnityCoreBluetooth.Shared.OnUpdateValue((UnityCBCharacteristic characteristic, byte[] data) =>
{
this.value = data;
this.flag = true;
});
void OnDestroy()
{
UnityCoreBluetooth.ReleaseSharedInstance();
}