ひつじTips

技術系いろいろつまみ食います。

「toio SDK for Unity」でシミュレータとしてビルドする方法

「ロボットやろうぜ!- toio & Unity 作品動画コンテスト -」というのにアプリを出したのですが,それで「toio SDK for Unity」を触ったのでTipsとか書くシリーズ第三弾です.

コンテストに出したアプリについてはこちら: mu-777.hatenablog.com

コードのレポジトリはこちら: github.com

で,せっかくなので誰でもこのアプリを動かせるようにしようとこのコンテストで作ったアプリはWebGLアプリにして公開しています!:
(自分でもそのうち動かせなくなりそうですしね...)

mu-777.github.io

ただ,これをするために地味にハマったのでメモとして書いておきます.

背景

「toio SDK for Unity」のめちゃくちゃよくできている素晴らしいところなのですが,シミュレータとして動かす場合と実機で動かす場合が完全に同一コードになっています.

つまり,UnityEditorで実行すればシミュレータとして機能し,それをビルドするだけでtoio実機にアプライできるようになっていて,その差を感じさせません(まぁ実機を持っていないので,自分で確かめたわけではないのですがw)

ただし,それはシミュレータとしてビルドさせることができない,ということを意味します.具体的には,ビルドしたアプリをtoio実機のない環境で実行すると,Bluetoothの接続周りのエラー(Uncaught ReferenceError: bluetooth_requestDevice is not defined)で動かなくなります.

f:id:mu-777:20210131154222p:plain
Bluetoothの接続周りのエラー

が,これは完全に正しい挙動です.だってtoio実機がないんだもの.接続できなくて当然です.

でも今回はシミュレータとしてWebGLビルドしてwebに公開できるようにしたかったので,SDKにちょこっと手を入れて,シミュレータとしてビルドできるようにしました.

やりかた

結構ゴリ押しのパワープレイでやりました💪💪

コードを簡単に見る限り,シミュレータとしての挙動・実機ありとしての挙動 を振り分けてるのはDefineのシンボルの設定のようだったので,そこに手を入れていきます.

方針としては,SDK内で#if UNITY_EDITORで処理が切り分けられているところを#if UNITY_EDITOR || SIMULATOR_ONLYと変更する,という感じです.

これで,Editor実行でなくてもSIMULATOR_ONLYさえ定義されていればEditor実行時と同じ処理を走るようになるはずです.

具体的には,

  1. #if UNITY_EDITOR#if UNITY_EDITOR || SIMULATOR_ONLYに変更する
    • 以下の3ファイルを編集しました
      • Assets/toio-sdk/Scripts/Cube/CubeConnecter.cs
      • Assets/toio-sdk/Scripts/Cube/Scanner/NearScanner.cs
      • Assets/toio-sdk/Scripts/Simulator/CubeSimulator.cs
    • 実際に入れた変更点はこのコミット差分を参考にしてください: github.com
    • (もしかしたら不要な変更も入ってるかもしれません)
  2. SIMULATOR_ONLYシンボルを有効にする
    • これはなんでもいいですが,Unityの機能(ScriptingDefineSymbols)を利用するのがラクかなと思います
    • 具体的には,PlayerSettings > Other Settings より,「Scripting Define Symbols」の項目に「SIMULATOR_ONLY」を入れます f:id:mu-777:20210118022653p:plain
    • (詳細はプラットフォーム依存コンパイルの「プラットフォームのカスタム #defines」項を参考にすること)

この状態でビルドしたアプリを実行しても,上述のようなtoio実機に接続できないエラーは出なくなり,Editor実行時のように動かせるアプリができます!

まとめ

あんまり皆さんの役に立つようなTipsかは微妙で,自分がtoio SDKの変な使い方をしてる気がしてます.

が,自分で作ったものを他の人が想定外の使い方をしてくるのって個人的にはすごく嬉しいので,toio SDK for Unity作った人に届け!という気持ちも込めて書いておきます.