عامل با ماوس (ورودی سیستم نسخه بسته)

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 11
ویرایشگر یونیتی
  • دانلود: 2020.3.25f1
بسته سیستم ورودی
  • 1.2.0

پیشنیازهای این نکته

تنظیمات زیر از قبل به عنوان یک فرض برای توصیف این نکته ساخته شده است.

موقعیت موشی را بدست اورید

موقعیت ماوس بر روی صفحه نمایش بازی را می توان Mouse.position در به دست امده. در اینجا، من می خواهم اطلاعات مکان را نمایش دهم.

یک شیء متنی را روی Canvas قرار می دهد که اطلاعات ماوس را نمایش می دهد.

اطلاعات ماوس با اسکریپت بازیابی می شود. در این مورد، ما یک فایل اسکریپت به نام در پروژه 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 ذخیره اسکریپت، ان را به شیء متصل کنید. Text Object به یک شیء متنی تنظیم شده است تا اطلاعات مربوط به ان نمایش داده شود.

سعی کنید در حال اجرا بازی و حرکت ماوس. من فکر می کنم موقعیت ماوس بر روی صفحه نمایش در زمان واقعی ظاهر می شود.

به هر حال، مختصات موقعیت ماوس (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 واحد بالا و پایین می رود. این یک مقدار تعریف شده توسط ویندوز است، بنابراین تعداد ممکن است بسته به محیط های دیگر و انواع ماوس تغییر کند.

تعیین زمانی که یک دکمه موشی کلیک شده است

در اینجا، من می خواهم یک نمونه را حرکت دهم که متن را در موقعیتی که دکمه سمت چپ ماوس کلیک می کند نمایش می دهد. زمان کلیک کردن را می توان با خواص به همان شیوه 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;
    }
  }
}

من فرایند انتقال شیء متن به موقعیت کلیک شده را انجام می دهم. موقعیت محلی شیء UI مختصات Canvas است، بنابراین با موقعیت ماوس که مختصات صفحه نمایش است متفاوت است.

از انجا که منشا بوم (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);
    }
  }
}

پس از ذخیره اسکریپت، ان را اجرا کنید تا ان را بررسی کنید. این شی تا زمانی که دکمه سمت راست فشار داده شود، به چرخش ادامه می دهد.