5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-14

この記事について

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

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

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

動機

その前に・・・

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

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

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

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

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

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

で、せっかく作ったので公式側に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化していくという流れを取りました。

こちらは、単体アプリでのテストの様子です。

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アダプターで動いちゃってました。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?