Arbeta med musen (Input System Package Version)
Verifiering miljö
- Windows
-
- Fönster 11
- Unity-redaktör
-
- 2020.3.25F1
- Paket för inmatningssystem
-
- 1.2.0
Förutsättningar för det här tipset
Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.
Få muspositionen
Musens position på spelskärmen kan Mouse.position
erhållas i .
Här vill jag visa platsinformationen.
Placerar ett textobjekt på arbetsytan som visar musinformation.
Musinformation hämtas genom skript.
I det här fallet skapar vi en skriptfil som heter i projektet MouseInfo
.
Ange skriptet enligt följande:
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å information om den aktiva musen.
Mouse.position
har musens aktuella position i , så ReadValue
att du kan få värdet i formuläret med hjälp Vector2Control
av Vector2
metoden.
Den förvärvade muspositionen är inställd på ett textobjekt.
StringBuilder
Oroa dig inte för mycket om att använda , eftersom det är för att lägga till senare.
När du har EventSystem
sparat skriptet kopplar du det till objektet.
Textobjekt är inställt på ett textobjekt att visa information om.
Prova att köra spelet och flytta musen. Jag tror att muspositionen kommer att visas på skärmen i realtid.
Förresten är koordinaterna för muspositionen (0, 0) i nedre vänstra hörnet av spelskärmen. X-axeln (vänster och höger) blir positiv när du går till höger och negativ när du går till vänster. Y-axeln (upp och ner) blir positiv när du går upp och negativ när du går ner. Därför är det maximala värdet för varje axel i det övre högra hörnet på spelskärmen.
Observera också att denna koordinat endast är för spelskärmsutrymmet, så pixelstorleken i spelet och pixelstorleken på enhetens skärmkoordinater kanske inte matchar.
Få mängden rullning på hjulet
Rullning med mushjulet kan också hämtas i skriptet.
Rullningsmängden Mouse.scroll
kan erhållas med .
Till skillnad från muspositionen kan du bara få mängden rullad omedelbart.
Observera att du inte kan se hur långt du har rullat.
Jag lägger till den i rullningsoperationen jag skapade MouseInfo
tidigare.
// 省略
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
håller inte det rullade beloppet hittills, så
Definiera ett dedikerat fält ScrollValue
för rullningsmängden.
Mouse.scroll
Sedan kan du få det rullade beloppet just nu, så vi kommer att ackumulera det värdet.
Om du till exempel ScrollValue
rullar hjulet två gånger behålls mängden rullat två gånger.
Resten är att visa det här värdet som text.
Kör nu spelet och snurra hjulet. Jag tror att du kommer att se mängden rullning.
Mouse.scroll
Vector2
har värdet , men om det är ett vertikalt rullningshjul tror jag att bara värdet på Y kommer att ställas in.
Förresten, om du rullar ner, kommer värdet att gå upp och ner i 120 enheter. Detta är ett värde som definieras av Windows, så antalet kan ändras beroende på andra miljöer och mustyper.
Bestämma när du klickar på en musknapp
Här skulle jag vilja flytta ett prov som visar text på den plats där vänster musknapp klickas.
Tidpunkten för att klicka kan bestämmas av egenskaper på samma sätt som wasPressedThisFrame
tangentbordstangenter.
Placera först ett textobjekt för att flytta. Storleken och positionen är lämpliga.
Skapa ett skript för klickprocessen. MouseButtonClick
Lämna namnet som .
Skriptet ser ut så här:
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;
}
}
}
Jag utför processen att flytta textobjektet till den klickade positionen. UI-objektets lokala position är koordinaten för arbetsytan, så den skiljer sig från musens position, som är skärmkoordinaten.
Eftersom Canvas ursprung (0, 0) ligger i mitten,RectTransform.sizeDelta
använd för att få hälften av storleken på duken.
Muskoordinaternas ursprung flyttas till mitten.
Du kan bestämma om du klickade eller inte mouse.xxxxxxxx.wasPressedThisFrame
och bara true
returnera det ögonblick du klickade.
Om du klickar och håller ned knappen fortsätter den att återvända tills du false
klickar på den igen.
När du har EventSystem
sparat skriptet kopplar du det till . Den här gången kommer vi också att använda Canvas, så ställ in Canvas och textobjektet.
Prova att köra spelet och se om textobjektet flyttas till den klickade platsen. Eftersom det bara bearbetar det ögonblick det klickas, rör sig textobjektet inte även om du flyttar musen medan du klickar.
Bestämma när du släpper musknappen
Även om det inte visas som ett exempel wasPressedThisFrame
kan du bestämma tidpunkten för frisläppandet genom att använda i stället för wasReleasedThisFrame
.
Domare medan du klickar på knappen
mouse.xxxxxxxx.isPressed
för att fortsätta att återvända så länge true
du klickar på knappen.
Här vill jag rotera texten medan jag trycker på höger knapp.
Skriptet omdirigeras från vänsterklicket. Ändra det enligt följande:
// 省略
public class MouseButtonClick : MonoBehaviour
{
// 省略
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// 右ボタンを押している間はオブジェクトを回転させる
if (mouse.rightButton.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
När du har sparat skriptet kör du det för att kontrollera det. Objektet fortsätter att rotera så länge du trycker på höger knapp.