Fare ile çalışma (Giriş Sistemi Paketi Sürümü)

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2020.3.25f1
Giriş Sistemi Paketi
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

Fare konumunu alma

Farenin oyun ekranındaki Mouse.position konumu . Burada konum bilgilerini görüntülemek istiyorum.

Tuvale fare bilgilerini görüntüleyen bir metin nesnesi yerleştirir.

Fare bilgileri komut dosyası ile alınır. Bu durumda, adlı bir komut dosyası oluşturacağız proje MouseInfo .

Komut dosyasını aşağıdaki gibi girin:

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Şu anda aktif olan fare hakkında bilgi alabilirsiniz. Mouse.position, içinde farenin geçerli konumuna sahiptir, böylece ReadValue yöntemi kullanarak Vector2Control formdaki Vector2 değeri alabilirsiniz.

Alınan fare konumu bir metin nesnesine ayarlanır. StringBuilder Kullanma konusunda çok fazla endişelenmeyin , daha sonra eklemek için olduğu gibi.

Komut dosyasını kaydettikten sonra EventSystem nesneye ekleyin. Metin Nesnesi, hakkında bilgi görüntülemek için bir metin nesnesine ayarlanır.

Oyunu çalıştırmayı ve fareyi hareket ettirmeyi deneyin. Fare pozisyonunun ekranda gerçek zamanlı olarak görüneceğini düşünüyorum.

Bu arada, fare pozisyonunun koordinatları oyun ekranının sol alt köşesinde (0, 0) 'dır. X ekseni (sol ve sağ) sağa gittiğinizde pozitif, sola gittiğinizde negatif olur. Y ekseni (yukarı ve aşağı) yukarı çıktıkça pozitif, aşağı indikçe negatif olur. Bu nedenle, her eksenin maksimum değeri oyun ekranının sağ üst köşesindedir.

Ayrıca, bu koordinatın yalnızca oyun ekran alanı için olduğunu, bu nedenle oyundaki piksel boyutunun ve cihazın ekran koordinatlarının piksel boyutunun eşleşmeyebileceğini lütfen unutmayın.

Tekerleğin kaydırma miktarını alın

Fare tekerleği ile kaydırma da komut dosyasında alınabilir. Kaydırma miktarı Mouse.scroll ile elde edilebilir. Fare konumundan farklı olarak, miktarı yalnızca anında kaydırabilirsiniz. Ne kadar kaydırdığınızı anlayamayacağınızı unutmayın.

Daha önce oluşturduğum MouseInfo kaydırma işlemine ekleyeceğim.

// 省略

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 şimdiye kadar kaydırılan miktarı tutmaz, bu nedenle Kaydırma miktarını tutmak için ayrılmış bir alan ScrollValue tanımlayın.

Mouse.scroll Ardından, kaydırılan tutarı o anda alabilirsiniz, böylece bu değeri biriktiririz. Örneğin, tekerleği iki kez kaydırırsanız, ScrollValue iki kez kaydırılan miktar korunur.

Gerisi, bu değeri metin olarak görüntülemektir.

Şimdi oyunu çalıştırın ve tekerleği döndürün. Sanırım kaydırma miktarını göreceksiniz.

Mouse.scrollVector2'nin bir değeri vardır, ancak dikey bir kaydırma tekerleği ise, yalnızca Y'nin değerinin ayarlanacağını düşünüyorum.

Bu arada, aşağı kaydırırsanız, değer 120 birimde yukarı ve aşağı gidecektir. Bu, Windows tarafından tanımlanan bir değerdir, bu nedenle sayı diğer ortamlara ve fare türlerine bağlı olarak değişebilir.

Bir fare düğmesinin ne zaman tıklatılacağını belirleme

Burada, farenin sol tuşuna tıklandığı konumda metin görüntüleyen bir örneği taşımak istiyorum. Tıklamanın zamanlaması, klavye tuşlarıyla aynı şekilde wasPressedThisFrame özellikler tarafından belirlenebilir.

İlk olarak, taşımak için bir metin nesnesi yerleştirin. Boyut ve konum uygundur.

Tıklama işlemi için bir komut dosyası oluşturun. MouseButtonClick Adı olarak bırakın.

Komut dosyası şöyle görünü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;
    }
  }
}

Metin nesnesini tıklatılan konuma taşıma işlemini gerçekleştiriyorum. UI nesnesinin yerel konumu Kanvasın koordinatıdır, bu nedenle ekran koordinatı olan farenin konumundan farklıdır.

Kanvasın kökeni (0, 0) merkezde olduğundan,RectTransform.sizeDelta Kanvasın yarısının boyutunu elde etmek için kullanın. Fare koordinatlarının kaynağı merkeze kaydırılır.

Tıklatıp mouse.xxxxxxxx.wasPressedThisFrame tıklatmadığınızı belirleyebilir ve yalnızca true tıklattığınız ana dönebilirsiniz. Düğmeyi tıklatıp basılı tutarsanız, siz false yeniden tıklatana kadar düğme geri dönmeye devam eder.

Komut dosyasını kaydettikten sonra EventSystem konumuna ekleyin. Bu sefer Kanvas'ı da kullanacağız, bu yüzden Kanvas'ı ve metin nesnesini ayarlayın.

Oyunu çalıştırmayı deneyin ve metin nesnesinin tıklanan konuma taşınıp taşınmadığına bakın. Yalnızca tıklatıldığı anı işlediğinden, tıklatırken fareyi hareket ettirseniz bile metin nesnesi hareket etmez.

Fare düğmesini ne zaman bıraktığınızı belirleme

Örnek olarak listelenmese de, wasPressedThisFrame serbest bırakma zamanlamasını yerine wasReleasedThisFrame kullanarak belirleyebilirsiniz.

Düğmeye tıklarken yargıç

mouse.xxxxxxxx.isPressed düğmesini tıklattığınız sürece true geri dönmeye devam etmek için. Burada, sağ tuşa basarken metni döndürmek istiyorum.

Komut dosyası sol tıklatılandan yönlendirilir. Aşağıdaki gibi değiştirin:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Komut dosyasını kaydettikten sonra, kontrol etmek için çalıştırın. Sağ düğmeye basıldığı sürece nesne dönmeye devam eder.