การทํางานด้วยเมาส์ (Input System Package Version)
สภาพแวดล้อมการตรวจสอบ
- หน้าต่าง
-
- หน้าต่าง 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
มีตําแหน่งปัจจุบันของเมาส์ใน เพื่อให้คุณReadValue
สามารถรับค่าในรูปแบบโดยใช้Vector2
วิธีการVector2Control
ตําแหน่งเมาส์ที่ได้รับถูกตั้งค่าเป็นวัตถุข้อความ
StringBuilder
ไม่ต้องกังวลมากเกินไปเกี่ยวกับการใช้ เนื่องจากเป็นการเพิ่มในภายหลัง
หลังจากที่คุณ EventSystem
บันทึกสคริปต์แล้ว ให้แนบสคริปต์นั้นกับวัตถุ
วัตถุข้อความถูกตั้งค่าเป็นวัตถุข้อความเพื่อแสดงข้อมูลเกี่ยวกับ
ลองรันเกมและเลื่อนเมาส์ ฉันคิดว่าตําแหน่งเมาส์จะปรากฏบนหน้าจอแบบเรียลไทม์
อย่างไรก็ตามพิกัดของตําแหน่งเมาส์คือ (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 และวัตถุข้อความ
ลองรันเกมและดูว่าวัตถุข้อความย้ายไปยังตําแหน่งที่คลิกหรือไม่ วัตถุข้อความจะไม่เคลื่อนที่แม้ว่าคุณจะเลื่อนเมาส์ขณะคลิกก็ตาม
กําหนดเมื่อคุณปล่อยปุ่มเมาส์
แม้ว่าจะไม่ได้แสดงเป็นตัวอย่าง แต่ wasPressedThisFrame
คุณสามารถกําหนดเวลาของการเปิดตัวโดยใช้ wasReleasedThisFrame
แทน
ตัดสินขณะคลิกปุ่ม
mouse.xxxxxxxx.isPressed
เพื่อดําเนินการต่อเพื่อส่งคืนตราบใดที่ true
คุณคลิกปุ่ม
ที่นี่ฉันต้องการหมุนข้อความในขณะที่กดปุ่มขวา
สคริปต์ถูกเบี่ยงเบนไปจากคลิกซ้าย แก้ไขดังนี้:
// 省略
public class MouseButtonClick : MonoBehaviour
{
// 省略
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// 右ボタンを押している間はオブジェクトを回転させる
if (mouse.rightButton.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
หลังจากบันทึกสคริปต์แล้วให้เรียกใช้เพื่อตรวจสอบ วัตถุยังคงหมุนต่อไปตราบใดที่กดปุ่มขวา