先週BitSummitに行ってきました。ゲームの制作意欲がぐんぐん上がってくる素晴らしい祭りでした。
BitSummit
ああいうのを見ると、携帯アプリではなくゲームパッドを使ったがっつりしたゲームが作りたくなってきます。
というわけで今回は、Unityで作成したゲームのゲームパッドを振動させる方法についてお話ししたいと思います。
2021.11.4 追記
新しいInputSystemを使うことで簡単にゲームパッドを振動できるようになりました。
www.urablog.xyz
- 概要
- Google検索で方法を調べる
- Handheld.Vibrate()について
- Unity側にゲームパッドを振動させる機能はない でも方法はある
- XInputDotNetを使ってみる
- XInputとDirectInput
概要
Unityで接続されているゲームパッドを振動させますよ。
ちなみに私の手元にあるのはXbox360 ワイヤレスコントローラーとPS4コントローラーです。
両方とも振動できるようになればいいなぁ。
Google検索で方法を調べる
さて、というわけで振動させる方法を探してみましょう。
とりあえずググります。えーと、「Unity 振動」っと。
出てきました、出てきました。
Handheld.Vibrate()
というものが出てきました。
意外と簡単に振動できそうですね。
Handheld.Vibrate()について
Handheld.Vibrate()
という振動させてくれる関数が用意されているようです。
さすがUnityさんですね。
さっそく使ってみましょう。
……。
……。
…………(#^ω^)ビキビキ。
振動しねぇ!
さすがUnityさんですね。
おかしいな。いくつかの他のサイトで使用したという情報が転がっていたのですが。
ちゃんとAndroidで振動したと……。
……。
Androidでビルドしてみましょう。
……振動しましたね。
どうやらHandheld.Vibrate()
は携帯端末を振動させる機能であって、ゲームパッドを振動させる機能ではないようですね。
もう一度振動させる方法を探してみましょう。
Unity側にゲームパッドを振動させる機能はない でも方法はある
うーん、探してみましたが、Unity側にゲームパッドを振動させる機能はないようですね。
でも確かUnityで作られたゲームでゲームパッドが振動するものがあったような気がするのですが……。
更に探してみたところ、こんなものを見つけましたよ。
XInputDotNet。
XInputDotNetを使ってみる
GitHubにXInputDotNetというライブラリが公開されていました。
世の中にはお優しい人もいるものです。
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コントローラーでもちゃんと振動するようになりました。
しかし、予想以上にやることが多かったですね。
いずれはゲームパッドの振動を使うようなゲームを作りたいなー。
ご参考になればと思います。