การทํางานด้วยเมาส์ (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.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 และวัตถุข้อความ

ลองรันเกมและดูว่าวัตถุข้อความย้ายไปยังตําแหน่งที่คลิกหรือไม่ วัตถุข้อความจะไม่เคลื่อนที่แม้ว่าคุณจะเลื่อนเมาส์ขณะคลิกก็ตาม

กําหนดเมื่อคุณปล่อยปุ่มเมาส์

แม้ว่าจะไม่ได้แสดงเป็นตัวอย่าง แต่ wasPressedThisFrame คุณสามารถกําหนดเวลาของการเปิดตัวโดยใช้ wasReleasedThisFrame แทน

ตัดสินขณะคลิกปุ่ม

mouse.xxxxxxxx.isPressed เพื่อดําเนินการต่อเพื่อส่งคืนตราบใดที่ true คุณคลิกปุ่ม ที่นี่ฉันต้องการหมุนข้อความในขณะที่กดปุ่มขวา

สคริปต์ถูกเบี่ยงเบนไปจากคลิกซ้าย แก้ไขดังนี้:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

หลังจากบันทึกสคริปต์แล้วให้เรียกใช้เพื่อตรวจสอบ วัตถุยังคงหมุนต่อไปตราบใดที่กดปุ่มขวา