CoreBluetoothForUnity のご紹介

## 本記事について

この記事は CoreBluetoothForUnity Advent Calendar 2023 の1日目の記事です。

https://qiita.com/advent-calendar/2023/core-bluetooth-for-unity

CoreBluetoothForUnity のインストール方法やサンプルの使い方を紹介します。
BLE の知識がなくても、Unity で iOS アプリをビルドできる方であれば、簡単に BLE 通信を試すことができます。

## 前提

- Unity で iOS アプリをビルドできること。

## 環境

- Unity 2022.3以降
- CoreBluetoothForUnity 0.4.0
- iPhone (iOS 13以降)

## CoreBluetoothForUnity とは

Unity には Bluetooth 通信を行うための標準 API がありません。
本パッケージは UnityEditor (OSX) や Unity でビルドした iOS アプリで BLE (Bluetooth Low Energy) を使う機能を提供します。

- [Core Bluetooth](https://developer.apple.com/documentation/corebluetooth) とほとんど同じ API
- OSS

https://github.com/teach310/CoreBluetoothForUnity

## 本パッケージで何ができるのか

- Mac, iPhone 間でシンプルなデータを手軽に送受信
- M5Stack などの BLE デバイスとの通信

UMP でダウンロード可能なサンプルとして、以下の2つを用意しています。
iOS で確認する場合はビルドが必要ですが、UnityEditor であればサンプルをダウンロードしてサンプルシーンを開くだけで通信を試すことができます。

#### Light Control

|Central|Peripheral|
|:--:|:--:|
|<img width="448" alt="lightcontrol_central" src="https://github.com/teach310/CoreBluetoothForUnity/assets/16421323/388281ef-eadd-4433-be35-5ba446f9a34c">|![output](https://github.com/teach310/CoreBluetoothForUnity/assets/16421323/ebbc6bc9-59a3-465e-a2f8-0d6aafab0f20)|


#### Button Information

|Central|Peripheral|
|:--:|:--:|
|![mov_button_information](https://github.com/teach310/CoreBluetoothForUnity/assets/16421323/8b119fda-73c0-44d8-aa53-7690526f88cf)|<img width="660" alt="button_information_peripheral" src="https://github.com/teach310/CoreBluetoothForUnity/assets/16421323/00fb797a-28e2-4337-9846-fae393941f65">|

## Core Bluetooth と API がほとんど同じであるメリット

- 本家のドキュメントを参考にすることが可能
- Core Bluetooth の知見をそのまま活かすことが可能
- 本家 Core Bluetooth の使い方と Unity Package 両方の使い方を学ぶ必要がないこと

## OSS であるメリット

- issue によるバグ報告や機能要望ができること
- 修正の理由や意図を Pull Request や Commit Log から確認できること

## インストール方法

Scoped Registry によるインストールが可能です。

Edit > Project Settings > Package Manager 以下の画像のように登録

```
Name: Teach310
URL: https://registry.npmjs.com
Scope: com.teach310
```

![スクリーンショット 2023-11-08 23.49.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/4e347e51-3f51-cf7c-c14e-26bef731ae0f.png)



Package Manager で My Registries を選択することでパッケージが表示されます。

![スクリーンショット 2023-11-09 0.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/ff24d930-bca7-1461-d415-0c673172f8c0.png)

## サンプルのインポート

Package Manager に Samples のタブが表示されており、そこからインポートできます。
本記事では 01_LightControl を使用します。

![スクリーンショット_2023-11-09_21_35_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/296af326-ae8e-afbf-5d81-adfeec50a586.png)

インポートすると以下のように配置されます。

![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/5bc08d8d-0458-116f-c62f-e0c6753954fc.png)

SampleLightControl_CentralScene を開いて、色を選択できる画面であること
SampleLightControl_PeripheralScene を開いてLightがある3D空間が表示されていれば成功です。

## サンプルのビルド

サンプルを使って UnityEditor (OSX) と iPhone 間で BLE 通信を試します。

以下の手順で進めます。

1. ビルドするシーンを指定
2. Build PostProcess を追加して、Bluetooth を有効にする
3. Build

### 1. ビルドするシーンを指定

どちらでも動きますが、本記事では
色を指定する側 (Central) を iPhone, Light がある側 (Peripheral) を UnityEditor (OSX) で動かすことにします。

上部メニューの File > Build Settings を選択します。

まずは iOS にスイッチプラットフォーム。
そして、SampleLightControl_CentralScene を追加します。

![build_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/ff67f588-63a3-5633-a0c6-a50325a2d5d9.png)

### 2. Build PostProcess を追加して、Bluetooth を有効にする

iPhone で BLE を使うには、Info.plist に Bluetooth の許可を追加する必要があります。

>  To access Core Bluetooth APIs on apps linked on or after iOS 13, include the NSBluetoothAlwaysUsageDescription key

[Core Bluetooth Overview](https://developer.apple.com/documentation/corebluetooth)

Unity でビルドする場合は、Build PostProcess で Info.plist を書き換えることができます。

そして、それを行うためのスクリプトはサンプルに用意してあります。
Package Manager を開き、Samples の BuildPostprocessor をインポートします。

![postprocess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/c35ba2dd-55c1-80a3-9b44-27a5123da5f9.png)

### 3. Build

あとは通常の iOS ビルドと同じです。

初めてビルドする場合は以下のように許可を求められます。

![ble.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/d69ac3d9-5f58-983f-58d1-ab97ed12cc94.png)

これで準備完了です。

Mac と iPhone それぞれ Bluetooth を ON にしたうえで、iPhone　はアプリを起動、 UnityEditor では SampleLightControl_PeripheralScene を再生してください。

画面右上に Ready と表示されたら、バーを動かすことで Light の色が変わるはずです。

![central.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/ef3bbbff-19c4-aea5-af51-d296978d4e85.png)

## おわりに

本記事では CoreBluetoothForUnity の特徴、Light Control サンプルの使い方を紹介しました。
サンプルさえ動かすことができれば、あとは中身の実装を学ぶことで応用することが可能です。
アドベントカレンダー2日目以降の記事ではサンプルの中身や実装のポイント等について書いていきますのでよろしくお願いします！