うら干物書き

ゲームを作っています。

Unityでゲームパッドを振動させてみる

 こんにちは、うら干物です。

 先週BitSummitに行ってきました。ゲームの制作意欲がぐんぐん上がってくる素晴らしい祭りでした。

 BitSummit

 ああいうのを見ると、携帯アプリではなくゲームパッドを使ったがっつりしたゲームが作りたくなってきます。

 というわけで今回は、Unityで作成したゲームのゲームパッドを振動させる方法についてお話ししたいと思います。


概要

 Unityで接続されているゲームパッドを振動させますよ。

 ちなみに私の手元にあるのはXbox360 ワイヤレスコントローラーPS4コントローラーです。

 両方とも振動できるようになればいいなぁ。

Google検索で方法を調べる

 さて、というわけで振動させる方法を探してみましょう。

 とりあえずググります。えーと、「Unity 振動」っと。 f:id:urahimono:20160718202938p:plain

 出てきました、出てきました。

 Handheld.Vibrate()というものが出てきました。

 意外と簡単に振動できそうですね。

Handheld.Vibrate()について

 Handheld.Vibrate()という振動させてくれる関数が用意されているようです。

 さすがUnityさんですね。

docs.unity3d.com

 さっそく使ってみましょう。

 ……。

 ……。

 …………(#^ω^)ビキビキ。

 振動しねぇ!

 さすがUnityさんですね。

 おかしいな。いくつかの他のサイトで使用したという情報が転がっていたのですが。

 ちゃんとAndroidで振動したと……。

 ……。

 Androidでビルドしてみましょう。

 ……振動しましたね。

 どうやらHandheld.Vibrate()は携帯端末を振動させる機能であって、ゲームパッドを振動させる機能ではないようですね。

 もう一度振動させる方法を探してみましょう。

Unity側にゲームパッドを振動させる機能はない でも方法はある

 うーん、探してみましたが、Unity側にゲームパッドを振動させる機能はないようですね。

 でも確かUnityで作られたゲームでゲームパッドが振動するものがあったような気がするのですが……。

 更に探してみたところ、こんなものを見つけましたよ。

 XInputDotNet

XInputDotNetを使ってみる

 GitHubにXInputDotNetというライブラリが公開されていました。

github.com

 世の中にはお優しい人もいるものです。

 Unity用のプロジェクトをそのまま公開されていますので、簡単に設定できました。

public void PlayVibration( bool i_enabled )

{

    float motorPower = i_enabled ? 1.0f : 0.0f;

    XInputDotNetPure.GamePad.SetVibration( 0, motorPower, motorPower );

}

 おおっ、振動します振動します。

 左右の振動を別々で設定できるのが楽しいですね。

 ただXboxコントローラーでは振動しますが、PS4コントローラーでは振動しません。

 うーん、少なくともPS4コントローラーには振動機能があるはずなのに、おかしいですね。

XInputとDirectInput

 調べたところコントローラーの入力方式にはXInputとDirectInputというものがあるみたいです。

 この件については後日調べてみましょう。

 XInputDotNetはその名の通り、XInput形式に対応したゲームパッドの制御をサポートしています。

 DirectInput形式にしか対応していないゲームパッドでは対応できないみたいです。

 探したところ、DS4 To XInput Wrapperを使うことでXInput形式に対応していないゲームパッドでもXInput形式に入力が取れるようです。

 以下のサイトを参考に使ってみたところ、PS4コントローラーでもちゃんと振動するようになりました。

 PS4コントローラをPCで使う方法

 しかし、予想以上にやることが多かったですね。

 いずれはゲームパッドの振動を使うようなゲームを作りたいなー。

 ご参考になればと思います。