Hoạt động bằng chuột (Phiên bản gói hệ thống đầu vào)

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2020.3.25f1
Gói hệ thống đầu vào
  • 1.2.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Lấy vị trí chuột

Vị trí của chuột trên màn hình trò chơi có thể Mouse.position được lấy trong . Ở đây, tôi muốn hiển thị thông tin vị trí.

Đặt một đối tượng văn bản trên Canvas hiển thị thông tin chuột.

Thông tin chuột được truy xuất bằng cách viết kịch bản. Trong trường hợp này, chúng ta sẽ tạo một tập tin script được gọi là trong project MouseInfo .

Nhập tập lệnh như sau:

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.currentBạn có thể nhận thông tin về chuột hiện đang hoạt động. Mouse.position có vị trí hiện tại của chuột trong , vì vậy ReadValue bạn có thể nhận được giá trị trong biểu mẫu bằng cách Vector2 sử dụng phương Vector2Control thức.

Vị trí chuột thu được được đặt thành một đối tượng văn bản. StringBuilder Đừng lo lắng quá nhiều về việc sử dụng , vì nó là để thêm sau này.

Sau khi EventSystem bạn lưu tập lệnh, hãy đính kèm nó vào đối tượng. Đối tượng Văn bản được đặt thành một đối tượng văn bản để hiển thị thông tin về.

Hãy thử chạy trò chơi và di chuyển chuột. Tôi nghĩ rằng vị trí chuột sẽ xuất hiện trên màn hình trong thời gian thực.

Nhân tiện, tọa độ của vị trí chuột là (0, 0) ở góc dưới bên trái của màn hình trò chơi. Trục X (trái và phải) trở nên dương khi bạn đi sang phải và âm khi bạn đi sang trái. Trục Y (lên và xuống) trở nên dương khi bạn đi lên và âm khi bạn đi xuống. Do đó, giá trị tối đa của mỗi trục nằm ở góc trên bên phải của màn hình trò chơi.

Ngoài ra, xin lưu ý rằng tọa độ này chỉ dành cho không gian màn hình trò chơi, vì vậy kích thước pixel trong trò chơi và kích thước pixel của tọa độ màn hình của thiết bị có thể không khớp nhau.

Nhận số lượng cuộn của bánh xe

Cuộn bằng bánh xe chuột cũng có thể được truy xuất trong tập lệnh. Số lượng Mouse.scroll cuộn có thể thu được với . Không giống như vị trí chuột, bạn chỉ có thể nhận được số tiền cuộn ngay lập tức. Lưu ý rằng bạn không thể biết mình đã cuộn bao xa.

Tôi sẽ thêm nó vào thao tác cuộn mà tôi đã tạo MouseInfo trước đó.

// 省略

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 không giữ số lượng cuộn cho đến nay, vì vậy Xác định một trường ScrollValue chuyên dụng để giữ số lượng cuộn.

Mouse.scroll Sau đó, bạn có thể nhận được số tiền cuộn tại thời điểm đó, vì vậy chúng tôi sẽ tích lũy giá trị đó. Ví dụ: nếu ScrollValue bạn cuộn bánh xe hai lần, số lượng cuộn hai lần sẽ được giữ lại.

Phần còn lại là hiển thị giá trị này dưới dạng văn bản.

Bây giờ chạy trò chơi và quay bánh xe. Tôi nghĩ bạn sẽ thấy số lượng cuộn.

Mouse.scrollVector2 có giá trị là , nhưng nếu nó là một bánh xe chỉ cuộn dọc, tôi nghĩ chỉ có giá trị của Y sẽ được đặt.

Nhân tiện, nếu bạn cuộn xuống, giá trị sẽ tăng và giảm theo 120 đơn vị. Đây là một giá trị được xác định bởi Windows, vì vậy số lượng có thể thay đổi tùy thuộc vào các môi trường và loại chuột khác.

Xác định khi nào bấm nút chuột

Ở đây, tôi muốn di chuyển một mẫu hiển thị văn bản ở vị trí nhấp vào nút chuột trái. Thời gian nhấp chuột có thể được xác định bởi các thuộc tính giống như wasPressedThisFrame các phím bàn phím.

Đầu tiên, đặt một đối tượng văn bản để di chuyển. Kích thước và vị trí phù hợp.

Tạo tập lệnh cho quá trình nhấp chuột. MouseButtonClick Để tên là .

Kịch bản trông như thế này:

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;
    }
  }
}

Tôi thực hiện quá trình di chuyển đối tượng văn bản đến vị trí được nhấp. Vị trí cục bộ của đối tượng UI là tọa độ của Canvas nên khác với vị trí của chuột, đó là tọa độ màn hình.

Vì nguồn gốc của Canvas (0, 0) nằm ở trung tâm,RectTransform.sizeDelta hãy sử dụng để có được một nửa kích thước của Canvas. Nguồn gốc của tọa độ chuột được chuyển sang trung tâm.

Bạn có thể xác định xem bạn có nhấp hay không mouse.xxxxxxxx.wasPressedThisFrame và chỉ true quay lại ngay khi bạn nhấp vào. Nếu bạn nhấp và giữ nút, nút sẽ tiếp tục quay lại cho đến khi bạn false nhấp lại.

Sau khi EventSystem bạn lưu tập lệnh, hãy đính kèm tập lệnh vào . Lần này, chúng ta cũng sẽ sử dụng Canvas, vì vậy hãy đặt Canvas và đối tượng text.

Hãy thử chạy trò chơi và xem đối tượng văn bản có di chuyển đến vị trí đã nhấp hay không. Vì nó chỉ xử lý thời điểm nó được nhấp, đối tượng văn bản không di chuyển ngay cả khi bạn di chuyển chuột trong khi nhấp.

Xác định thời điểm bạn nhả nút chuột

Mặc dù nó không được liệt kê dưới dạng mẫu, wasPressedThisFrame bạn có thể xác định thời gian phát hành bằng cách sử dụng thay vì wasReleasedThisFrame .

Đánh giá trong khi nhấp vào nút

mouse.xxxxxxxx.isPressed để tiếp tục quay lại miễn true là bạn nhấp vào nút. Ở đây, tôi muốn xoay văn bản trong khi nhấn nút bên phải.

Tập lệnh được chuyển hướng từ tập lệnh nhấp chuột trái. Sửa đổi nó như sau:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Sau khi lưu tập lệnh, hãy chạy nó để kiểm tra. Đối tượng tiếp tục xoay miễn là nhấn nút bên phải.