Beroperasi dengan tetikus (Versi Pakej Sistem Input)
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.current
Anda 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.scroll
Vector2
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.