On-Screen Control과 함께 터치에 최적화된 입력 컨트롤 사용

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

검증 환경

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

이 팁의 전제 조건

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

또한 다음 팁을 숙지해야 합니다.

터치에 대한 화면 제어 정보

나는 종종 키보드나 게임패드를 사용하여 게임을 합니다. 스마트폰과 같이 터치로만 조작할 수 있는 기기에서는 터치로 게임을 플레이하게 됩니다.

Unity의 입력 시스템 패키지는 On-Screen Control을 사용하여 컨트롤러에 의해 제어되는 것처럼 터치 인터랙션을 시뮬레이션합니다.

온스크린 제어 전

이 문서는 약간 길지만 이 항목은 화면 제어와 직접적인 관련이 없습니다. 다른 단계에서 입력 시스템 패키지를 사용하여 게임 패드와 같은 입력을 확인할 수 있다면 괜찮습니다.

이 팁에서는 작업 맵을 만듭니다. 게임 패드를 조작하는 것처럼 터치하는 것을 시뮬레이션하는 방법에 대해 설명합니다.

그건 그렇고, 그것은 또한 액션 맵 대신 스크립트에서 Keyboard 클래스와 Gamepad 클래스를 사용하는 방법을 지원합니다. 이번에는 설명하지 않겠지만 이러한 클래스로 시도하고 싶다면 다음 페이지에서 설명하는 코드를 대신 준비할 수 있습니다.

먼저 Canvas에 텍스트 개체를 배치하여 입력을 표시합니다. 나중에 터치 개체를 아래쪽에 배치하므로 약간의 공간을 남겨 둡니다.

먼저 다음과 같이 작업 맵을 만듭니다. 작업 맵을 설명할 때와 동일한 작업을 만들고 있습니다.

액션 맵에 대한 설명이 중요한 것이 아니기 때문에 바인딩이 간단합니다. 액션 맵에 대한 자세한 내용은 다음 페이지를 참조하십시오.

이번에는 "Send Messages" 또는 "Invoke Unity Events" 대신 스크립트로 입력 획득을 수행합니다. 이것은 또한 스크립트에 국한되지 않으며 "메시지 보내기" 등을 사용하더라도 제대로 작동합니다.

작업 맵에서 코드를 생성했는지 확인합니다.

스크립트는 다음과 같습니다. 액션 맵을 설명 할 때와 거의 같습니다.

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

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

  /// <summary>アクションマップから自動生成されたクラス。</summary>
  private InputActionSample _actionMap;

  private void Awake()
  {
    // 各操作を行ったときに呼ばれるイベントを設定する
    _actionMap = new InputActionSample();
    _actionMap.Action2D.Move.performed += context => OnMove(context);
    _actionMap.Action2D.Attack.performed += context => OnAttack(context);
    _actionMap.Action2D.Move.canceled += context => OnMove(context);
    _actionMap.Action2D.Attack.canceled += context => OnAttack(context);
  }

  private void OnEnable()
  {
    // このオブジェクトが有効になったときにアクションマップを有効にする
    _actionMap.Enable();
  }

  private void OnDisable()
  {
    // このオブジェクトが無効になったときにアクションマップが余計な動作を起こさないように無効にする
    _actionMap.Disable();
  }

  /// <summary>
  /// Move 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnMove(InputAction.CallbackContext context)
  {
    // Move の入力量を取得
    var vec = context.ReadValue<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Attack 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnAttack(InputAction.CallbackContext context)
  {
    // Attack ボタンの状態を取得
    var value = context.ReadValueAsButton();
    TextObject.text = $"Attack:{value}\n{TextObject.text}";
  }
}

EventSystem 스크립트는 에 첨부되어 있습니다.

게임을 실행하여 액션 맵으로 작동하는지 확인합니다.

화면 버튼

On-Screen Button은 A 및 B와 같은 게임 패드의 버튼과 화면의 일부 개체를 터치할 때 키보드의 키를 누르는 것을 시뮬레이션합니다. 그건 그렇고, 터치라고 말하지만 마우스 클릭으로도 작동합니다.

먼저 버튼을 화면에 놓습니다. 구성 요소를 연결하기만 하면 되기 때문에 버튼 이외의 개체와 함께 작동합니다.

구성 요소에서 입력 > On-Screen Button을 추가합니다.

컨트롤 경로에서 게임패드의 버튼을 동쪽으로 설정합니다. 이렇게 하면 터치했을 때 게임패드의 Button East를 누른 것처럼 보입니다.

게임을 실행하고 버튼을 클릭할 때 공격이 나타나는지 확인합니다. 터치 가능한 장치인 경우 터치로 작동하는지 확인할 수 있습니다.

온스크린 스틱

On-Screen Stick을 사용하면 터치로 막대기와 같은 물체를 이동할 수 있습니다. 스틱을 움직이면 게임패드 스틱을 움직인 것처럼 시뮬레이션할 수 있습니다. 터치 외에도 마우스로 이동할 수도 있습니다.

터치 스틱이 될 단추 개체를 화면에 배치합니다. 여기서는 버튼을 사용하지만 버튼 이외의 개체에서도 작동합니다.

Add Component(컴포넌트 추가)에서 Input(입력) > On-Screen Stick(온스크린 스틱)을 선택합니다.

Control Path(제어 경로)에서 액션 맵에 정의된 Gamepad LeftStick(게임패드 LeftStick)을 선택합니다.

게임을 실행하고 스틱 버튼을 드래그해 보세요. 버튼은 막대기를 움직이는 것처럼 원을 그리며 움직입니다. 물론 입력 콘텐츠가 실행되는 동안 가져왔는지 확인할 수도 있습니다.

이 경우 버튼을 배치했지만 원형 프레임과 둥근 막대기 개체를 배치하여 가상 막대기처럼 보이게 할 수도 있습니다.

그건 그렇고,이 이동 범위는 온 스크린 스틱의 "이동 범위"에서 변경할 수 있습니다.