【Unity】Input Systemで同時押しを実現する

こじゃらこじゃら

ボタンの同時押しとか、ドラッグをInput Systemで実現したい場合はどうすればいいの?

このはこのは

Button with one modifierを活用すれば良いわ!

Input Systemを使用している環境で、ボタンの同時押しや押しながら操作などを実現する方法の紹介です。

このような操作は、Button with one modifierButton with two modifiersを用いるとスマートに実現できます。

これらは、あるボタンが押されている間のみ入力値を返す振る舞いをします。

本記事では、このような同時押しを実現する方法を解説していきます。

動作環境
  • Unity 2021.2.24f1
  • Input System 1.1.1

スポンサーリンク

前提条件

Input Systemパッケージがインストールされ、有効化されているものとします。ここまでの手順が分からない方は、以下記事をご覧ください。

また、キーバインド情報を定義するInput Actionアセットの作成が済んでいるものとします。作成は、トップメニューのAssets > Create > Input Actionsから行えます。

Input Actionの使い方は、以下記事をご覧ください。

Button with one modifierの使い方

ある1つのボタンが押されている間だけ、あるBindingの入力値を返すComposite Bindingです。

Composite Bindingとは、複数の操作をまとめて一つのBindingとして扱うもので、ほかにもいくつか種類が存在します。

参考:Input Bindings | Input System | 1.2.0

Button with one modifierを用いると、次のような操作を実現できます。

  • 2ボタン同時押し
  • ドラッグ操作

具体的な実装例も紹介していきます。

2ボタン同時押しの実装例

マウスの左右ボタンの同時押しを実現する例です。

Input Action側の設定

該当するActionにButton with one modifierというComposite Bindingを追加して設定します。

Button with one modifierの追加は、Actionの右側の+アイコンからAdd Binding With One Modifierを選択して行います。

追加すると、次の2つのBindingが子階層に追加されます。

  • Modifier
    • もう一方のBindingの入力値を取得するために押されている必要があるボタンのBinding
  • Binding
    • Modifierのボタンが押されている間だけ入力値を返すBinding

設定までの流れは以下動画のようになります。

例では次の構成にしました。

設定したら、Save Assetボタンをクリックして設定内容を保存します。

注意

MapとAction名の設定は重要です。この名前をもとにスクリプトなどがActionに対する入力取得を行いますので、間違いないようにしてください。名前が違うとコンパイルエラーや実行時エラーになる可能性があります。

入力を取得するスクリプト

Actionの入力値をログ出力するサンプルスクリプトです。コード生成されたInput Actionクラスを参照することを前提としています。

PressTwoButtonsExample.cs
using UnityEngine;
using UnityEngine.InputSystem;

public class PressTwoButtonsExample : MonoBehaviour
{
    private PressTwoButtons _inputActions;
    
    private void Awake()
    {
        // Input Actionの初期化
        _inputActions = new PressTwoButtons();
        _inputActions.Player.LeftRight.performed += OnLeftRight;
        _inputActions.Enable();
    }

    private void OnLeftRight(InputAction.CallbackContext context)
    {
        print("左右ボタンが同時に押された!");
    }
}

このスクリプトをPressTwoButtonsExample.csという名前でUnityプロジェクトに保存し、適当なゲームオブジェクトにアタッチすると動きます。

注意

Input Actionが生成するスクリプトのクラス名と、スクリプト側のInput Actionのクラス名が合っていないとコンパイルエラーとなりますのでご注意ください。

実行結果

ドラッグ操作の実装例

マウスの左ボタンを押している間だけ移動量を返すようにする例です。

Input Action側の設定

Button with one modifierを使い、ActionModifierBindingを次の設定にします。

Action > Action TypeValue
Action > Control TypeVector 2
ModifierLeft Button [Mouse]
BindingDelta [Mouse]

入力を取得するスクリプト

ドラッグActionの入力値をログ出力するサンプルです。

MouseDragExample.cs
using UnityEngine;
using UnityEngine.InputSystem;

public class MouseDragExample : MonoBehaviour
{
    private MouseDrag _inputActions;

    private void Awake()
    {
        // Input Actionの初期化
        _inputActions = new MouseDrag();
        _inputActions.UI.Drag.performed += OnDrag;
        _inputActions.Enable();
    }

    private void OnDrag(InputAction.CallbackContext context)
    {
        // マウスドラッグの移動量取得
        var dragValue = context.ReadValue<Vector2>();

        print($"マウスドラッグ : {dragValue}");
    }
}

実行結果

Button with two modifiersの使い方

ある2つのボタンが押されている間だけBindingの入力を返すComposite Bindingです。3つ同時押しや、マウスの左右ボタンでドラッグさせたい場合に役立ちます。

Bindingの追加は、Add Binding With Tow Modifiersから行います。

追加すると、2つのModifierBindingが追加されるため、それぞれ設定してください。

さいごに

ボタンの同時押しやドラッグ入力などを取得したい場合、Button with one modifierやButton with two modifiersを用いればスマートに実現できます。

参照元で2つのAction入力をチェックする場合と比べ、処理を抽象化できるというメリットがあります。

ご参考にしていただければ幸いです。

関連記事

参考サイト

スポンサーリンク