Ovládání myší (verze balíčku vstupního systému)
Ověřovací prostředí
- Windows
-
- Systém Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupní systémový balíček
-
- 1.2.0
Předpoklady pro tento tip
Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.
Získání pozice myši
Polohu myši na herní obrazovce lze Mouse.position
získat v .
Zde bych chtěl zobrazit informace o poloze.
Umístí textový objekt na plátno, který zobrazuje informace o myši.
Informace o myši se načítají skriptováním.
V tomto případě vytvoříme soubor skriptu nazvaný v projektu MouseInfo
.
Zadejte skript následujícím způsobem:
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ískat informace o aktuálně aktivní myši.
Mouse.position
má aktuální pozici myši v , takže ReadValue
můžete získat hodnotu ve formuláři pomocí Vector2
Vector2Control
metody.
Získaná pozice myši je nastavena na textový objekt.
StringBuilder
Nebojte se příliš používat , protože je to pro přidání později.
Po EventSystem
uložení skriptu jej připojte k objektu.
Textový objekt je nastaven na textový objekt, o kterém se mají zobrazovat informace.
Zkuste spustit hru a pohybovat myší. Myslím, že pozice myši se objeví na obrazovce v reálném čase.
Mimochodem, souřadnice pozice myši jsou (0, 0) v levém dolním rohu herní obrazovky. Osa X (vlevo a vpravo) se stává kladnou, když jdete doprava, a zápornou, když jdete doleva. Osa Y (nahoru a dolů) se stává pozitivní, když jdete nahoru a negativní, když jdete dolů. Proto je maximální hodnota každé osy v pravém horním rohu herní obrazovky.
Upozorňujeme také, že tato souřadnice je určena pouze pro prostor herní obrazovky, takže velikost pixelů ve hře a velikost pixelu souřadnic obrazovky zařízení se nemusí shodovat.
Získání množství posuvu kolečka
Rolování kolečkem myši lze také načíst ve skriptu.
Rolovací množství Mouse.scroll
lze získat pomocí .
Na rozdíl od pozice myši můžete získat pouze množství posunuté okamžitě.
Všimněte si, že nemůžete zjistit, jak daleko jste se posunuli.
Přidám ji do operace posouvání, kterou jsem vytvořil MouseInfo
dříve.
// 省略
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
nedrží částku posunutou tak daleko, takže
Definujte vyhrazené pole ScrollValue
pro uložení množství posouvání.
Mouse.scroll
Poté můžete v daném okamžiku získat posunutou částku, takže tuto hodnotu nashromáždíme.
Pokud ScrollValue
například dvakrát posunete kolečkem, zůstane zachováno množství posunutého kolečka.
Zbytek je zobrazení této hodnoty jako textu.
Nyní spusťte hru a roztočte kolo. Myslím, že uvidíte množství posouvání.
Mouse.scroll
Vector2
má hodnotu , ale pokud se jedná o vertikální rolovací kolečko, myslím, že bude nastavena pouze hodnota Y.
Mimochodem, pokud se posunete dolů, hodnota půjde nahoru a dolů ve 120 jednotkách. Jedná se o hodnotu definovanou systémem Windows, takže číslo se může měnit v závislosti na jiných prostředích a typech myší.
Určení, kdy je kliknuto na tlačítko myši
Zde bych chtěl přesunout ukázku, která zobrazuje text v pozici, kde je kliknuto levým tlačítkem myši.
Načasování kliknutí může být určeno vlastnostmi stejným způsobem jako wasPressedThisFrame
klávesové klávesy.
Nejprve umístěte textový objekt pro přesun. Velikost a umístění jsou vhodné.
Vytvořte skript pro proces kliknutí. MouseButtonClick
Název ponechte jako .
Skript vypadá 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;
}
}
}
Provedu proces přesunutí textového objektu na kliknutou pozici. Místní poloha objektu uživatelského rozhraní je souřadnice plátna, takže se liší od polohy myši, což je souřadnice obrazovky.
Vzhledem k tomu, že počátek plátna (0, 0) je uprostřed,RectTransform.sizeDelta
použijte k získání poloviny velikosti plátna.
Počátek souřadnic myši je posunut do středu.
Můžete určit, zda jste klikli nebo ne mouse.xxxxxxxx.wasPressedThisFrame
, a vrátit se pouze true
v okamžiku, kdy jste klikli.
Pokud na tlačítko kliknete a podržíte, bude se vracet, dokud na něj znovu nekliknete false
.
Po EventSystem
uložení skriptu jej připojte k rozhraní . Tentokrát použijeme také Canvas, takže nastavte Canvas a textový objekt.
Zkuste spustit hru a zjistěte, zda se textový objekt přesune do umístění, na které jste klikli. Vzhledem k tomu, že zpracovává pouze okamžik klepnutí, textový objekt se nepohybuje, i když při kliknutí pohnete myší.
Určete, kdy uvolníte tlačítko myši
I když není uveden jako ukázka, wasPressedThisFrame
můžete určit načasování vydání pomocí pomocí rozhraní wasReleasedThisFrame
.
Posuďte při kliknutí na tlačítko
mouse.xxxxxxxx.isPressed
se budete vracet, dokud true
kliknete na tlačítko.
Zde bych chtěl otočit text při stisknutí pravého tlačítka.
Skript je přesměrován z levého kliknutí. Upravte jej následujícím způsobem:
// 省略
public class MouseButtonClick : MonoBehaviour
{
// 省略
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// 右ボタンを押している間はオブジェクトを回転させる
if (mouse.rightButton.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
Po uložení skriptu jej spusťte a zkontrolujte jej. Objekt pokračuje v otáčení tak dlouho, dokud je stisknuto pravé tlačítko.