ゲームコントローラーの入力をとる

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

ゲームコントローラーの入力を受けて、キャラクターを動かすようなことをしたい。

前提

  • Unity 2021.3.31f1
  • Input System 1.7.0

やり方

「Input System」を使う。

手順(準備)

メニュー > [Window] > [Package Manager] を開く。

下記を「Unity Registry」にする。

右上の検索窓に「Input System」と入れる。

検索実行すると、「Input System」のパッケージが出てくるので、 右下の「Download」を押す。その後、「Install」を押す。

※これを書いている時点で、すでにPackageを入れてしまったので写真では「Install」しか出てないが、たしか最初は「Download」が出てて、DLしたら「Install」になって、それを押したらinstall完了、だったはず。もしかしたら「Import」とかも間に挟まるかもだが、そのへんはええようにする。

これでコードを書く準備は完了。

コード書く

こちらのサイトのコードを参考にさせて頂いています。

https://forpro.unity3d.jp/unity_pro_tips/2021/05/20/1957/

using UnityEngine;
using UnityEngine.InputSystem;

public class Kaiten : MonoBehaviour
{
    public GameObject player;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // いろいろ書いてる
    }

    void OnGUI()
    {
        if (Gamepad.current == null) return;
                                                                                        // 私のWindows+私のコントローラーでは
        GUILayout.Label($"leftStick: {Gamepad.current.leftStick.ReadValue()}");         // 左アナログスティック
        GUILayout.Label($"rightStick: {Gamepad.current.rightStick.ReadValue()}");       // 右アナログスティック
        GUILayout.Label($"buttonNorth: {Gamepad.current.buttonNorth.isPressed}");       // Y(□)ボタン
        GUILayout.Label($"buttonSouth: {Gamepad.current.buttonSouth.isPressed}");       // A(〇)ボタン
        GUILayout.Label($"buttonEast: {Gamepad.current.buttonEast.isPressed}");         // B(×)ボタン
        GUILayout.Label($"buttonWest: {Gamepad.current.buttonWest.isPressed}");         // X(△)ボタン
        GUILayout.Label($"leftShoulder: {Gamepad.current.leftShoulder.ReadValue()}");   // Lボタン
        GUILayout.Label($"leftTrigger: {Gamepad.current.leftTrigger.ReadValue()}");     // ZLボタン
        GUILayout.Label($"rightShoulder: {Gamepad.current.rightShoulder.ReadValue()}"); // Rボタン
        GUILayout.Label($"rightTrigger: {Gamepad.current.rightTrigger.ReadValue()}");   // ZRボタン
    }
}

こんな感じで見える。
OnGUI()を今回初めて知った

ここには書いてないが、wasPressedThisFrameを使うと、「そのフレームでそのキーが押されたかどうか」を判定できる。(押したときに一回だけ、そこを通ってくれる。)

if (Gamepad.current.buttonEast.wasPressedThisFrame)
{
    // 真上に、相手の質量の1000倍の力を加える
    rb.AddForce(Vector3.up * rb.mass * jumpAmount, ForceMode.Impulse);
}

参考

Unityの新入力システム・Input Systemを使おう

https://forpro.unity3d.jp/unity_pro_tips/2021/05/20/1957/

公式 Input System

https://docs.unity3d.com/Packages/com.unity.inputsystem@1.7/manual/index.html