toio SDK for UnityのAndroid対応 ～ないなら作ればいいじゃない ～

# この記事について
<a href="https://morikatron.com/t4u/" target="_blank">toio SDK for Unity</a>は、現在iOSもしくはWebGLのみの対応です。
Android版も対応の予定はあるという事でしたが…、何となく時間が掛かりそうな雰囲気がしました(直感)。

→ならば作っちゃえばいいじゃないという事で本記事です。
ちなみにコチラで対応中です。
https://github.com/wotakuro/toio-sdk-for-unity


# なぜ作るのか？

下記のアプリをせっかく作ったので、配布してみたいと思っているのですが、iOSだと作ったアプリの配布が手軽にできません…。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%83%9C%E3%83%88%E3%83%AB%E3%83%9E%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#ボトルマン</a> と <a href="https://twitter.com/hashtag/toio?src=hash&amp;ref_src=twsrc%5Etfw">#toio</a> を組み合わせたら面白い遊びになりました。<br>専用のアプリを <a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> で作成しています。<br>toio SDK for Unityを利用して、自動で的のtoioが動くようにプログラミングしています。<br><br>↓Youtubeにも動画あげました。<a href="https://t.co/SpKqpJAkhV">https://t.co/SpKqpJAkhV</a> <a href="https://t.co/XqCWQ8LZyE">pic.twitter.com/XqCWQ8LZyE</a></p>&mdash; 黒河優介(YusukeKurokawa) (@wotakuro) <a href="https://twitter.com/wotakuro/status/1330674242946433025?ref_src=twsrc%5Etfw">November 23, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

一応、<a href="https://github.com/wotakuro/toio_and_bm_project" target="_blank"> Unityプロジェクトを公開</a>しているのですが…「自前でビルドして試してくださいね」はあまりに敷居が高いです。
配布したいとなった時は、Androidでapkを適当に配る感じにしたかったのです…。なのでAndroid対応が欲しくなりました。

あと他にも下記の理由があります。
・1.私はiOSの端末がipadしかもっておらず、携帯はAndroidなのでちょっと不便なことがある
・2.iOSはUnity→XCodeの二段階ビルドが必要で、ビルドが毎回面倒すぎる！

# 作る過程
## １： まずはAndrodのネイティブアプリを作り、検証
Javaプログラムで書いてました。まずはJava側で動いてから、Unity側に移植するフローです。Javaで最初にやったのはイテレーション速度上げるためです。ネイティブアプリのJavaでtoioの検出・接続・モーターの制御・データ読み取り等が出来たので、次に進みます。
## ２：Unity側のネイティブプラグインへ移植
C#からJavaをAndroidJNIでゴリゴリ呼び出すことで実装しました。ここではUnity側でtoioのモーター回す事などをゴールにします。AndroidJNI、久々に書いたので最初チョット苦戦しました。
## ３： toio SDK for Unity側のBLE低レイヤークラスのインターフェースと同じ別クラスを実装
toio SDK for Unityは、BLE低レイヤーのクラスが用意されていたので、それと同じインターフェースの別クラスを用意します。
Androidの時はコチラに流せばよいだけという風にすればよいだけという算段です。
この時、iOS側の実装がネイティブプラグインからのコールバックをする作りになっていました。JavaからC#を直接呼ぶのはチョット難しかったので、代わりにポーリングしてコールバックを疑似実装することにしました（←今ここ）

BLEの低レイヤーを対応することで、通信の種類が増えたとかも何もしないで対応できるようにする所を目指しております。

# 今ここ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">toio SDK for Unity のAndroid 対応中ー<br>SDKのAPIと互換性はないけど、Android からtoio 動かす所はいった <a href="https://t.co/RkO2EQaHnQ">pic.twitter.com/RkO2EQaHnQ</a></p>&mdash; 黒河優介(YusukeKurokawa) (@wotakuro) <a href="https://twitter.com/wotakuro/status/1341380863041228802?ref_src=twsrc%5Etfw">December 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Unityでtoioのスキャン・接続・書き込みが出来はしました。ちなみに端末はGalaxy S8です。

残りの作業は、toio SDK に自分の処理を乗せるだけ！

https://github.com/wotakuro/toio-sdk-for-unity/blob/main/toio-sdk-unity/Assets/ble-plugin-unity/Plugins/iOS/Ble.cs#L316-L318
別クラスに流す所も書きました。
あとは 流した先の<a href="https://github.com/wotakuro/toio-sdk-for-unity/blob/main/toio-sdk-unity/Assets/ble-plugin-unity/Plugins/Android/Runtime/BleAndroid.cs" target="_blank" >BleAndroidクラス</a>を作っていくだけ！

ある程度イイ感じになったら公式にPull Request投げたいと思っています。

本当は、このアドカレ投稿時に、動いています（キリっ）と言いたかったのですが…、ちょっと間に合わなさそうです…。
年内に目途付くと良いなぁって思っています。

# おまけ
Q：ネイティブプラグイン部分… AssetStore使わないの？フルスクラッチで書いたの？何で？？？
A:Bluetooth Low Energyの勉強したかったのと、フルスクラッチで書けばソースも公開できるじゃないですか。
そんなに、複雑なコードでもないですし

# その後…

Android対応して、本家にPull Request 出してみました
https://github.com/morikatron/toio-sdk-for-unity/pull/153

(さらにその後…)どうやらMergeされたみたいです！！
そのうち本家にも対応きそうです