Unityで任天堂バランスWiiボードのデータを取れるようになったのでメモです。
VR用の移動系コントローラとして使用予定。
追記:サーバ、クライアント(Unity)のプロジェクト全体をアップロードしました。ライセンスはMs-PL。
使い方は後日。
動画
動作確認した構成:
PC:Windows 10 Home
サーバ:C#(VisualStudio2013)+WiimoteLib1.7
クライアント:Unity5.3.5f
背景:
・MacだとUnityとバランスボードをつなげるアセットが売ってるので楽らしいのですが、Windows非対応。
・よく使われているWiimoteLibというライブラリはUnity上ではうまく動かない 。せっかくC#なのに!※
手法:
・UnityとTCP通信するサーバを立てる。このサーバはWiimoteLibを使ってbalanceboardと通信してセンサ値を取得しており、センサ値をUnityに送信する仲介役。(WiimoteLibのサンプルを改造して、C#で書いた)
・Unityアプリ側はサーバへTCPで接続し、センサデータを受け取る(クライアント)
・Unityアプリの起動時にサーバアプリを起動するようにした、Editor実行時に勝手にサーバも立ち上がってくれるので便利です。
何の情報が取れるか:
いまのところ、Unity側では
・重量
・圧力中心の位置情報
・各センサの生値
・コントローラ番号
の取得が可能です。
その他:
・マルチバランスボード対応です。
・サーバアプリはUnityアプリ(クライアント)から自動起動できます。(デフォルトではバックグラウンド起動しませんが、フラグを立てるとバックグラウンド起動します)
・
参考:
外部アプリケーションを起動して終了まで待機する: .NET Tips: C#, VB.NET
※UnityアプリとBalanceBoard間で直接通信したかったのですが、WiimoteLibはC#向けのLibがあるにもかかわらずUnityでは使えません。(どうもWin32APIあたりのSafeHandlesを中で使ってるのが原因っぽい。動かない。)そこで一段間に別のアプリとしてかませています。
※PC-バランスボード間はBluetoothで接続するため、あらかじめペアリングが必要になります。通常のやり方だとbalanceboardを再起動するたびにペアリングが必要になるので、以下のサイトを参考にしてください。
Wiiリモコン(バランスボード)とWindowsの再接続の話
-----------------
いまのところTCP通信はfloat型の数値をString型で通信してfloat.TryParse()して数値に戻すという無駄なことをやってるのですが、TCPでbinary通信する方法が良く分かりませんでした…(教えて下さると幸いです)
あとTryParseがミスる確率がだいぶ高いのですが、原因が良く分かりません
--------------------
参考リンク:この辺を参考にしています
TCPクライアント・サーバープログラムを作成する: .NET Tips: C#, VB.NET
----------------
追記:リンクのセキュリティアップデートで共有できなくなっていたので再掲しました。