はこねのはこ

はこねさんの備忘録

Unity InputSystemの導入(XBox,PS4コントローラで動作チェック)

はじめに

InputSystemを用いてXboxPS4のコントローラ入力をしようと思います。
今回使用するInputSystemはPreviewです。

docs.unity3d.com

経緯

以前にXBoxコントローラからの入力を確認してRLトリガーの入力だけどうしていいのかわからず2年弱が経過していました。
そんな中最近ふと思いました。またプレビュー版だけどInputSystem使えばシンプルに取得できるんじゃないか..?
そんなわけで確認してみようと思いました。

過去記事 hakonebox.hatenablog.com

環境

  • Unity2019.3.7f1
  • InputSystem preview.6 - 1.0.0
  • XBoxOneコントローラ(有線接続)
  • PS4コントローラ(有線接続)

InputSystemにはUnity2019.1以上と。NET4ランタイムが必要とのことです。

インストール

InputSystemのインストール

PackageManagerからインストールします。
preview版なので注意してください。
f:id:hakonebox:20200329142120p:plain

InputBackendを有効にする

Edit > Project Settings > Player

先にApiCompatibillityLevelを確認し、".NET 4.x"に設定します。
ActiveInputHandlingを"Input System Paclage(New)"に設定します。 すると自動でUnityが再起動すると思います。
f:id:hakonebox:20200329142837p:plain この設定を有効にするためには、UnityEditorを再起動する必要があるため、
自動で再起動が行われなかった場合には自身で再起動してください。

入力デバイスから直接入力を取得

まずは入力デバイスからの現在の入力状況を直接読み取りをしてみます。

using UnityEngine;
using UnityEngine.InputSystem;

public class CurrentInputTest : MonoBehaviour
{
    void Update()
    {
        var gamepad = Gamepad.current;
        if (gamepad == null)
            return;    // No gamepad connected.

        if (gamepad.rightTrigger.wasPressedThisFrame)
        {
            Debug.Log($"rightTrigger:{gamepad}");
        }  
    }
}

PCに接続しているXboxコントローラとPS4コントローラのRトリガーを引いてみます。
f:id:hakonebox:20200329144959p:plain
どちらも認識できているようです。 しかもどのコントローラから入力があったのかも判別できているようですね。

下記URLを参考にほかの入力を取得することができました。 docs.unity3d.com

前回InputManagerでLRトリガーの同時押しがうまくいかなかったのですが、 InputSystemでは簡単に取得できそうです。

InputActionを介して間接的に入力を取得

PlayerInputコンポーネントの追加

AddComponentからPlayerInputコンポーネントを追加します
f:id:hakonebox:20200329162430p:plain

Actionsを作成する

CreateActions..を押すことで作成できます。
f:id:hakonebox:20200329165624p:plain

このActionsのRightTriggerを取得してみます。
f:id:hakonebox:20200329163100p:plain

InputActionからスクリプトで取得

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class InputActionTest : MonoBehaviour
{
    private InputAction m_fire;
    private void Awake()
    {
        var actionMap = GetComponent<PlayerInput>().currentActionMap;
        m_fire = actionMap["Fire"];
    }

    private void Update()
    {
        if (m_fire.triggered)
        {
            Debug.Log($"fire: {m_fire}");
        }
    }
}

f:id:hakonebox:20200329164452p:plain

今回はCreate Actionsを押してInputActionを作成しましたが、
Projectウィンドウからの右クリックから新規作成できます。 f:id:hakonebox:20200329164853p:plain

補足

Listenを使うことで、押したボタンが候補として出てくるので、 登録は簡単みたいです。

f:id:hakonebox:20200329165105p:plain

参考

learning.unity3d.jp