CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

【2014/3/9更新】PSMoveをMacで制御する方法とTips紹介

次のOcufesに間に合うかわかりませんが、次回はFPSでの戦闘ゲームを作りたいと思ってます。スパイダーマンもどきで作ったフックショットの移動方法をもう少し活用してみたくなった、というのもあります。

そうすると、さすがにキーボードとマウスでは限界があるので、そろそろ操作デバイスを試そうと思い、PlayStation Move(PSMove)とUnityを連携してみました。

動作確認条件

  • Mac(MountainLion)
  • Unity4.2.1f4

[2014/3/9追記]
Mac(Marvericks)とUnity(4.3.4f1)でも動きました。

1. macとPSmoveを接続する手順

1-1. Bluetooth接続用のプログラムを入手

macのbluetooth接続設定では、デバイス名が表示されませんでした。そこで、下記より入手したライブラリの一部を使います。

PS Move API (thp.io)

1-2. PSMoveをUSBでMBAと接続し、psmovepairプログラムを実行

  # ./psmoveapi_3.0.0/bin/psmovepair 

1-3. Xボタンを押す、などいくつかの指示が出るため、指示通りに操作

ここまでうまく進めば、PSMoveがペアリングします。

[1の補足]

  • ペアリング成功後はUSBを外してもOK
  • PSMoveはPCとのUSB接続であれば充電を継続しているように見える。スマホ用のACアダプタでは充電できなかった
  • 通常のペアリング設定と異なり、PCの再起動毎にこのプログラムによるペアリング設定が必要

2. PSMoveをUnityと連携する手順

2-2. 入手したUnityPackageをダブルクリック(Unity上でImportでも可)

HPの説明では、ここに入っているSceneを選択すれば何かが体験できるようですが、Sceneを開いても何も入っていませんでした。

2-3. PSMoveの簡易動作確認を実施

適当に空のオブジェクトを作ってから、先ほど入手したUniMoveTest.csをドラッグします。

3. 動作確認

PSmoveとUnityプロジェクトが連携し、ボタンを押すとLEDが変わることが確認できました。

UniMoveでPS Moveを制御した例

別のボタンを押せばこのように別の色になります。

UniMoveでPS Moveを制御して色を変えた例
(写真なので、実際とはちょっと色が異なってます)

色については、実際に変わるかは未確認ですがRGBを細かく指定できるようです。

RGBの指定はUniMoveController.csにありました。

//UniMoveController.csの一部
/// <summary>
/// Sets the LED color
/// </summary>
/// <param name="r">Red value of the LED color (0-255)</param>
/// <param name="g">Green value of the LED color (0-255)</param>
/// <param name="b">Blue value of the LED color (0-255)</param>
    public void SetLED(byte r, byte g, byte b)
    {
		if (disconnected) return;
		
		psmove_set_leds(handle, (char)r, (char)g, (char)b);
    }

また、psmove_set_ledsは、

	[DllImport("libpsmoveapi")]
	private static extern void psmove_set_leds(IntPtr move, char r, char g, char b);

とあるので、ライブラリ関数ですね。


4. トラブル対応

2013/11/2 追記しました

PSMoveのペアリングについて、別の日に試すと(Macをスリープした後)Unityでうまく認識しないことがありました。元の記事を見たときは、Mac再起動時に再設定が必要とあったのですが、他の場合でも再設定しなければならないようです。

[症状]
● # ./psmoveapi_3.0.0/bin/psmovepair を実行すると、エラーメッセージは出ない
●MacでもPSMoveがBluetoothデバイス一覧に表示されている。
●しかしUnity上のプロジェクトから実行すると認識しない

[解決方法]
1. Unityが開いていたら閉じる
2. システム環境設定->BluetoothからMothin Controllerのデバイス情報を削除する
3. # ./psmoveapi_3.0.0/bin/psmovepair を実行する
4. Unityを起動

これで今度はPSMoveがUnityでも認識するようになりました。

5. 終わりに

調べてみると、光の制御だけでなく、ボタン、バイブレーションも使えました。思った以上に色々使えそうな気配です。

魔法とか、ガンアクションとか、夢が膨らんできますね。