Ovládanie myšou (verzia vstupného systémového balíka)
Prostredie overovania
- Windows
-
- Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupný systémový balík
-
- 1.2.0
Predpoklady pre tento tip
Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.
Získajte pozíciu myši
Polohu myši na hernej obrazovke je možné Mouse.position
získať v .
Tu by som chcel zobraziť informácie o polohe.
Umiestni textový objekt na plátno, ktorý zobrazuje informácie o myši.
Informácie myši sa získavajú skriptovaním.
V tomto prípade vytvoríme skriptový súbor s názvom v projekte MouseInfo
.
Zadajte skript nasledovne:
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
Môžete získať informácie o aktuálne aktívnej myši.
Mouse.position
má aktuálnu pozíciu myši v , takže ReadValue
môžete získať hodnotu vo formulári Vector2
pomocou metódyVector2Control
.
Získaná pozícia myši je nastavená na textový objekt.
StringBuilder
Nerobte si príliš starosti s používaním , pretože je to na neskoršie pridanie.
Po EventSystem
uložení skriptu ho priložte k objektu.
Textový objekt je nastavený na textový objekt, o ktorom sa zobrazujú informácie.
Skúste spustiť hru a pohybovať myšou. Myslím si, že pozícia myši sa objaví na obrazovke v reálnom čase.
Mimochodom, súradnice pozície myši sú (0, 0) v ľavom dolnom rohu hernej obrazovky. Os X (ľavá a pravá) sa stáva kladnou, keď idete doprava, a negatívnou, keď idete doľava. Os Y (hore a dole) sa stáva pozitívnou, keď idete hore, a negatívnou, keď idete dole. Preto je maximálna hodnota každej osi v pravom hornom rohu hernej obrazovky.
Upozorňujeme tiež, že táto súradnica je určená iba pre priestor hernej obrazovky, takže veľkosť pixelov v hre a veľkosť pixelov súradníc obrazovky zariadenia sa nemusia zhodovať.
Získajte množstvo posúvania kolieska
Rolovanie kolieskom myši je možné získať aj v skripte.
Množstvo Mouse.scroll
rolovania je možné získať pomocou .
Na rozdiel od polohy myši môžete množstvo posúvať iba okamžite.
Upozorňujeme, že nemôžete zistiť, ako ďaleko ste sa posunuli.
Pridám ho do operácie posúvania, ktorú som vytvoril MouseInfo
skôr.
// 省略
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
zatiaľ nedrží posúvanú sumu, takže
Definujte vyhradené pole ScrollValue
, v ktorom sa bude nachádzať posúvacia suma.
Mouse.scroll
Potom môžete v tom okamihu získať posúvanú sumu, takže túto hodnotu nahromadíme.
Ak napríklad ScrollValue
dvakrát posúvate koliesko, množstvo rolovania dvakrát sa zachová.
Zvyšok je zobrazenie tejto hodnoty ako textu.
Teraz spustite hru a roztočte koleso. Myslím, že uvidíte množstvo rolovania.
Mouse.scroll
Vector2
má hodnotu , ale ak je to vertikálne rolovacie koliesko, myslím, že sa nastaví iba hodnota Y.
Mimochodom, ak sa posuniete nadol, hodnota pôjde hore a dole v 120 jednotkách. Toto je hodnota definovaná systémom Windows, takže číslo sa môže meniť v závislosti od iných prostredí a typov myší.
Určenie kliknutia na tlačidlo myši
Tu by som chcel presunúť ukážku, ktorá zobrazuje text na pozícii, kde je kliknuté ľavé tlačidlo myši.
Načasovanie kliknutia môže byť určené vlastnosťami rovnakým spôsobom ako wasPressedThisFrame
klávesy na klávesnici.
Najprv umiestnite textový objekt na presun. Veľkosť a poloha sú primerané.
Vytvorte skript pre proces kliknutia. MouseButtonClick
Názov ponechajte ako .
Skript vyzerá takto:
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;
}
}
}
Vykonávam proces presunu textového objektu na kliknutú pozíciu. Lokálna poloha objektu používateľského rozhrania je súradnica plátna, takže sa líši od polohy myši, ktorá je súradnicou obrazovky.
Keďže pôvod plátna (0, 0) je v strede,RectTransform.sizeDelta
použite na získanie polovice veľkosti plátna.
Pôvod súradníc myši je posunutý do stredu.
Môžete určiť, či ste klikli alebo nie mouse.xxxxxxxx.wasPressedThisFrame
, a vrátiť sa až true
v okamihu, keď kliknete.
Ak na tlačidlo kliknete a podržíte ho, bude sa vracať, kým naň znova nekliknete false
.
Po EventSystem
uložení skriptu ho priložte k súboru . Tentokrát použijeme aj plátno, takže nastavte plátno a textový objekt.
Skúste spustiť hru a zistite, či sa textový objekt presunie na miesto, na ktoré ste klikli. Keďže textový objekt spracováva iba okamih kliknutia, nepohybuje sa ani pri pohybe myšou počas klikania.
Určenie uvoľnenia tlačidla myši
Hoci nie je uvedená ako vzorka, wasPressedThisFrame
načasovanie uvoľnenia môžete určiť použitím namiesto wasReleasedThisFrame
.
Posúďte pri kliknutí na tlačidlo
mouse.xxxxxxxx.isPressed
a vráťte sa dovtedy, kým true
kliknete na tlačidlo.
Tu by som chcel otočiť text stlačením pravého tlačidla.
Skript je odklonený od skriptu ľavého kliknutia. Upravte ho nasledovne:
// 省略
public class MouseButtonClick : MonoBehaviour
{
// 省略
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// 右ボタンを押している間はオブジェクトを回転させる
if (mouse.rightButton.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
Po uložení skriptu ho spustite a skontrolujte. Objekt sa naďalej otáča, pokiaľ je stlačené pravé tlačidlo.