ماؤس کے ساتھ کام کرنا (ان پٹ سسٹم پیکیج ورژن)

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2020.3.25f1
ان پٹ سسٹم پیکیج
  • 1.2.0

اس ٹوٹکے کے لئے ضروری شرائط

مندرجہ ذیل ترتیبات اس ٹپ کی وضاحت کے لئے بنیاد کے طور پر پیشگی بنائی گئی ہیں۔

ماؤس کی پوزیشن حاصل کریں

گیم اسکرین Mouse.position پر ماؤس کی پوزیشن کس میں حاصل کی جاسکتی ہے۔ یہاں ، میں مقام کی معلومات ظاہر کرنا چاہتا ہوں۔

کینوس پر ایک ٹیکسٹ آبجیکٹ رکھتا ہے جو ماؤس کی معلومات کو ظاہر کرتا ہے۔

ماؤس کی معلومات اسکرپٹنگ کے ذریعہ بازیافت کی جاتی ہے۔ اس صورت میں ، ہم پروجیکٹ MouseInfo میں کال کردہ اسکرپٹ فائل بنائیں گے۔

مندرجہ ذیل اسکرپٹ درج کریں:

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آپ فی الحال فعال ماؤس کے بارے میں معلومات حاصل کرسکتے ہیں۔ Mouse.position ماؤس کی موجودہ پوزیشن ہے ، لہذا ReadValue آپ طریقہ کار کا استعمال کرکے Vector2 شکل میں قیمت حاصل کرسکتے ہیںVector2Control۔

حاصل کردہ ماؤس پوزیشن کو ٹیکسٹ آبجیکٹ پر سیٹ کیا گیا ہے۔ StringBuilder استعمال کرنے کے بارے میں بہت زیادہ فکر نہ کریں ، جیسا کہ یہ بعد میں شامل کرنے کے لئے ہے۔

اسکرپٹ کو محفوظ کرنے کے بعد EventSystem ، اسے آبجیکٹ سے منسلک کریں۔ ٹیکسٹ آبجیکٹ کے بارے میں معلومات ظاہر کرنے کے لئے ٹیکسٹ آبجیکٹ کو سیٹ کیا گیا ہے۔

گیم چلانے اور ماؤس کو حرکت دینے کی کوشش کریں۔ مجھے لگتا ہے کہ ماؤس کی پوزیشن حقیقی وقت میں اسکرین پر ظاہر ہوگی۔

ویسے ، ماؤس پوزیشن کے کوآرڈینیٹس گیم اسکرین کے نچلے بائیں کونے میں (0، 0) ہیں۔ جب آپ دائیں طرف جاتے ہیں تو ایکس محور (بائیں اور دائیں) مثبت ہوجاتا ہے اور بائیں طرف جاتے ہوئے منفی ہوجاتا ہے۔ جب آپ اوپر جاتے ہیں تو وائی محور (اوپر اور نیچے) مثبت ہوجاتا ہے اور نیچے جاتے ہوئے منفی ہوجاتا ہے۔ لہذا ، ہر محور کی زیادہ سے زیادہ قیمت گیم اسکرین کے اوپری دائیں کونے میں ہے۔

اس کے علاوہ ، براہ کرم نوٹ کریں کہ یہ کوآرڈینیٹ صرف گیم اسکرین کی جگہ کے لئے ہے ، لہذا گیم میں پکسل سائز اور ڈیوائس کے اسکرین کوآرڈینیٹس کا پکسل سائز میل نہیں کھا سکتا ہے۔

پہیے کے سکرول کی مقدار حاصل کریں

ماؤس وہیل کے ساتھ سکرولنگ کو اسکرپٹ میں بھی بازیافت کیا جاسکتا ہے۔ سکرولنگ کی رقم Mouse.scroll کے ساتھ حاصل کیا جا سکتا ہے. ماؤس پوزیشن کے برعکس ، آپ صرف رقم کو فوری طور پر سکرول کرسکتے ہیں۔ نوٹ کریں کہ آپ یہ نہیں جان سکتے ہیں کہ آپ نے کتنی دور تک سکرول کیا ہے۔

میں اسے پہلے بنائے MouseInfo گئے سکرول آپریشن میں شامل کروں گا۔

// 省略

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 اب تک سکرول کی گئی رقم کو نہیں پکڑتا ہے، لہذا سکرولنگ کی رقم کو رکھنے کے لئے ایک وقف فیلڈ ScrollValue کی وضاحت کریں۔

Mouse.scroll پھر ، آپ اس وقت سکرول شدہ رقم حاصل کرسکتے ہیں ، لہذا ہم اس قیمت کو جمع کریں گے۔ مثال کے طور پر ، اگر ScrollValue آپ پہیے کو دو بار سکرول کرتے ہیں تو ، دو بار سکرول کرنے کی مقدار برقرار رہے گی۔

باقی اس قدر کو متن کے طور پر ظاہر کرنا ہے۔

اب کھیل چلائیں اور پہیہ گھمائیں۔ مجھے لگتا ہے کہ آپ سکرولنگ کی مقدار دیکھیں گے۔

Mouse.scrollVector2 اس کی ایک قدر ہے ، لیکن اگر یہ صرف عمودی سکرول والا پہیہ ہے تو ، مجھے لگتا ہے کہ صرف Y کی قیمت مقرر کی جائے گی۔

ویسے، اگر آپ نیچے سکرول کرتے ہیں، تو قیمت 120 یونٹوں میں اوپر اور نیچے جائے گی. یہ ونڈوز کے ذریعہ بیان کردہ ایک قدر ہے ، لہذا دوسرے ماحول اور ماؤس کی اقسام پر منحصر تعداد تبدیل ہوسکتی ہے۔

تعین کریں کہ ماؤس بٹن پر کب کلک کیا جاتا ہے

یہاں ، میں ایک نمونہ منتقل کرنا چاہتا ہوں جو متن کو اس پوزیشن پر ظاہر کرتا ہے جہاں بائیں ماؤس بٹن پر کلک کیا جاتا ہے۔ کلک کرنے کے وقت کا تعین کی بورڈ چابیوں کی طرح wasPressedThisFrame خصوصیات کے ذریعہ کیا جاسکتا ہے۔

سب سے پہلے ، حرکت کرنے کے لئے ایک ٹیکسٹ آبجیکٹ رکھیں۔ سائز اور پوزیشن مناسب ہیں.

کلک کے عمل کے لئے اسکرپٹ بنائیں۔ MouseButtonClick نام کو اس طرح چھوڑ دیں.

اسکرپٹ اس طرح نظر آتا ہے:

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

میں ٹیکسٹ آبجیکٹ کو کلک کردہ پوزیشن میں منتقل کرنے کا عمل انجام دیتا ہوں۔ یو آئی آبجیکٹ کی مقامی پوزیشن کینوس کا کوآرڈینیٹ ہے ، لہذا یہ ماؤس کی پوزیشن سے مختلف ہے ، جو اسکرین کوآرڈینیٹ ہے۔

چونکہ کینوس (0، 0) کی اصل مرکز میں ہے ،RectTransform.sizeDelta لہذا کینوس کا نصف سائز حاصل کرنے کے لئے استعمال کریں۔ ماؤس کوآرڈینیٹس کی اصل کو مرکز میں منتقل کیا جاتا ہے۔

آپ اس بات کا تعین کرسکتے ہیں کہ آپ نے کلک کیا ہے یا نہیں mouse.xxxxxxxx.wasPressedThisFrame ، اور صرف true اسی لمحے واپس آئیں جب آپ کلک کرتے ہیں۔ اگر آپ بٹن پر کلک کرتے ہیں اور پکڑتے ہیں تو ، یہ اس وقت تک واپس آتا رہے گا جب تک کہ آپ false اسے دوبارہ کلک نہیں کرتے۔

اسکرپٹ کو محفوظ کرنے کے بعد EventSystem ، اسے منسلک کریں۔ اس بار ، ہم کینوس بھی استعمال کریں گے ، لہذا کینوس اور ٹیکسٹ آبجیکٹ سیٹ کریں۔

گیم چلانے کی کوشش کریں اور دیکھیں کہ آیا ٹیکسٹ آبجیکٹ کلک کردہ مقام پر منتقل ہوتا ہے یا نہیں۔ چونکہ یہ صرف اس لمحے پر عمل کرتا ہے جب اس پر کلک کیا جاتا ہے ، لہذا ٹیکسٹ آبجیکٹ حرکت نہیں کرتا ہے یہاں تک کہ اگر آپ کلک کرتے وقت ماؤس کو حرکت دیتے ہیں۔

اس بات کا تعین کریں کہ آپ ماؤس بٹن کب جاری کرتے ہیں

اگرچہ یہ نمونے کے طور پر درج نہیں ہے ، wasPressedThisFrame آپ اس کے بجائے استعمال کرکے ریلیز کے وقت کا تعین کرسکتے ہیں wasReleasedThisFrame ۔

بٹن پر کلک کرتے ہوئے فیصلہ کریں

mouse.xxxxxxxx.isPressed جب تک آپ بٹن پر کلک کرتے ہیں تب تک true واپس آنا جاری رکھیں۔ یہاں ، میں دائیں بٹن دباتے ہوئے متن کو گھمانا چاہتا ہوں۔

اسکرپٹ کو بائیں کلک سے موڑ دیا گیا ہے۔ اس میں حسب ذیل ترمیم کریں:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

اسکرپٹ کو محفوظ کرنے کے بعد ، اسے چیک کرنے کے لئے چلائیں۔ جب تک دائیں بٹن دبایا جاتا ہے آبجیکٹ گھومتا رہتا ہے۔