toio SDK for UnityのWindows対応をした時の話

# この記事について
toio SDK for UnityのWindows対応をするべく、Pull Requestを出させていただきました。

https://github.com/morikatron/toio-sdk-for-unity/pull/229

https://github.com/toio/ble-plugin-unity/pull/8

まずは、内容チェック等、様々な事にご対応された関係者の方々ありがとうございます。

本記事ですが…
なぜそんな事をやろうと思ったのか？作業の経過等に触れつつ…。
その際に得た知見周りの話などを記載できればと思っています。

# 動機

## その前に・・・
実は昨年には toio SDK for UnityのAndroid対応を行っていて…。

https://qiita.com/wotakuro/items/4067664c0d2b3aaa2c0c

それをPull Requestして、インタビューも受けてしまいました。

https://toio.io/blog/detail/20210224-1.html

その節もどうもありがとうございました。

そんなこんなでtoio SDK for UnityはAndroid対応になり、「これで自分の作っているAndroidアプリが配れるようになるし、AndroidだからMonoビルドにして少し効率的に開発出来るようになるぞ！やったー」
と思ってたんです…。
ただWindowsのUnityEditor上で直接toioにつなぐことができれば、もっと楽にコンテンツを作成できるのに…というのも思っておりました。

そんなこんなを思いながら、toio SDK for Unityのバージョン1.3ではMacOSでは出来るようになっていました。

https://toio.io/blog/detail/20210729-1.html

ぐぬぬぬぬ。Mac環境だとちょっと困るので…
Windows環境で同じことをしたいんだお…　→　せや作ればいいか…
という事で Windows版の対応を作りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">toio SDK for Unity、プライベート時間でゴニョゴニョと勝手にWindows対応してみてます。<br><br>こんな感じでEditor上から直接出来るようになりそうなんで、ビルドして書き出さなくてよくなります。<br><br>開発環境として、かなり良くなりそうですね。 <a href="https://t.co/zlh7bqzJaZ">pic.twitter.com/zlh7bqzJaZ</a></p>&mdash; 黒河優介(YusukeKurokawa) (@wotakuro) <a href="https://twitter.com/wotakuro/status/1445434880309923847?ref_src=twsrc%5Etfw">October 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

で、せっかく作ったので公式側にPull Requestもすることにしました。
というのがことのあらましになります。

# Windows でのBLE実装について…
toioはBluetooth LowEnergy（BLE)というプロトコルでデータをやり取りすることで動作します。
Unity上で、toioと通信するためには、WindowsでBLE通信をするネイティブプラグインを作る必要があります。

## まずは調査
いきなりプラグインを作るのではなく、そもそもどうしたら良いのか…を調査・実装・検証をする必要があります。
WindowsのBLE通信ネット上で色々と調べていた所、UWPならば行けそうという情報を得ました。

そして、なんとMicrosoftさんが公式でUWPのサンプルをC++とC#のどちらも出されていました。
https://github.com/microsoft/windows-universal-samples/tree/main/Samples/BluetoothLE

サンプルそのまま動かしたら割とそのまま toioと接続できてました。これはめちゃくちゃ参考になりました。
ただデバイスのスキャンする時に、自分の欲しかったServiceUUID(10B20100-5B3B-4571-9508-CF3EFCD7BBAE)で検索したデバイスだけ列挙するという処理はサンプル側の方法でできなさそうなので、色々と調べました…。

調べましたと言ってもMicrosoftさんのドキュメント見てそれっぽいクラスとかがないか見てみて試すだけです…
https://docs.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.advertisement?view=winrt-22000

そしたら行けそうでした。

あとはC#で行くかC++で行くか・・・というところですが・・
C#のUWPのコードを混ぜるとトラブルになるのは目に見えていたので…最初からC++のプラグイン作ろうと決めていました。

## 次に簡易的な単体アプリでテスト
そして・・・色々と決まったので…プラグインを実装していくだけや…となるのですが…
実はいきなりプラグインの実装をしていません。
まずはC++の単体アプリで動くようにして、それをPlugin化していくという流れを取りました。

こちらは、単体アプリでのテストの様子です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">toioをWindowsのコンソールから動かしています <a href="https://t.co/kRAwAPR8ef">pic.twitter.com/kRAwAPR8ef</a></p>&mdash; 黒河優介(YusukeKurokawa) (@wotakuro) <a href="https://twitter.com/wotakuro/status/1434912671522975744?ref_src=twsrc%5Etfw">September 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

1クッション挟んでの作業ですが、これには理由があります。
バグった時にC++側なのか？Unity側にした実装の問題なのか？はたまたC++とC#をつなぐ所の問題なのか…と問題が複雑になってしまうので…
C++側だけは問題なしの状況にすることで、後のバグ調査の手間を減らそうという意図がありました。
C++実装中にもC++内部でのバグに色々と悩まされたので、結果としてはこの作戦は成功でした。

ちなみに、いまでもNativePluginを作るプロジェクトは、デバッグビルドでは単品アプリ、リリースビルドではDLLがつくられるように設定しています。
https://github.com/toio/ble-plugin-unity/tree/main/bleplugin_projects/Windows

Debugビルドのときのみ下記Mainを通るようにしていて、それでバグったときのテストにも役立ちました
https://github.com/toio/ble-plugin-unity/blob/main/bleplugin_projects/Windows/BlePluginWin/bleTestConsole.cpp


という感じでなんかやってたら toio SDK for UnityのWindows対応できました。
toioをお持ちの皆さんも触ってみてくださいー。
ノートPCなら多くがBLE対応していると思いますし、DesktopでもUSBアダプターで動くと思います。
私もデスクトップPCメインで開発していて…家に転がってたBluetoothのUSBアダプターで動いちゃってました。