少し前までUnityでのネット対戦を実装しようとしていたけれど、維持費0での実現が難しそうなのでBluetoothでの接続を試してみることにした。
いつも通り知識0から始めてるけど今までで一番よくわからない。
とりあえずやったことのメモ(トライ&エラーなのでダラダラ長いです)。
ただでさえ用語とAPIが理解しにくいのに、非同期処理の重ね合わせで実装の難易度が高いらしいのでライブラリを使わせてもらうことにした。
これを選んだ理由は検索で一番スターが多かった(Java&説明が英語)からです。
Android Studioで新規モジュールを作成して、gradleを編集する。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { ... provided fileTree(dir: 'libs', include: ['*.jar']) compile 'com.polidea.rxandroidble:rxandroidble:1.4.3' ... } |
Java1.8を使用しているのはサンプルのラムダ式をそのまま使うためです。
適当なサンプルプログラムを書いてaarを作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Util { Activity activity; Context context; RxBleClient rxBleClient; public String Init() { activity = UnityPlayer.currentActivity; context = activity.getApplicationContext(); rxBleClient = RxBleClient.create(context); //Turning the bluetooth on / off Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); int REQUEST_ENABLE_BT = 1; activity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); return "success init."; } } |
Unity の Assets/Plugins/Android にAndroidManifest.xmlと一緒に配置します。
マニュフェストにはBluetoothの一般利用、発見(ADMINが必要)とAndroid 6以降では位置情報が必要です。
1 2 3 |
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> |
ビルドしてみると以下のエラーが出た。
CommandInvokationFailure: Unable to convert classes into dex format.
[中略] PARSE ERROR: unsupported class file version 52.0 [後略]
バージョン違いが原因みたい。
OracleからJava最新バージョンをインストール。
UnityでEditタブ下のPreferences…をクリックして、External Tools でJDKを設定。
これでもダメだったので次にSDK ManagerでAndroid SDKの方を更新する。
次のようなエラーがあったけど、エラー内容でググりながら解決。
Download finished with wrong size. (checksum)
・Tools > Options を開く
・「Force https sources to be downloaded using http」にチェック
・Clear Cache
・Packages > Reload してやり直す。
Failed to rename directory
ウイルス対策ソフトを切ってみたが無理だった 。
「管理者として実行」するとプログレスバーは停止したけど裏で完了してた。
ここまでしてるとエラー内容が変わってた。
Uncaught translation error: com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires –min-sdk-version >= 26)
そもそもUnityだと25までしか選択できないみたいなのに。
そういえば、さっき更新したUnityのAndroid SDK は色々と古かった。
昔のSDK managerが分かれているやつで参照していたので、 Android Studioに統合されたSDKを参照するようにした( Tools>Android>SDK Manager で場所がわかる )。
他にもGradle関連で色々いじったり(build.gradleにオプション追加、 Unityのgradleバージョン変更・テンプレート変更)したけど効果なし。
とりあえず同じ悩みのスレッドをウォッチに入れておくぐらいでした。
暫定策として'me.tatarka.retrolambda'
を使わせてもらうことにした。
とりあえずこれでビルドは成功。
次の問題は NoClassDefFoundError 例外。
RxBleClientがないらしく、調べてみると arr の Classes に含まれていない。
compile, implementation, provided等を試してみたけど、aarの中身に変化がない。
考えてもみれば 'com.android.library'
で依存ライブラリを含める使い方は通常しないのか。
しかたないので依存性のあるjar/aarを7つ同封した。
ようやくスタートラインに立てました。