마우스로 조작하기(입력 시스템 패키지 버전)
검증 환경
- 윈도우
-
- 윈도우 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
에는 마우스의 현재 위치가 있으므로 메서드를 사용하여 Vector2Control
폼 Vector2
의 값을 가져올 수 있습니다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.scroll
Vector2
의 값을 가지고 있지만 세로 스크롤 전용 휠이라면 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);
}
}
}
스크립트를 저장한 후 실행하여 확인합니다. 오른쪽 버튼을 누르고 있는 동안 개체는 계속 회전합니다.