Beroperasi dengan tetikus (Versi Pakej Sistem Input)

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2020.3.25f1
Pakej Sistem Input
  • 1.2.0

Prasyarat untuk petua ini

Tetapan berikut telah dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Dapatkan kedudukan tetikus

Kedudukan tetikus pada skrin permainan boleh Mouse.position didapati dalam . Di sini, saya ingin memaparkan maklumat lokasi.

Meletakkan objek teks pada Kanvas yang memaparkan maklumat tetikus.

Maklumat tetikus diambil dengan skrip. Dalam kes ini, kami akan membuat fail skrip yang dipanggil dalam projek MouseInfo itu .

Masukkan skrip seperti 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 boleh mendapatkan maklumat mengenai tetikus yang sedang aktif. Mouse.position mempunyai kedudukan semasa tetikus dalam , jadi ReadValue anda boleh mendapatkan nilai dalam bentuk dengan Vector2 menggunakan kaedahVector2Control.

Kedudukan tetikus yang diperolehi disetkan kepada objek teks. StringBuilder Jangan terlalu risau untuk menggunakan , kerana ia adalah untuk menambah kemudian.

Selepas EventSystem anda menyimpan skrip, pasangkannya pada objek. Objek Teks disetkan kepada objek teks untuk memaparkan maklumat.

Cuba jalankan permainan dan gerakkan tetikus. Saya rasa kedudukan tetikus akan muncul di skrin dalam masa nyata.

Dengan cara ini, koordinat kedudukan tetikus adalah (0, 0) di sudut kiri bawah skrin permainan. Paksi X (kiri dan kanan) menjadi positif apabila anda pergi ke kanan dan negatif semasa anda pergi ke kiri. Paksi Y (atas dan bawah) menjadi positif apabila anda naik dan negatif semasa anda turun. Oleh itu, nilai maksimum setiap paksi berada di sudut kanan atas skrin permainan.

Juga, sila ambil perhatian bahawa koordinat ini hanya untuk ruang skrin permainan, jadi saiz piksel dalam permainan dan saiz piksel koordinat skrin peranti mungkin tidak sepadan.

Dapatkan jumlah skrol roda

Menatal dengan roda tetikus juga boleh diambil dalam skrip. Jumlah Mouse.scroll skrol boleh diperolehi dengan . Tidak seperti kedudukan tetikus, anda hanya boleh mendapatkan jumlah yang dinatal serta-merta. Ambil perhatian bahawa anda tidak boleh mendapatkan sejauh mana anda telah menatal.

Saya akan menambahnya ke operasi skrol yang saya buat MouseInfo sebelum ini.

// 省略

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 memegang jumlah yang dinatal setakat ini, jadi Tentukan medan ScrollValue khusus untuk menahan jumlah skrol.

Mouse.scroll Kemudian, anda boleh mendapatkan jumlah yang dinatal pada masa itu, jadi kami akan mengumpulkan nilai itu. Sebagai contoh, jika ScrollValue anda menatal roda dua kali, jumlah skrol dua kali akan dikekalkan.

Selebihnya adalah untuk memaparkan nilai ini sebagai teks.

Sekarang jalankan permainan dan putar roda. Saya fikir anda akan melihat jumlah menatal.

Mouse.scrollVector2 mempunyai nilai , tetapi jika ia adalah roda tatal menegak sahaja, saya fikir hanya nilai Y akan ditetapkan.

Dengan cara ini, jika anda menatal ke bawah, nilai akan naik dan turun dalam 120 unit. Ini adalah nilai yang ditakrifkan oleh Windows, jadi nombor mungkin berubah bergantung pada persekitaran dan jenis tetikus lain.

Tentukan bila butang tetikus diklik

Di sini, saya ingin memindahkan sampel yang memaparkan teks pada kedudukan di mana butang tetikus kiri diklik. Masa mengklik boleh ditentukan oleh sifat dengan cara yang sama seperti wasPressedThisFrame kekunci papan kekunci.

Mula-mula, letakkan objek teks untuk bergerak. Saiz dan kedudukannya sesuai.

Buat skrip untuk proses klik. MouseButtonClick Tinggalkan nama sebagai .

Skrip kelihatan 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 mengalihkan objek teks ke kedudukan diklik. Kedudukan tempatan objek UI adalah koordinat Kanvas, jadi ia berbeza dari kedudukan tetikus, yang merupakan koordinat skrin.

Oleh kerana asal usul Kanvas (0, 0) berada di tengah,RectTransform.sizeDelta gunakan untuk mendapatkan separuh saiz Kanvas. Asal koordinat tetikus dialihkan ke pusat.

Anda boleh menentukan sama ada anda mengklik atau tidak mouse.xxxxxxxx.wasPressedThisFrame , dan kembali hanya true selepas anda mengklik. Jika anda mengklik dan menahan butang, ia akan terus kembali sehingga anda false mengkliknya semula.

Selepas EventSystem anda menyimpan skrip, lampirkannya kepada . Kali ini, kami juga akan menggunakan Canvas, jadi tetapkan Kanvas dan objek teks.

Cuba jalankan permainan dan lihat jika objek teks bergerak ke lokasi yang diklik. Oleh kerana ia hanya memproses sebaik sahaja ia diklik, objek teks tidak bergerak walaupun anda menggerakkan tetikus semasa mengklik.

Menentukan bila anda melepaskan butang tetikus

Walaupun ia tidak disenaraikan sebagai sampel, wasPressedThisFrame anda boleh menentukan masa pelepasan dengan menggunakan bukannya wasReleasedThisFrame .

Hakim sambil mengklik butang

mouse.xxxxxxxx.isPressed untuk terus kembali selagi true anda mengklik butang. Di sini, saya ingin memutar teks sambil menekan butang kanan.

Skrip dialihkan dari klik kiri. Ubah suainya seperti berikut:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Selepas menyimpan skrip, jalankannya untuk menyemaknya. Objek terus berputar selagi butang kanan ditekan.