키보드로 조작하기(입력 시스템 패키지 버전)

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

검증 환경

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

이 팁의 전제 조건

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

특정 키를 누르는 순간 결정

키를 누를 때 개체를 이동해 봅니다. Canvas에 텍스트 개체를 배치하여 이동을 확인합니다. 크기와 위치가 적절할 수 있습니다.

키보드 처리는 스크립트에 의해 수행됩니다. KeyboardOneFrame 이 경우 .

코드는 다음과 같습니다.

using UnityEngine;
using UnityEngine.UI;           // 追加
using UnityEngine.InputSystem;  // 追加

public class KeyboardOneFrame : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

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

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    var transform = TextObject.transform;

    // wasPressedThisFrame は押した瞬間のみ true となる
    // キーは「keyboard[Key.RightArrow]」のような指定の仕方もある
    if (keyboard.leftArrowKey.wasPressedThisFrame)
    {
      transform.Translate(-1, 0, 0);
    }
    if (keyboard.rightArrowKey.wasPressedThisFrame)
    {
      transform.Translate(1, 0, 0);
    }
    if (keyboard.upArrowKey.wasPressedThisFrame)
    {
      transform.Translate(0, 1, 0);
    }
    if (keyboard.downArrowKey.wasPressedThisFrame)
    {
      transform.Translate(0, -1, 0);
    }
  }
}

Keyboard.current 에서 현재 키보드 키, 누름 상태 등을 가져올 수 있습니다. keyboard.xxxxxxx.wasPressedThisFrame 키를 누른 순간의 타이밍만 true 반환합니다. 이 코드에서는 커서 키를 누르는 순간 Text 개체 transform 에서 이동 작업이 수행됩니다. 누르는 순간에만 처리되기 때문에 키를 눌러도 움직임이 계속되지 않습니다.

스크립트를 저장한 후 EventSystem 개체에 KeyboardOneFrame 첨부하고 이동할 텍스트 객체를 Text 객체로 설정합니다.

게임을 실행하고 커서 키를 누를 때 @ 표시가 움직이는지 확인하십시오. 또한 키를 누르고 있어도 @ 기호가 이동하지 않는지 확인합니다.

어떤 유형의 키를 결정할 수 있습니까?

공식 홈페이지에 적혀 있으므로, 그쪽에서 확인하시기 바랍니다.

특정 키를 놓는 순간 결정

우리는 샘플을 만들지 않지만, 당신이 그것을 누르는 순간 속성에 의해 결정되고, 당신이 그것을 놓는 순간 wasPressedThisFrame wasReleasedThisFrame 에 의해 판단 될 수 있습니다.

특정 키를 누르는 동안 확인

이것은 또한 스크립트에 의해 결정됩니다. 이전 코드에 추가할 수 있지만 이번에는 라는 새 스크립트 파일을 만들고 작성합니다 KeyboardPress .

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

using UnityEngine;
using UnityEngine.UI;           // 追加
using UnityEngine.InputSystem;  // 追加

public class KeyboardPress : MonoBehaviour
{
  /// <summary>回転させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

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

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    var transform = TextObject.transform;

    // isPressed は押している間はずっと true となる
    // キーは「Keyboard.current[Key.Space]」のような指定の仕方もある
    if (keyboard.spaceKey.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

스페이스바를 누르고 있는 동안 문자 객체가 회전됩니다. keyboard.xxxxxxxx.isPressed 키의 전체 true 기간 동안 반환됩니다.

저장된 스크립트를 Text Object에 첨부 EventSystem 하고 회전할 Text 객체를 설정합니다.

게임이 실행되고 스페이스바를 누르고 있는 동안 @ 기호가 완전히 회전하는지 확인합니다.

누른 모든 키 가져 오기

누르고 있는 모든 키를 텍스트로 표시해 보십시오. 누르고 있는 키를 표시하기 위해 텍스트 개체를 배치했습니다.

KeyboardAllKeys 라는 이름의 스크립트를 만듭니다.

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

using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class KeyboardAllKeys : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

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

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      TextObject.text = "";
      return;
    }

    // allKeys からすべてのキーの情報を走査し isPressed で押しているキーのみを抽出する
    TextObject.text = string.Join(", ", keyboard.allKeys.Where(x => x.isPressed).Select(x => x.keyCode.ToString()));
  }
}

keyboard.allKeys 모든 키에 대한 정보를 얻을 수 있습니다. 해당 키에서 isPressed 참인 키만 추출하고 누르고 있는 키만 검색할 수 있습니다. 그런 다음 누르고 있는 키가 문자열로 변환되어 텍스트로 표시됩니다.

EventSystem 생성된 스크립트는 누르는 키를 표시하기 위한 텍스트 객체에 부착하고 설정합니다.

게임을 실행하고 누르고 있는 키가 나타나는지 확인합니다.

덧붙여서 키를 많이 눌러도 모든 키가 표시되지 않을 수 있지만 키보드 배선으로 인한 물리적인 문제이기 때문에 걱정하지 마십시오.

입력된 문자 가져오기

지금까지는 누른 키 유형을 얻었지만 실제로 입력한 문자를 가져오는 것도 가능합니다. 예를 들어, "A" 키를 누르면 문자 "a"를 얻을 수 있고, "Shift+A" 키를 누르면 문자 "A"를 얻을 수 있습니다. IME가 활성화되어 있으면 일본어를 검색할 수도 있습니다.

그러나 이렇게 입력된 문자는 속성에서 검색할 수 없으며 이벤트 형식으로 획득됩니다.

샘플에서는 입력된 문자를 표시하기 위해 텍스트 개체를 배치합니다.

스크립트를 만듭니다. KeyboardTextInput 이름은 입니다.

다음과 같이 스크립트를 입력합니다.

using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class KeyboardTextInput : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>
  /// オブジェクトが有効になったときに呼ばれるイベント。
  /// </summary>
  public void OnEnable()
  {
    // 文字が入力されたときに呼ばれるイベントをセット
    Keyboard.current.onTextInput += OnTextInput;
  }

  /// <summary>
  /// オブジェクトが無効になったときに呼ばれるイベント。
  /// </summary>
  public void OnDisable()
  {
    // 文字が入力されたときに呼ばれるイベントを解除
    Keyboard.current.onTextInput -= OnTextInput;
  }

  /// <summary>
  /// 文字を入力するたびに呼ばれる。
  /// </summary>
  /// <param name="c">入力された文字。</param>
  public void OnTextInput(char c)
  {
    TextObject.text += c;
  }
}

Keyboard클래스에는 텍스트가 onTextInput 입력될 때마다 호출되는 라는 이벤트가 있습니다. OnEnable 여기서, 메소드는 의 타이밍에 등록되고OnDisable 의 타이밍에 OnTextInput OnTextInput 취소된다. Keyboard.current 는 게임이 실행된 시점부터 종료될 때까지 존재하는 고유한 개체이므로OnDisable, 의 타이밍에 해제해야 합니다. 항상 이벤트 등록과 취소를 페어링할 수 있는 경우 언제든지 설정할 수 있습니다.

OnTextInput 메서드에서 입력한 문자는 인수 c 로 설정되므로 텍스트로 추가됩니다.

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

게임을 실행하고 키를 눌러보십시오. 입력한 문자가 표시되어야 합니다. Shift 키와 동시에 누르면 대문자와 기호를 입력할 수 있습니다. IME를 사용하는 경우 일본어를 입력할 수도 있습니다. 반면에 커서 키와 같이 문자가 아닌 키를 누르면 아무 일도 일어나지 않습니다.