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

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

محیط تایید

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

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

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

تعیین لحظهای که یک کلید خاص فشار داده میشود

هنگامی که یک کلید را فشار می دهید، سعی کنید شیء را حرکت دهید. یک شیء متنی را در Canvas قرار دهید تا حرکت تایید شود. اندازه و موقعیت می تواند مناسب باشد.

دست زدن به صفحه کلید توسط اسکریپت ها انجام می شود. KeyboardOneFrame در این مورد، ما ان را به عنوان ایجاد می کنیم.

کد به این شکل است:

using UnityEngine;
using UnityEngine.UI;           // 追加
using UnityEngine.InputSystem;  // 追加

public class KeyboardOneFrame : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    var transform = TextObject.transform;

    // wasPressedThisFrame は押した瞬間のみ true となる
    // キーは「keyboard[Key.RightArrow]」のような指定の仕方もある
    if (keyboard.leftArrowKey.wasPressedThisFrame)
    {
      transform.Translate(-1, 0, 0);
    }
    if (keyboard.rightArrowKey.wasPressedThisFrame)
    {
      transform.Translate(1, 0, 0);
    }
    if (keyboard.upArrowKey.wasPressedThisFrame)
    {
      transform.Translate(0, 1, 0);
    }
    if (keyboard.downArrowKey.wasPressedThisFrame)
    {
      transform.Translate(0, -1, 0);
    }
  }
}

Keyboard.current شما می توانید وضعیت مطبوعات کلید صفحه کلید فعلی و غیره از . keyboard.xxxxxxx.wasPressedThisFrame فقط true زمان لحظه ای که کلید فشار داده می شود را برمی گرداند. در این کد، لحظه ای که کلید مکان نما فشار داده می شود، عملیات حرکت بر روی شیء متن انجام می شود transform . از انجا که تنها در لحظه فشار دادن پردازش می شود، جنبش حتی اگر کلید فشار داده شود، ادامه نمی یابد.

پس از EventSystem ذخیره اسکریپت، به شیء KeyboardOneFrame پیوست کنید و کلیک کنید شیء متن را تنظیم کنید تا به شیء متن منتقل شود.

سعی کنید در حال اجرا بازی و چک کردن اگر علامت @ حرکت می کند زمانی که شما کلید مکان نما را فشار دهید. همچنین، اطمینان حاصل کنید که پایین نگه داشتن کلید نماد @ را حرکت نمی دهد.

چه نوع کلید هایی را می توان تعیین کرد؟

این در وب سایت رسمی نوشته شده است، بنابراین لطفا انجا را بررسی کنید.

تعیین لحظه ای که یک کلید خاص ازاد می شود

ما یک نمونه ایجاد نمی کنیم، اما لحظه ای wasPressedThisFrame که ان را فشار می دهید توسط ملک تعیین می شود، در حالی که لحظه ای wasReleasedThisFrame که ان را ازاد می کنید می توان ان را قضاوت کرد.

تعیین در حالی که با فشار دادن یک کلید خاص

این نیز توسط فیلمنامه تعیین می شود. شما می توانید ان را به کد قبلی اضافه کنید، اما این بار ما یک فایل اسکریپت جدید به نام ایجاد می کنیم و ان را KeyboardPress می نویسیم.

فیلمنامه به این شکل است:

using UnityEngine;
using UnityEngine.UI;           // 追加
using UnityEngine.InputSystem;  // 追加

public class KeyboardPress : MonoBehaviour
{
  /// <summary>回転させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    var transform = TextObject.transform;

    // isPressed は押している間はずっと true となる
    // キーは「Keyboard.current[Key.Space]」のような指定の仕方もある
    if (keyboard.spaceKey.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

در حالی که نوار فاصله فشار داده می شود، جسم متن چرخش می کند. keyboard.xxxxxxxx.isPressed بازگشت برای کل true مدت زمان کلید.

اسکریپت ذخیره شده را EventSystem به Text Object پیوست کنید و شیء متن را برای چرخش تنظیم کنید.

اطمینان حاصل کنید که نماد @ چرخش تمام راه را در حالی که بازی در حال اجرا است و برگزاری فاصله.

دریافت همه کلیدهای فشرده شده

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

KeyboardAllKeys یک اسکریپت با نام ایجاد کنید.

فیلمنامه به این شکل است:

using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class KeyboardAllKeys : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      TextObject.text = "";
      return;
    }

    // allKeys からすべてのキーの情報を走査し isPressed で押しているキーのみを抽出する
    TextObject.text = string.Join(", ", keyboard.allKeys.Where(x => x.isPressed).Select(x => x.keyCode.ToString()));
  }
}

keyboard.allKeys اجازه می دهد تا شما را به دریافت اطلاعات در مورد تمام کلید. شما فقط می توانید انهایی را که درست هستند از isPressed ان کلیدها استخراج کنید و فقط کلیدهایی را که فشار می دهید بازیابی کنید. پس از ان، کلیدی که فشار می دهید به یک رشته تبدیل می شود و به عنوان متن نمایش داده می شود.

EventSystem اسکریپت ایجاد شده به یک شیء متنی برای نمایش کلید فشار می دهد و تنظیم می کند.

بازی را اجرا کنید و بررسی کنید که کلیدی که فشار می دهید ظاهر می شود.

به هر حال، حتی اگر کلیدهای زیادی را فشار دهید، تمام کلیدها ممکن است نمایش داده نشوند، اما نگران نباشید زیرا به دلیل سیم کشی صفحه کلید یک مشکل فیزیکی است.

گرفتن نویسه های تایپ شده

تا کنون، شما نوع کلیدی را که فشار داده اید دریافت کرده اید، اما همچنین می توانید شخصیت هایی را که واقعا تایپ کرده اید دریافت کنید. به عنوان مثال، اگر کلید "A" فشار داده شود، حرف "a" را می توان به دست اورد و اگر کلید "Shift + A" فشار داده شود، حرف "A" می تواند به دست اورد. اگر IME فعال باشد، ممکن است بتوانید ژاپنی را بازیابی کنید.

با این حال، این شخصیت های وارد شده را نمی توان در خواص بازیابی کرد و در قالب حوادث به دست اورد.

در نمونه، یک شیء متنی برای نمایش کاراکترهای وارد شده قرار می گیرد.

یک اسکریپت ایجاد کنید. KeyboardTextInput نام این است.

اسکریپت را به شرح زیر وارد کنید:

using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class KeyboardTextInput : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>
  /// オブジェクトが有効になったときに呼ばれるイベント。
  /// </summary>
  public void OnEnable()
  {
    // 文字が入力されたときに呼ばれるイベントをセット
    Keyboard.current.onTextInput += OnTextInput;
  }

  /// <summary>
  /// オブジェクトが無効になったときに呼ばれるイベント。
  /// </summary>
  public void OnDisable()
  {
    // 文字が入力されたときに呼ばれるイベントを解除
    Keyboard.current.onTextInput -= OnTextInput;
  }

  /// <summary>
  /// 文字を入力するたびに呼ばれる。
  /// </summary>
  /// <param name="c">入力された文字。</param>
  public void OnTextInput(char c)
  {
    TextObject.text += c;
  }
}

Keyboardکلاس onTextInput دارای یک رویداد به نام است که هر زمان که متن وارد می شود نامیده می شود. OnEnable در اینجا، روش در زمان ثبت نام وOnDisable لغو در OnTextInput OnTextInput زمان . Keyboard.current یک شیء منحصر به فرد است که از زمان اجرای بازی تا پایان ان وجود دارد، بنابراین OnDisable مطمئن شوید که ان را در زمان انتشار منتشر کنید. اگر همیشه می توانید ثبت نام رویداد و لغو را جفت کنید، می توانید ان را در هر زمان دیگری تنظیم کنید.

OnTextInput در روش، کاراکتر وارد شده به عنوان یک استدلال c تنظیم می شود، بنابراین به عنوان متن اضافه می شود.

پس از EventSystem ذخیره اسکریپت، ان را ضمیمه کنید و یک شیء متنی را برای نمایش تنظیم کنید.

سعی کنید بازی را اجرا کنید و کلید را فشار دهید. شما باید شخصیت های وارد شده را ببینید. اگر همزمان با کلید Shift ان را فشار دهید، باید بتوانید حروف بزرگ و نمادها را وارد کنید. شما همچنین می توانید ژاپنی را وارد کنید اگر IME فعال باشد. از سوی دیگر، اگر یک کلید غیر کاراکتر مانند کلید مکان نما را فشار دهید، هیچ اتفاقی نخواهد افتاد.