Betjening med musen (Input System Package Version)
Miljø til bekræftelse
- Windows
-
- Windows 11
- Enhedslistens redaktør
-
- 2020.3.25f1
- Input System Pakke
-
- 1.2.0
Forudsætninger for dette tip
Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.
Få musens position
Musens position på spilskærmen kan Mouse.position
fås i .
Her vil jeg gerne vise placeringsoplysningerne.
Placerer et tekstobjekt på lærredet, der viser museoplysninger.
Musens oplysninger hentes ved hjælp af scripting.
I dette tilfælde opretter vi en scriptfil kaldet i projektet MouseInfo
.
Indtast scriptet som følger:
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
Du kan få oplysninger om den aktuelt aktive mus.
Mouse.position
har musens aktuelle position i , så ReadValue
du kan få værdien i formularen ved Vector2
hjælp Vector2Control
af metoden.
Den erhvervede museposition er indstillet til et tekstobjekt.
StringBuilder
Du skal ikke bekymre dig for meget om at bruge , da det er til tilføjelse senere.
Når EventSystem
du har gemt scriptet, skal du vedhæfte det til objektet.
Tekstobjekt er indstillet til et tekstobjekt, der skal vises oplysninger om.
Prøv at køre spillet og flytte musen. Jeg tror, at musens position vises på skærmen i realtid.
Forresten er koordinaterne for musepositionen (0, 0) i nederste venstre hjørne af spilskærmen. X-aksen (venstre og højre) bliver positiv, når du går til højre, og negativ, når du går til venstre. Y-aksen (op og ned) bliver positiv, når du går op, og negativ, når du går ned. Derfor er den maksimale værdi af hver akse i øverste højre hjørne af spilskærmen.
Bemærk også, at denne koordinat kun er for spillets skærmplads, så pixelstørrelsen i spillet og pixelstørrelsen på enhedens skærmkoordinater stemmer muligvis ikke overens.
Få mængden af rulle på hjulet
Rulning med musehjulet kan også hentes i scriptet.
Rullemængden Mouse.scroll
kan fås med .
I modsætning til musepositionen kan du kun få mængden rullet øjeblikkeligt.
Bemærk, at du ikke kan få, hvor langt du har rullet.
Jeg vil tilføje det til den rulleoperation, jeg oprettede MouseInfo
tidligere.
// 省略
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
holder ikke det rullede beløb indtil videre, så
Definer et dedikeret felt ScrollValue
til at holde rullemængden.
Mouse.scroll
Derefter kan du få det rullede beløb i det øjeblik, så vi akkumulerer denne værdi.
For eksempel, hvis ScrollValue
du ruller hjulet to gange, bevares mængden af rullet to gange.
Resten er at vise denne værdi som tekst.
Kør nu spillet og drej hjulet. Jeg tror, du vil se mængden af rulning.
Mouse.scroll
Vector2
har en værdi på , men hvis det er et lodret rullehjul, tror jeg, at kun værdien af Y vil blive indstillet.
Forresten, hvis du ruller ned, vil værdien gå op og ned i 120 enheder. Dette er en værdi, der er defineret af Windows, så antallet kan ændre sig afhængigt af andre miljøer og musetyper.
Bestem, hvornår der klikkes med en museknap
Her vil jeg gerne flytte en prøve, der viser tekst på det sted, hvor der klikkes på venstre museknap.
Tidspunktet for klik kan bestemmes af egenskaber på samme måde som wasPressedThisFrame
tastaturtaster.
Placer først et tekstobjekt til flytning. Størrelsen og placeringen er passende.
Opret et script til klikprocessen. MouseButtonClick
Lad navnet være .
Scriptet ser sådan ud:
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;
}
}
}
Jeg udfører processen med at flytte tekstobjektet til den klikkede position. Den lokale position af UI-objektet er koordinaten for lærredet, så det er forskelligt fra musens position, som er skærmkoordinaten.
Da lærredets oprindelse (0, 0) er i midten,RectTransform.sizeDelta
skal du bruge til at få halvdelen af lærredets størrelse.
Oprindelsen af musekoordinaterne skiftes til midten.
Du kan bestemme, om du klikkede eller ej mouse.xxxxxxxx.wasPressedThisFrame
, og kun true
returnere det øjeblik, du klikker.
Hvis du klikker på knappen og holder den nede, fortsætter den med at vende tilbage, indtil du false
klikker på den igen.
Når EventSystem
du har gemt scriptet, skal du vedhæfte det til . Denne gang vil vi også bruge Canvas, så indstil lærredet og tekstobjektet.
Prøv at køre spillet og se, om tekstobjektet flyttes til den klikkede placering. Da det kun behandler det øjeblik, det klikkes på, bevæger tekstobjektet sig ikke, selvom du bevæger musen, mens du klikker.
Find ud af, hvornår du slipper museknappen
Selvom det ikke er angivet som et eksempel, wasPressedThisFrame
kan du bestemme tidspunktet for frigivelse ved at bruge i stedet for wasReleasedThisFrame
.
Bedøm, mens du klikker på knappen
mouse.xxxxxxxx.isPressed
for at fortsætte med at vende tilbage, så længe true
du klikker på knappen.
Her vil jeg gerne rotere teksten, mens jeg trykker på højre knap.
Scriptet omdirigeres fra venstreklikket. Det ændres som følger:
// 省略
public class MouseButtonClick : MonoBehaviour
{
// 省略
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// 右ボタンを押している間はオブジェクトを回転させる
if (mouse.rightButton.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
Når du har gemt scriptet, skal du køre det for at kontrollere det. Objektet fortsætter med at rotere, så længe der trykkes på højre knap.