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

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

검증 환경

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

이 팁의 전제 조건

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

마우스 위치 가져오기

게임 화면에서 마우스의 위치는 에서 확인할 수 Mouse.position 있습니다. 여기에 위치 정보를 표시하고 싶습니다.

마우스 정보를 표시하는 텍스트 개체를 Canvas에 배치합니다.

마우스 정보는 스크립팅을 통해 검색됩니다. 이 경우, 우리는 프로젝트에서 MouseInfo 호출된 스크립트 파일을 만들 것입니다.

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

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

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

  private StringBuilder Builder = new StringBuilder();

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

    var mouse = Mouse.current;
    if (mouse == null)
    {
      Debug.Log("マウスがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // マウスの位置を取得する
    Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");

    TextObject.text = Builder.ToString();
  }
}

Mouse.current현재 활성화된 마우스에 대한 정보를 얻을 수 있습니다. Mouse.position 에는 마우스의 현재 위치가 있으므로 메서드를 사용하여 Vector2ControlVector2 의 값을 가져올 수 있습니다ReadValue.

획득한 마우스 위치는 텍스트 객체로 설정됩니다. StringBuilder 나중에 추가하기 위한 것이므로 사용에 대해 너무 걱정하지 마십시오.

스크립트를 저장한 후 EventSystem 개체에 연결합니다. Text Object는 정보를 표시할 text 객체로 설정됩니다.

게임을 실행하고 마우스를 움직여 보세요. 마우스 위치가 실시간으로 화면에 나타날 것 같아요.

덧붙여서 마우스 위치의 좌표는 게임 화면의 왼쪽 하단 모서리에 (0, 0)입니다. X축(왼쪽 및 오른쪽)은 오른쪽으로 갈수록 양수가 되고 왼쪽으로 갈수록 음수가 됩니다. Y축(위아래)은 위로 올라갈수록 양수가 되고 아래로 내려갈수록 음수가 됩니다. 따라서 각 축의 최대값은 게임 화면의 오른쪽 상단 모서리에 있습니다.

또한 이 좌표는 게임 화면 공간에만 해당되므로 게임 내 픽셀 크기와 장치 화면 좌표의 픽셀 크기가 일치하지 않을 수 있습니다.

휠의 스크롤 양을 얻으십시오

마우스 휠로 스크롤하는 것도 스크립트에서 검색할 수 있습니다. 스크롤 양 Mouse.scroll 은 로 얻을 수 있습니다. 마우스 위치와 달리 순간적으로 스크롤되는 양만 얻을 수 있습니다. 스크롤한 거리를 알 수 없습니다.

이전에 만든 MouseInfo 스크롤 작업에 추가하겠습니다.

// 省略

public class MouseInfo : MonoBehaviour
{
  // 省略

  /// <summary>スクロールした量を保持する。</summary>
  private Vector2 ScrollValue = Vector2.zero;

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

    // スクロール量を取得し保持する
    ScrollValue += mouse.scroll.ReadValue();

    Builder.Clear();

    // マウスの位置を取得する
    Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");
    // スクロール量を表示
    Builder.AppendLine($"ScrollValue={ScrollValue}");

    TextObject.text = Builder.ToString();
  }
}

Mouse.current 지금까지 스크롤 된 금액을 보유하지 않으므로 스크롤 양을 저장할 전용 필드를 ScrollValue 정의합니다.

Mouse.scroll 그러면 그 순간에 스크롤된 금액을 얻을 수 있으므로 그 값을 누적합니다. 예를 들어 휠을 두 번 스크롤하면 ScrollValue 두 번 스크롤한 양이 유지됩니다.

나머지는 이 값을 텍스트로 표시하는 것입니다.

이제 게임을 실행하고 휠을 돌립니다. 스크롤의 양을 볼 수 있을 것 같아요.

Mouse.scrollVector2 의 값을 가지고 있지만 세로 스크롤 전용 휠이라면 Y의 값만 설정된다고 생각합니다.

덧붙여서 아래로 스크롤하면 값이 120 단위로 오르락 내리락합니다. 이 값은 Windows에서 정의한 값이므로 다른 환경 및 마우스 유형에 따라 숫자가 변경 될 수 있습니다.

마우스 단추를 클릭할 때 확인

여기서는 마우스 왼쪽 버튼을 클릭 한 위치에 텍스트를 표시하는 샘플을 이동하려고합니다. 클릭 타이밍은 키보드 키와 같은 방식으로 속성에 의해 결정될 수 있습니다 wasPressedThisFrame .

먼저 이동할 텍스트 개체를 배치합니다. 크기와 위치가 적절합니다.

클릭 프로세스에 대한 스크립트를 만듭니다. MouseButtonClick 이름을 그대로 둡니다.

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

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

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

  /// <summary>Canvas の RectTransform の参照です。</summary>
  private RectTransform CanvasRect;

  // 最初のフレーム更新の前に開始が呼び出されます
  void Start()
  {
    if (CanvasObject == null)
    {
      Debug.Log($"{nameof(CanvasObject)} が null です。");
      return;
    }

    // Canvas から RectTransform を取得しておきます。
    CanvasRect = CanvasObject.GetComponent<RectTransform>();
  }

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

    var mouse = Mouse.current;
    if (mouse == null)
    {
      Debug.Log("マウスがありません。");
      return;
    }

    var transform = TextObject.transform;

    // マウスの位置を取得する
    var mousePosition = mouse.position.ReadValue();

    // マウスの位置を Canvas の座標に変換する
    var mouseOnCanvas = new Vector2(mousePosition.x - CanvasRect.sizeDelta.x / 2, mousePosition.y - CanvasRect.sizeDelta.y / 2);

    // 左ボタンがクリックしたタイミングか判定
    if (mouse.leftButton.wasPressedThisFrame)
    {
      transform.localPosition = mouseOnCanvas;
    }
  }
}

텍스트 객체를 클릭 한 위치로 이동하는 과정을 수행합니다. UI 객체의 로컬 위치는 Canvas의 좌표이므로 화면 좌표인 마우스의 위치와는 다릅니다.

Canvas의 원점(0, 0)이 중앙RectTransform.sizeDelta 에 있으므로 를 사용하여 Canvas 크기의 절반을 가져옵니다. 마우스 좌표의 원점이 가운데로 이동합니다.

클릭했는지 여부를 mouse.xxxxxxxx.wasPressedThisFrame 확인하고 클릭하는 순간만 true 반환할 수 있습니다. 버튼을 길게 클릭하면 다시 클릭할 때까지 false 계속 돌아갑니다.

스크립트를 저장한 후 EventSystem 에 첨부합니다. 이번에는 Canvas도 사용하므로 Canvas와 text 객체를 설정합니다.

게임을 실행하고 텍스트 개체가 클릭한 위치로 이동하는지 확인합니다. 클릭하는 순간만 처리하기 때문에 클릭하는 동안 마우스를 움직여도 텍스트 객체는 움직이지 않습니다.

마우스 단추를 놓을 때 결정

샘플로 나열되지는 않지만 wasPressedThisFrame 대신 wasReleasedThisFrame 를 사용하여 릴리스 시기를 확인할 수 있습니다.

버튼을 클릭하는 동안 판단

mouse.xxxxxxxx.isPressed 버튼을 클릭하는 동안 true 계속 돌아갑니다. 여기에서는 오른쪽 버튼을 누른 상태에서 텍스트를 회전하고 싶습니다.

스크립트는 왼쪽 클릭 스크립트에서 전환됩니다. 다음과 같이 수정합니다.

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

    // 右ボタンを押している間はオブジェクトを回転させる
    if (mouse.rightButton.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

스크립트를 저장한 후 실행하여 확인합니다. 오른쪽 버튼을 누르고 있는 동안 개체는 계속 회전합니다.