게임패드로 제어하기(입력 시스템 패키지 버전)

페이지 업데이트 :
페이지 생성 날짜 :

검증 환경

윈도우
  • 윈도우 11
Unity 에디터
  • 2020.3.25f1
입력 시스템 패키지
  • 1.2.0

이 팁의 전제 조건

이 팁에 대한 설명의 전제로 다음 설정이 미리 이루어졌습니다.

XInput 및 DirectInput 정보

Windows로 제한되지만 게임 컨트롤러에는 DirectInput 및 XInput의 두 가지 연결 형식이 있습니다. 여기서 "Gamepad"는 "XInput"에 해당합니다.

Gamepad 프로그램은 클래스를 다루지만 "XInput"을 지원하는 컨트롤러만 처리할 수 있습니다. DirectInput을 지원하는 컨트롤러를 사용하려면 다른 Joystick 클래스를 사용해야 합니다.

"DirectInput"은 오래된 연결 형식이며 버튼의 정의가 비교적 모호하며 특별한 모양의 컨트롤러를 처리할 수 있습니다. 그러나 최근에는 "XInput"이 주류가되어 "DirectInput"을 지원하지 않는 컨트롤러가 증가하고 있습니다. "DirectInput"에는 "1", "2", "3"과 같은 버튼 정의가 있으므로 게임 제작자는 게임과 컨트롤러 사이에 적절하게 설정할 수 있도록 버튼 대응을 만들어야 합니다.

XInput은 차세대 DirectInput으로 정의되며 미리 정의된 A 및 B 단추, 트리거, 스틱 등을 포함합니다. 따라서 컨트롤러의 고정된 형태만 사용할 수 있으며, 버튼의 정의가 잘 정의되어 있기 때문에 게임 제작자는 버튼 배치에 대한 걱정 없이 컨트롤러에 맞는 게임을 만들 수 있습니다. "XInput"만 지원하는 최근 게임 컨트롤러가 증가하고 있습니다.

단추를 누르고 있는지 확인

버튼을 눌렀는지 여부는 속성과 xxxxxxxx.isPressed 키보드와 마우스로 확인할 수 있습니다. 여기에서는 텍스트에서 누르고있는 버튼의 유형을 표시하고 싶습니다.

먼저 표시 텍스트 객체를 배치합니다.

판정에 대한 스크립트를 만듭니다. 파일 이름은 임의로 지정할 수 있지만 여기 GamepadButtons 에서는 .

스크립트는 다음과 같습니다.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadButtons : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

스크립트를 저장한 후 EventSystem 표시 텍스트 객체에 첨부하고 구성합니다.

게임을 실행하고 각 버튼이 응답하는지 확인하십시오.

덧붙여서 다음 버튼은 동일한 버튼으로 정의되어 있지만, 게임 콘솔에 따라 다르게 읽히기 때문에 여러 개의 버튼이 준비되어 있습니다. 위의 각 프로그램에는 판정 과정이 포함되어 있으므로 버튼을 누르면 3 개의 버튼이 표시됩니다.

,
XboxPlayStation
b버튼 서클 버튼 버튼이스트
a버튼 크로스 버튼 버튼사우스
x버튼 스퀘어 버튼 버튼웨스트
y버튼 삼각형 단추 버튼노스

버튼으로 판단할 수 있는 것은 다음과 같습니다.

  • A 버튼, × 버튼, 다운 버튼
  • B버튼, ○버튼, 오른쪽 버튼
  • X 버튼, □ 버튼, 왼쪽 버튼
  • Y 버튼, 아래쪽 화살표 버튼, 위쪽 버튼
  • 시작 버튼, 메뉴 버튼
  • 선택 버튼, 보기 버튼
  • 왼쪽 어깨 버튼, L1 버튼
  • 오른쪽 어깨 버튼, R1 버튼
  • 왼쪽 스틱 버튼
  • 오른쪽 스틱 버튼

단추를 눌렀는지 확인합니다.

누르는 순간의 판단은 키보드와 마우스와 같은 속성에 의해 결정될 수 있습니다 xxxxxxxx.wasPressedThisFrame . 눌렀던 순간 true 의 값을 반환하고, 그 이후에 눌렀다가 누르고 있어 false 도 반환합니다.

눌렀던 버튼을 동작 확인으로 텍스트로 표시해 봅시다. 표시할 문자 객체를 배치합니다.

스크립트의 파일 이름은 무엇이든 될 수 있지만 여기에 GamepadButtonsOneFrame 있습니다.

스크립트는 다음과 같습니다. 단순화를 위해 4개의 버튼만 판단됩니다.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadButtonsOneFrame : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

스크립트를 저장한 후 EventSystem 스크립트에 첨부하고 표시할 텍스트 개체를 설정합니다.

게임을 실행하고 버튼을 눌러보세요. 누르신 버튼이 추가될 것 같아요. 버튼을 누르고 있어도 텍스트가 추가되지 않는 것을 볼 수 있습니다.

버튼에서 손을 떼는 순간인지 확인합니다.

샘플은 없지만 속성 대신 wasReleasedThisFrame 속성을 사용하여 샘플을 해제하는 순간인지 wasPressedThisFrame 확인할 수 있습니다.

화살표 키를 누를 때 확인

DPAD의 프레스를 결정합니다. 게임 콘솔에 따라 화살표 키와 방향 패드로 비행하지만 둘 다 동일하게 취급됩니다. DPAD는 기본적으로 그 방향으로 밀고 있는지 여부만 결정합니다. 막대기처럼 "조금 밀기"와 같은 판단은 없습니다.

작업 검사로 눌렀는지 여부에 대한 결정을 표시하기 위해 문자 개체를 배치합니다.

스크립트를 만듭니다. 파일 이름은 임의로 지정할 수 있지만 여기 GamepadDpad 에서는 .

스크립트는 다음과 같습니다.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadDpad : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

에서 DPAD 정보를 Gamepad.dpad 얻을 수 있습니다.

DPAD는 각 방향에 대한 속성을 가지고 leftupdown right있으며, 속성 등에 의해 눌려졌는지 여부를 결정할 수 있습니다. isPressed

DpadControl.ReadValue 이 메서드를 사용하여 에서 프레스의 상태를 Vector2 가져올 수도 있습니다. 아무 것도 누르지 않은 경우(0, 0), 왼쪽을 누르면(-1, 0) 등입니다.

스크립트를 저장한 후 EventSystem 스크립트에 첨부하고 표시할 텍스트 개체를 설정합니다.

게임을 실행하고 DPAD와 상호 작용해 보십시오.

Vector2 덧붙여서, 정규화 된 상태이므로 대각선으로 누르면 (1, 1) 대신 (0.7071, 0.7071)과 같은 숫자로 구해집니다.

방아쇠 누름 확인

Xbox 컨트롤러의 왼쪽과 오른쪽에는 트리거라는 버튼이 있습니다. PlayStation에서는 L2R2에 해당합니다. 이 버튼은 일반 버튼과 다르며, 누르고 있는 양을 0.0~1.0 단위로 얻을 수 있습니다. 일부 다른 컨트롤러에는 트리거 이외의 이름이 장착되어 있지만 구형 컨트롤러 등에서는 단순히 버튼으로 배치할 수 있으며, 이 경우 누르는 판정은 0, 1로만 처리됩니다.

여기서는 방아쇠를 당기는 횟수를 확인하고 싶습니다. Canvas에 표시할 텍스트 개체를 배치합니다.

스크립트를 만듭니다. 다른 곳에서 사용되기 때문에 여기에 GamepadReadValue 이름을 지정합니다.

스크립트는 다음과 같습니다.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadReadValue : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

GamepadleftTrigger클래스에는 속성이 있으며 rightTrigger ReadValue 메서드를 호출하여 0.0 ~ 1.0 범위의 프레스 수를 얻을 수 있습니다. 트리거는 버튼으로도 취급 할 수 있으므로 isPressed 다음과 같이 판단 할 수도 있습니다. isPressed true 그건 그렇고, 되는 양은 0.5를 기준으로 합니다 ReadValue .

스크립트를 저장한 후 스크립트 EventSystem 에 첨부하고 표시할 텍스트 개체를 설정합니다.

게임을 실행하고 트리거를 움직여보십시오.

스틱 정보 확인

스틱은 왼쪽 스틱과 오른쪽 스틱의 정보를 각각 얻을 수 있으며, 스틱이 어느 방향으로 얼마나 아래로 눌려졌는지 알 수 있습니다. 물론 컨트롤러에 스틱이 없으면 이 정보를 얻을 수 없습니다.

스틱 정보는 각각 Gamepad.leftStickGamepad.rightStick 사용하여 검색할 수 있습니다.

작업 확인 스크립트의 경우 트리거를 가져오기 위해 이전에 사용된 스크립트를 전환합니다.

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick 또는 에서 메서드를 호출하여 Vector2 언론 정보를 가져올 수 있습니다ReadValue. Vector2 따라서 X 축과 Y 축을 얼마나 누르고 있는지 속성으로 얻을 x y 수 있습니다. 누르는 방향을 얻고 싶다면 부동산에서 얻을 수 있고magnitude, 누르 normalized 는 양을 얻고 싶다면 속성에서 얻을 수 있습니다.

실제로 게임을 움직이고 스틱을 조작하십시오.

게임패드 정보 가져오기

연결된 게임패드에서 ID, 이름 등을 얻을 수 있습니다. 예를 들어, 연결된 컨트롤러의 유형을 식별 name 하려면 를 참조하거나 여러 게임패드가 연결되어 있을 때 어떤 deviceId 게임패드와 연결할지 참고할 수 있습니다.

여기서는 작업을 확인하기 위해 텍스트에 정보를 표시합니다.

스크립트 이름은 임의로 지정할 수 있지만 여기서 GamepadInfo 는 .

스크립트는 다음과 같습니다.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadInfo : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad 검색된 . 다음은 몇 가지 발췌 내용입니다.

스크립트를 저장한 후 스크립트 EventSystem 에 첨부하고 표시할 텍스트 개체를 설정합니다.

게임을 실행하여 정보가 나타나는지 확인합니다.