徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

【Unity】 ゲームパッドを振動させる

ゲームパッドを振動させるお話。
昔同じような記事を書いたのですが、新しい Input System を使えばもっと簡単にできます。
f:id:urahimono:20211103225158p:plain


この記事にはUnity2020.3.21f1を使用しています。
.Netのバージョン設定には.Net4.x を使用しています。

最近でこそ再び記事を書き始めましたが、数年ほどこのブログが更新されていないことがありました。
そのため、古い技術が多いほど多いほど……。

そんな中で、ゲームパッドを振動させる記事があったので更新したいと思います。

InputSystemを使ってゲームパッドを振動させる

新しい InputSystem を使えばゲームパッドを振動させるのは随分簡単になりました。
InputSystem についてはこちらの記事をご参考ください。
www.urablog.xyz

振動させる方法は、 Gamepad クラスの SetMotorSpeeds() を呼ぶだけ。
簡単ー!
公式ドキュメントのQAにも書いてありますしね。
forpro.unity3d.jp

じゃあ早速使ってみましょう。

// GameManager.cs
using UnityEngine;
using UnityEngine.InputSystem;
public class GameManager : MonoBehaviour
{
    private void Start()
    {
        Gamepad gamepad = Gamepad.current;
        if (gamepad != null)
        {
            gamepad.SetMotorSpeeds(0.5f, 1.0f);
        }
    }
} // class GameManager

f:id:urahimono:20211103231901j:plain
はい、ゲームパッドが振動し始めました。ブルブル……
とても簡単でしたね。ブルブル……
これでゲームのフィードバックが出てより面白く……、ブルブル……
ってゲームパッドの振動が止まんねぇな!

SetMotorSpeeds() に渡す引数って時間と周期じゃないの!?

はい、ちゃんとドキュメントを読みましょうねー。
docs.unity3d.com

えーと、第1引数が lowFrequency, 第2引数が highFrequency ですね。
低周波と高周波言われてもなんのことやら……。
ドキュメントを見る限り、lowFrequency が左のモーター、 highFrequency が右のモーターだそうです。
なるほど左右のことか!

そして渡す数値は 0.0 - 1.0 で速度なわけですね。
勝手に 0.0 にはならないので、振動させた後に自分で 0.0 をしなきゃ振動が止まらんわけですね。

コードを修正しましょう。

// GameManager.cs
using UnityEngine;
using UnityEngine.InputSystem;
using System.Collections;
public class GameManager : MonoBehaviour
{
    private IEnumerator Start()
    {
        Gamepad gamepad = Gamepad.current;
        if (gamepad != null)
        {
            gamepad.SetMotorSpeeds(1.0f, 1.0f);
            yield return new WaitForSeconds(3.0f);
            gamepad.SetMotorSpeeds(0.0f, 0.0f);
        }
    }
} // class GameManager

はい、今度こそOKです。
無事振動が収まりました。

世の中どんどん便利なって助かりますね。