조이스틱으로 작동(입력 시스템 패키지 버전)

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

검증 환경

윈도우
  • 윈도우 11
유니티 에디터
  • 2020.3.25에프1
입력 시스템 패키지
  • 1.2.0

이 팁의 전제 조건

다음 설정은 이러한 팁을 설명하기 위한 전제 조건으로 미리 구성되어 있습니다.

XInput 및 DirectInput 정보

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

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

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

"XInput"은 차세대 "DirectInput"으로 정의되며 미리 정의된 A 및 B 버튼, 트리거, 스틱 등이 있습니다. 따라서 컨트롤러의 모양은 거의 고정되어 있을 때만 사용할 수 있습니다. 버튼의 정의가 잘 정의되어 있기 때문에 게임 제작자는 버튼 배치에 대한 걱정 없이 컨트롤러와 일치하는 게임을 만들 수 있습니다. 최근 점점 더 많은 게임 컨트롤러가 "XInput"과만 호환됩니다.

조이스틱 정보

상술한 바와 같이 버튼에 대한 정의가 없기 때문에 실제로 사용하기 위해서는 각 버튼의 정보를 검토하면서 게임 조작을 할당하는 등 번거로운 프로세스를 추가할 필요가 있습니다. 새 게임이 오래되었기 때문에 DirectInput을 사용할 필요는 없다고 생각하지만, 실제로 지원하려면 프로그램이 복잡할 수 있음을 명심하십시오.

이 샘플은 기본적으로 나열된 단추에 대한 정보를 얻는 것으로 제한됩니다. name 실제로 작업을 확인하고 할당해야 합니다.

조이스틱 정보 수집

조이스틱의 각 버튼에 대한 정보를 표시하는 텍스트 개체를 배치합니다.

스크립트를 만듭니다. 이름은 임의적이지만 이 경우에는 JoystickInfo 입니다.

스크립트는 다음과 같습니다. 획득되는 정보는 컨트롤러 유형에 따라 다릅니다. 각 컨트롤러에 대해 프로그래밍하는 것은 매우 어렵기 때문에 모든 버튼을 열거하고 버튼 유형과 누름 정보를 얻습니다.

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

public class JoystickInfo : 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 joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

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

에서 연결된 조이스틱에 대한 정보를 Joystick.current 얻을 수 있습니다. Joystick 그 후 수업에서 각 정보를 얻습니다.

Joystick 클래스 stick trigger 에서 볼 수 있듯이 및 와 같은 정의는 있지만 A 버튼이나 시작 버튼과 같은 정의는 없습니다. 따라서 속성을 사용하여 모든 버튼, 스틱allControls 을 열거하고 버튼 유형 및 누름 정보를 찾아야 합니다.

스크립트가 저장 EventSystem 되면 정보를 표시하기 위한 텍스트 개체를 첨부하고 설정합니다.

DirectInput을 지원하는 컨트롤러로 게임을 실행해 보세요. 각 정보를 검색할 수 있습니다.

컨트롤러에 따라 스틱, 화살표 키 등을 누를 때 의도한 값을 얻지 못할 수 있습니다. 버튼은 이러한 방식으로 정의되지 않기 때문에 각 버튼에 대한 정확한 누름 정보를 얻기가 어렵습니다. 또한 컨트롤러에 따라 버튼의 배열이 다른 등 조이스틱을 완전히 지원하는 것이 상당히 어렵다는 것을 알 수 있습니다.

게임이 조이스틱을 지원하는 경우 각 사용자가 가지고 있는 컨트롤러의 버튼 레이아웃을 사용자 지정할 수 있도록 키 구성과 같은 설정 화면이 있는 것이 바람직합니다.

여러 조이스틱에 대한 정보를 얻는 방법

연결된 모든 조이스틱에 대한 Joystick.all 정보는 에서 얻을 수 있습니다. ReadOnlyArray foreach 등으로 열거할 수 있습니다.

각 값은 클래스이므로 Joystick 이전 프로그램과 같이 조이스틱 정보를 얻을 수 있습니다.