التشغيل باستخدام الماوس (إصدار حزمة نظام الإدخال)

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 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) في الزاوية اليسرى السفلية من شاشة اللعبة. يصبح المحور X (اليسار واليمين) موجبا كلما اتجهت إلى اليمين وسالبا كلما اتجهت إلى اليسار. يصبح المحور Y (لأعلى ولأسفل) موجبا كلما ارتفعت وسالبا أثناء النزول. لذلك ، توجد القيمة القصوى لكل محور في الزاوية اليمنى العليا من شاشة اللعبة.

أيضا ، يرجى ملاحظة أن هذا الإحداثي مخصص فقط لمساحة شاشة اللعبة ، لذلك قد لا يتطابق حجم البكسل في اللعبة وحجم البكسل لإحداثيات شاشة الجهاز.

الحصول على مقدار التمرير من العجلة

يمكن أيضا استرداد التمرير باستخدام عجلة الماوس في البرنامج النصي. يمكن الحصول على مبلغ 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 وحدة. هذه قيمة محددة بواسطة Windows ، لذلك قد يتغير الرقم وفقا للبيئات الأخرى وأنواع الماوس.

تحديد وقت النقر فوق زر الماوس

هنا ، أود نقل عينة تعرض النص في الموضع الذي يتم فيه النقر فوق زر الماوس الأيسر. يمكن تحديد توقيت النقر من خلال الخصائص بنفس طريقة 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 حفظ البرنامج النصي، قم بإرفاقه ب . هذه المرة ، سنستخدم أيضا Canvas ، لذا قم بتعيين Canvas وكائن النص.

حاول تشغيل اللعبة ومعرفة ما إذا كان كائن النص ينتقل إلى الموقع الذي تم النقر عليه. نظرا لأنه يعالج فقط لحظة النقر فوقه ، فإن كائن النص لا يتحرك حتى إذا قمت بتحريك الماوس أثناء النقر.

تحديد وقت تحرير زر الماوس

على الرغم من أنه غير مدرج كعينة، wasPressedThisFrame يمكنك تحديد توقيت الإصدار باستخدام بدلا من wasReleasedThisFrame .

احكم أثناء النقر على الزر

mouse.xxxxxxxx.isPressed للاستمرار في العودة طالما true قمت بالنقر فوق الزر. هنا ، أود تدوير النص أثناء الضغط على الزر الأيمن.

يتم تحويل البرنامج النصي من النقر بزر الماوس الأيسر. قم بتعديله على النحو التالي:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

بعد حفظ البرنامج النصي ، قم بتشغيله للتحقق منه. يستمر الكائن في الدوران طالما تم الضغط على الزر الأيمن.