Darbojas ar peli (ievades sistēmas pakotnes versija)

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2020.3.25f1
Ievades sistēmas pakete
  • 1.2.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Iegūt peles pozīciju

Peles pozīciju spēles ekrānā var Mouse.position iegūt . Šeit es vēlētos parādīt atrašanās vietas informāciju.

Novieto uz audekla teksta objektu, kas parāda peles informāciju.

Peles informācija tiek izgūta, izmantojot skriptus. Šajā gadījumā mēs izveidosim skripta failu, ko sauc par projektu MouseInfo .

Ievadiet skriptu šādi:

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.currentJūs varat iegūt informāciju par pašlaik aktīvo peli. Mouse.position ir pašreizējā peles pozīcija , lai ReadValue jūs varētu iegūt vērtību formāVector2, izmantojot šo Vector2Control metodi.

Iegūtā peles pozīcija ir iestatīta uz teksta objektu. StringBuilder Neuztraucieties pārāk daudz par lietošanu , jo tas ir paredzēts pievienošanai vēlāk.

Pēc EventSystem skripta saglabāšanas pievienojiet to objektam. Teksta objekts ir iestatīts uz teksta objektu, lai parādītu informāciju par.

Mēģiniet palaist spēli un pārvietot peli. Es domāju, ka peles pozīcija parādīsies ekrānā reāllaikā.

Starp citu, peles pozīcijas koordinātas ir (0, 0) spēles ekrāna apakšējā kreisajā stūrī. X ass (pa kreisi un pa labi) kļūst pozitīva, kad dodaties pa labi, un negatīva, kad dodaties pa kreisi. Y ass (uz augšu un uz leju) kļūst pozitīva, kad jūs ejat uz augšu, un negatīva, kad jūs ejat uz leju. Tāpēc katras ass maksimālā vērtība atrodas spēles ekrāna augšējā labajā stūrī.

Lūdzu, ņemiet vērā arī to, ka šī koordināta ir paredzēta tikai spēles ekrāna telpai, tāpēc pikseļu izmērs spēlē un ierīces ekrāna koordinātu pikseļu izmērs var nesakrist.

Iegūstiet riteņa ritināšanas daudzumu

Ritināšanu ar peles ritenīti var iegūt arī skriptā. Ritināšanas summu Mouse.scroll var iegūt ar . Atšķirībā no peles pozīcijas, summu var ritināt tikai uzreiz. Ņemiet vērā, ka jūs nevarat nokļūt, cik tālu esat ritinājis.

Es to pievienošu iepriekš izveidotajai MouseInfo ritināšanas operācijai.

// 省略

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 netur līdz šim ritināto summu, tāpēc Definējiet īpašu lauku ScrollValue , kurā turēt ritināšanas summu.

Mouse.scroll Pēc tam jūs varat saņemt ritināto summu tajā brīdī, tāpēc mēs uzkrāsim šo vērtību. Piemēram, ja ScrollValue ritiniet riteni divas reizes, divreiz ritinātā summa tiks saglabāta.

Pārējais ir parādīt šo vērtību kā tekstu.

Tagad palaidiet spēli un grieziet riteni. Es domāju, ka jūs redzēsiet ritināšanas apjomu.

Mouse.scrollVector2 ir vērtība , bet, ja tas ir tikai vertikāls ritināšanas ritenis, es domāju, ka tiks iestatīta tikai Y vērtība.

Starp citu, ja ritiniet uz leju, vērtība iet uz augšu un uz leju 120 vienībās. Šī ir Windows definēta vērtība, tāpēc skaitlis var mainīties atkarībā no citām vidēm un peles tipiem.

Nosakiet, kad tiek noklikšķināts uz peles pogas

Šeit es gribētu pārvietot paraugu, kas parāda tekstu pozīcijā, kur tiek noklikšķināts uz peles kreisās pogas. Noklikšķināšanas laiku var noteikt pēc īpašībām tāpat kā wasPressedThisFrame tastatūras taustiņus.

Vispirms novietojiet teksta objektu pārvietošanai. Izmērs un novietojums ir piemēroti.

Izveidojiet skriptu klikšķa procesam. MouseButtonClick Atstājiet vārdu kā .

Skripts izskatās šādi:

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;
    }
  }
}

Es veicu teksta objekta pārvietošanas procesu uz noklikšķināto pozīciju. UI objekta vietējā pozīcija ir audekla koordināta, tāpēc tā atšķiras no peles pozīcijas, kas ir ekrāna koordināta.

Tā kā audekla izcelsme (0, 0) atrodas centrā, izmantojiet,RectTransform.sizeDelta lai iegūtu pusi no audekla izmēra. Peles koordinātu izcelsme tiek pārvietota uz centru.

Varat noteikt, vai mouse.xxxxxxxx.wasPressedThisFrame noklikšķinājāt, un atgriezt tikai true to brīdi, kad noklikšķinājāt. Ja noklikšķināsit un turēsit pogu, tā turpinās atgriezties, līdz noklikšķināsit false uz tās vēlreiz.

Pēc EventSystem skripta saglabāšanas pievienojiet to . Šoreiz mēs izmantosim arī Canvas, tāpēc iestatiet audeklu un teksta objektu.

Mēģiniet palaist spēli un pārbaudiet, vai teksta objekts pārvietojas uz vietu, uz kuras noklikšķināts. Tā kā tas apstrādā tikai brīdi, kad uz tā tiek noklikšķināts, teksta objekts nepārvietojas pat tad, ja noklikšķinot pārvietojat peli.

Nosakiet, kad atlaižat peles pogu

Lai gan tas nav norādīts kā paraugs, izlaišanas laiku var noteikt, wasPressedThisFrame izmantojot wasReleasedThisFrame .

Tiesnesis, noklikšķinot uz pogas

mouse.xxxxxxxx.isPressed lai turpinātu atgriezties, kamēr true noklikšķināt uz pogas. Šeit es vēlētos pagriezt tekstu, vienlaikus nospiežot labo pogu.

Skripts tiek novirzīts no kreisā klikšķa. Modificējiet to šādi:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // 右ボタンを押している間はオブジェクトを回転させる
    if (mouse.rightButton.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

Pēc skripta saglabāšanas palaidiet to, lai to pārbaudītu. Objekts turpina griezties tik ilgi, kamēr tiek nospiesta labā poga.