HoloLens2でJoyConのIMUを使ってみたかった(失敗)
今回はNintendo SwitchのJoyConをHoloLensで使用できるか試します。
使用できれば、加速度、ジャイロセンサを用いて何かしらできそうです。
※今回の記事はHoloLens上で正しく動作できていません。後々解決策がわかったら記事にします。
JoyConをUnityで取り扱う方法については下記を参考に実施します。
前提
今回は下記環境で検証しています。
MRTKのインポートなどの設定は今回は省略し、JoyconLibの導入から始めます。
Unity 2019.4.17
MRTK 2.7.2
JoyconLib 0.6
準備
まずはJoyconLibのUnityPackageを下記からダウンロードします。
ダウンロードしたUnityPackageをUnity上にドラッグ&ドロップすると、Unity Packageのインポートができます。
右下の「Import」ボタンを押下するとインポートできます。
※ Sceneフォルダに警告が出ていますが、特に問題ないので無視でよいです。
正常にインポートができると、JoyconLib由来のファイルがAssetsフォルダ上に配置されます。
そのままだとエラーが発生するため、参考元の記事の通り、一部ソースコードを修正します。
- Joycon.cs L370
変更前:
DebugPrint(string.Format("Dequeue. Queue length: {0:d}. Packet ID: {1:X2}. Timestamp: {2:X2}. Lag to dequeue: {3:s}. Lag between packets (expect 15ms): {4:s}",
変更後:
DebugPrint(string.Format("Dequeue. Queue length: {0:d}. Packet ID: {1:X2}. Timestamp: {2:X2}. Lag to dequeue: {3:t}. Lag between packets (expect 15ms): {4:g}",
Scenes/Scene1
を選択すると、JoyconLabのサンプルが確認できます。
これを左上メニューのFile/Save As...
から複製して保存します。
複製したSceneをHoloLens用に構成します。
左上メニューのMixed Reality/Add to Scene and Configure...
からMRTK用に構成します。
そのままだとJoyConの動きを示すCubeが頭の位置に来てしまうため、微調整します。
Scene上にTextを配置して、ジャイロと加速度の状態を確認できるようにします。
TextMeshProを適当な位置に配置して、JoyconManagerにShowJoyConState.cs (下記ソース参照)をアタッチし、TextMeshProを参照させます。
- ShowJoyConState.cs
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class ShowJoyConState : MonoBehaviour { private List<Joycon> joycons; [SerializeField] private TextMeshPro text; // Start is called before the first frame update void Start() { this.joycons = JoyconManager.Instance.j; } // Update is called once per frame void Update() { ShowState(); } private void ShowState() { string info = ""; foreach(var joycon in this.joycons) { info += "#########\n"; info += (joycon.isLeft) ? ("[Left]\n") : ("[Right]\n"); info += $"Accel:\n"; info += $"x:{joycon.GetAccel().x}\n y:{joycon.GetAccel().y}\n z:{joycon.GetAccel().z}\n"; info += $"Gyro:\n"; info += $"x:{joycon.GetGyro().x}\n y:{joycon.GetGyro().y}\n z:{joycon.GetGyro().z}\n"; info += "#########\n"; } this.text.SetText(info); } }
ProjectSettins/Player
のCapabilitiesからBlueToothにチェックを入れておきます。
BuildSettingsからビルド対象シーンに今のシーンを追加し、Buildボタンを押します。
次にHoloLens側でBluetoothを用いてJoyconを接続します。
設定/Bluetoothとその他のデバイスからBluetoothまたはその他のデバイスを追加する
を選択します。
追加するデバイス種として、Bluetooth
を選択します。
Joyconの丸いボタンを長押ししペアリングモードにすると、JoyConが一覧に表示されます。選択すると、HoloLensとJoyConをBluetooth接続できます。
動作確認
HoloLens側でアプリ起動しましたが、JoyConの加速度、ジャイロのデータを取得することはできませんでした。
Unity上では動作確認できているため、HoloLens特有の問題のようです。
アプリのログを見たところ、使用しているdllが読み込めていないようです。
- UnityPlayer.log
DllNotFoundException: Unable to load DLL 'hidapi': The specified module could not be found. at JoyconManager.Awake () [0x00000] in <00000000000000000000000000000000>:0 (Filename: currently not available on il2cpp Line: -1)
該当のプラグインの格納場所を見ると、win32, win64, mac用のプラグインしかなく、arm, arm64用のプラグインが入っていないようです。
hidapiのarm用プラグインがあれば、動作しそうです。
うまくいってはいないですが、今回はここまで。
hidapiのarm版が見つかったら再度チャレンジしてみます。