Veikimas su pele (įvesties sistemos paketo versija)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Įvesties sistemos paketas
  • 1.2.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Pelės padėties gavimas

Pelės padėtį žaidimo ekrane galima Mouse.position gauti . Čia norėčiau parodyti vietos informaciją.

Drobėje įdedamas teksto objektas, rodantis pelės informaciją.

Pelės informacija nuskaitoma pagal scenarijų. Tokiu atveju sukursime scenarijaus failą, vadinamą projekte MouseInfo .

Įveskite scenarijų taip:

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.currentGalite gauti informacijos apie šiuo metu aktyvią pelę. Mouse.position turi dabartinę pelės padėtį , todėl ReadValue galite gauti reikšmę formoje Vector2 naudodami Vector2Control metodą.

Įgyta pelės padėtis nustatoma kaip teksto objektas. StringBuilder Per daug nesijaudinkite dėl naudojimo , nes tai skirta pridėti vėliau.

Įrašę EventSystem scenarijų, pridėkite jį prie objekto. Teksto objektas nustatomas kaip teksto objektas, kad būtų rodoma informacija apie.

Pabandykite paleisti žaidimą ir perkelti pelę. Manau, kad pelės padėtis ekrane pasirodys realiuoju laiku.

Beje, pelės padėties koordinatės yra (0, 0) apatiniame kairiajame žaidimo ekrano kampe. X ašis (kairė ir dešinė) tampa teigiama, kai einate į dešinę, ir neigiama, kai einate į kairę. Y ašis (aukštyn ir žemyn) tampa teigiama, kai einate aukštyn, ir neigiama, kai einate žemyn. Todėl maksimali kiekvienos ašies vertė yra viršutiniame dešiniajame žaidimo ekrano kampe.

Be to, atkreipkite dėmesį, kad ši koordinatė skirta tik žaidimo ekrano erdvei, todėl pikselių dydis žaidime ir įrenginio ekrano koordinačių pikselių dydis gali nesutapti.

Gaukite rato slinkties kiekį

Slinkimą pelės ratuku taip pat galima gauti scenarijuje. Slinkimo sumą Mouse.scroll galima gauti naudojant . Skirtingai nuo pelės padėties, sumą galite slinkti tik akimirksniu. Atminkite, kad negalite sužinoti, kiek toli slinkote.

Pridėsiu jį prie anksčiau sukurtos MouseInfo slinkties operacijos.

// 省略

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 nelaiko iki šiol slinktos sumos, todėl Apibrėžkite specialų lauką ScrollValue , kuriame būtų laikoma slenkanti suma.

Mouse.scroll Tada tuo metu galite gauti slinktą sumą, todėl mes sukaupsime tą vertę. Pavyzdžiui, jei ScrollValue du kartus slinksite ratuką, du kartus slinkta suma bus išsaugota.

Likusi dalis yra rodyti šią vertę kaip tekstą.

Dabar paleiskite žaidimą ir sukite ratą. Manau, kad pamatysite slinkimo kiekį.

Mouse.scrollVector2 turi reikšmę , bet jei tai yra vertikalus tik slinkties ratukas, manau, bus nustatyta tik Y vertė.

Beje, jei slinksite žemyn, vertė pakils ir sumažės 120 vienetų. Tai yra "Windows" apibrėžta reikšmė, todėl skaičius gali keistis priklausomai nuo kitų aplinkų ir pelių tipų.

Nustatymas, kada spustelėjamas pelės mygtukas

Čia norėčiau perkelti pavyzdį, kuriame tekstas rodomas toje vietoje, kur spustelėjamas kairysis pelės mygtukas. Paspaudimo laiką galima nustatyti pagal savybes taip pat, kaip ir wasPressedThisFrame klaviatūros klavišus.

Pirmiausia įdėkite teksto objektą judėjimui. Dydis ir padėtis yra tinkami.

Sukurkite paspaudimo proceso scenarijų. MouseButtonClick Palikite pavadinimą kaip .

Scenarijus atrodo taip:

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

Atlieku teksto objekto perkėlimo į spustelėtą padėtį procesą. Vietinė vartotojo sąsajos objekto padėtis yra drobės koordinatė, todėl ji skiriasi nuo pelės padėties, kuri yra ekrano koordinatė.

Kadangi drobės kilmė (0, 0) yra centre, naudokite,RectTransform.sizeDelta kad gautumėte pusę drobės dydžio. Pelės koordinačių kilmė perkeliama į centrą.

Galite nustatyti, ar spustelėjote, ar ne mouse.xxxxxxxx.wasPressedThisFrame , ir pateikti tik true tą akimirką, kai spustelėjote. Jei spustelėsite ir palaikysite mygtuką, jis grįš tol, kol spustelėsite false jį dar kartą.

Įrašę EventSystem scenarijų, pridėkite jį prie . Šį kartą taip pat naudosime Drobę, todėl nustatykite Drobę ir teksto objektą.

Pabandykite paleisti žaidimą ir pažiūrėkite, ar teksto objektas juda į spustelėtą vietą. Kadangi jis apdorojamas tik tada, kai jį spustelėjama, teksto objektas nejuda, net jei spustelėdami judinate pelę.

Nustatymas, kada atleidžiate pelės mygtuką

Nors jis nėra nurodytas kaip pavyzdys, wasPressedThisFrame išleidimo laiką galite nustatyti naudodami vietoj wasReleasedThisFrame .

Teisėjas spustelėjus mygtuką

mouse.xxxxxxxx.isPressed , kad galėtumėte grįžti tol, kol true spustelėsite mygtuką. Čia norėčiau pasukti tekstą paspausdamas dešinįjį mygtuką.

Scenarijus nukreipiamas nuo kairiojo spustelėjimo. Iš dalies pakeiskite jį taip:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Išsaugoję scenarijų, paleiskite jį, kad patikrintumėte. Objektas ir toliau sukasi tol, kol paspaudžiamas dešinysis mygtukas.