פעולה עם העכבר (גירסת חבילת מערכת קלט)

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 2020.3.25F1
חבילת מערכת קלט
  • 1.2.0

תנאים מוקדמים לטיפ זה

ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.

קבל את מיקום העכבר

המיקום של העכבר על מסך המשחק ניתן Mouse.position להשיג ב . כאן, ברצוני להציג את פרטי המיקום.

ממקם אובייקט טקסט בבד הציור המציג נתוני עכבר.

מידע העכבר מאוחזר באמצעות scripting. במקרה זה, ניצור קובץ סקריפט שנקרא בפרויקט 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 שמירת קובץ ה- Script, צרף אותו ל- . הפעם, נשתמש גם בדף האפליקציה, לכן הגדר את דף הציור ואת אובייקט הטקסט.

נסה להפעיל את המשחק ולראות אם אובייקט הטקסט עובר למיקום שנלחץ. מכיוון שהוא מעבד רק את רגע הלחיצה עליו, אובייקט הטקסט אינו זז גם אם אתה מזיז את העכבר תוך כדי לחיצה.

קביעה מתי תשחרר את לחצן העכבר

למרות שהוא אינו מופיע כמדגם, wasPressedThisFrame באפשרותך לקבוע את עיתוי השחרור באמצעות שימוש במקום wasReleasedThisFrame ב- .

שפט תוך כדי לחיצה על הלחצן

mouse.xxxxxxxx.isPressed כדי להמשיך לחזור כל עוד true תלחץ על הלחצן. כאן, אני רוצה לסובב את הטקסט תוך לחיצה על הכפתור הימני.

הסקריפט מוסט מהסקריפט בלחיצה שמאלית. שנה אותו באופן הבא:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

לאחר שמירת הסקריפט, הפעל אותו כדי לבדוק אותו. האובייקט ממשיך להסתובב כל עוד לוחצים על הלחצן הימני.