Beroperasi dengan mouse (Versi Paket Sistem Input)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 25f1/3/2020
Paket Sistem Input
  • 1.2.0

Prasyarat untuk tip ini

Pengaturan berikut telah dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Dapatkan posisi mouse

Posisi mouse di layar game dapat Mouse.position diperoleh di . Di sini, saya ingin menampilkan informasi lokasi.

Menempatkan objek teks di Canvas yang menampilkan informasi mouse.

Informasi mouse diambil dengan scripting. Dalam hal ini, kita akan membuat file skrip yang disebut dalam proyek MouseInfo .

Masukkan skrip sebagai berikut:

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.currentAnda bisa mendapatkan informasi tentang mouse yang sedang aktif. Mouse.position memiliki posisi mouse saat ini di , sehingga ReadValue Anda bisa mendapatkan nilai dalam bentuk Vector2 dengan menggunakan metode iniVector2Control.

Posisi mouse yang diperoleh diatur ke objek teks. StringBuilder Jangan terlalu khawatir tentang menggunakan , karena ini untuk ditambahkan nanti.

Setelah EventSystem Anda menyimpan skrip, lampirkan ke objek. Objek Teks diatur ke objek teks untuk menampilkan informasi tentang.

Coba jalankan game dan gerakkan mouse. Saya pikir posisi mouse akan muncul di layar secara real time.

Omong-omong, koordinat posisi mouse adalah (0, 0) di sudut kiri bawah layar game. Sumbu X (kiri dan kanan) menjadi positif saat Anda pergi ke kanan dan negatif saat Anda pergi ke kiri. Sumbu Y (atas dan bawah) menjadi positif saat Anda naik dan negatif saat Anda turun. Oleh karena itu, nilai maksimum setiap sumbu ada di sudut kanan atas layar game.

Juga, harap dicatat bahwa koordinat ini hanya untuk ruang layar game, sehingga ukuran piksel dalam game dan ukuran piksel koordinat layar perangkat mungkin tidak cocok.

Dapatkan jumlah gulungan roda

Menggulir dengan roda mouse juga dapat diambil dalam skrip. Jumlah Mouse.scroll gulir dapat diperoleh dengan . Berbeda dengan posisi mouse, Anda hanya bisa mendapatkan jumlah yang digulir secara instan. Perhatikan bahwa Anda tidak bisa mendapatkan seberapa jauh Anda telah menggulir.

Saya akan menambahkannya ke operasi gulir yang saya buat MouseInfo sebelumnya.

// 省略

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 tidak menyimpan jumlah yang digulir sejauh ini, jadi Tentukan bidang ScrollValue khusus untuk menahan jumlah gulir.

Mouse.scroll Kemudian, Anda bisa mendapatkan jumlah yang digulir pada saat itu, jadi kami akan mengumpulkan nilai itu. Misalnya, jika ScrollValue Anda menggulir roda dua kali, jumlah yang digulir dua kali akan dipertahankan.

Sisanya adalah menampilkan nilai ini sebagai teks.

Sekarang jalankan game dan putar roda. Saya pikir Anda akan melihat jumlah pengguliran.

Mouse.scrollVector2 memiliki nilai , tetapi jika itu adalah roda khusus gulir vertikal, saya pikir hanya nilai Y yang akan ditetapkan.

Omong-omong, jika Anda menggulir ke bawah, nilainya akan naik dan turun dalam 120 unit. Ini adalah nilai yang ditentukan oleh Windows, sehingga jumlahnya dapat berubah tergantung pada lingkungan dan jenis mouse lainnya.

Menentukan kapan tombol mouse diklik

Di sini, saya ingin memindahkan contoh yang menampilkan teks pada posisi di mana tombol kiri mouse diklik. Waktu mengklik dapat ditentukan oleh properti dengan cara yang sama seperti wasPressedThisFrame tombol keyboard.

Pertama, tempatkan objek teks untuk bergerak. Ukuran dan posisinya sesuai.

Buat skrip untuk proses klik. MouseButtonClick Biarkan nama sebagai .

Skripnya terlihat seperti ini:

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

Saya melakukan proses memindahkan objek teks ke posisi yang diklik. Posisi lokal objek UI adalah koordinat Canvas, sehingga berbeda dengan posisi mouse, yaitu koordinat layar.

Karena asal Canvas (0, 0) ada di tengah,RectTransform.sizeDelta gunakan untuk mendapatkan setengah ukuran Canvas. Asal koordinat mouse digeser ke tengah.

Anda dapat menentukan apakah Anda mengklik atau tidak mouse.xxxxxxxx.wasPressedThisFrame , dan hanya kembali saat true Anda mengklik. Jika Anda mengklik dan menahan tombol, itu akan terus kembali sampai Anda false mengkliknya lagi.

Setelah EventSystem Anda menyimpan skrip, lampirkan ke . Kali ini, kita juga akan menggunakan Canvas, jadi atur Canvas dan objek teks.

Coba jalankan game dan lihat apakah objek teks bergerak ke lokasi yang diklik. Karena hanya memproses saat diklik, objek teks tidak bergerak bahkan jika Anda menggerakkan mouse saat mengklik.

Menentukan kapan Anda melepaskan tombol mouse

Meskipun tidak terdaftar sebagai sampel, wasPressedThisFrame Anda dapat menentukan waktu rilis dengan menggunakan alih-alih wasReleasedThisFrame .

Menilai sambil mengklik tombol

mouse.xxxxxxxx.isPressed untuk terus kembali selama true Anda mengklik tombol. Di sini, saya ingin memutar teks sambil menekan tombol kanan.

Skrip dialihkan dari yang klik kiri. Ubah sebagai berikut:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Setelah menyimpan skrip, jalankan untuk memeriksanya. Objek terus berputar selama tombol kanan ditekan.