Fare ile çalışma (Giriş Sistemi Paketi Sürümü)
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.scroll
Vector2
'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.