عملیات با جوی استیک (نسخه بسته بندی شده سیستم ورودی)
محیط تایید
- ویندوز
-
- ویندوز 11
- ویرایشگر یونیتی
-
- دانلود: 2020.3.25f1
- بسته های سیستم ورودی
-
- 1.2.0
پیشنیازهای این نکته
تنظیمات زیر به عنوان پیش نیاز برای توضیح این نکات از قبل پیکربندی شده است.
درباره XInput و DirectInput
اگر چه محدود به ویندوز است، دو فرمت اتصال برای کنترل کننده های بازی وجود دارد: "DirectInput" و "XInput". "جوی استیک" در اینجا مربوط به "DirectInput" است.
در Joystick
این برنامه، ما با یک کلاس برخورد می کنیم، اما فقط می تواند کنترل کننده هایی را که از "DirectInput" پشتیبانی می کنند، اداره کند.
برای استفاده از یک کنترلر که از "XInput" پشتیبانی می کند، باید از یک کلاس متفاوت Gamepad
استفاده کنید.
"DirectInput" یک فرمت اتصال قدیمی است و تعریف دکمه ها نسبتا مبهم است و می تواند کنترل کننده ها را با اشکال خاص اداره کند. با این حال، اخیرا ، "XInput" به جریان اصلی تبدیل شده است و تعداد کنترل کننده هایی که از "DirectInput" پشتیبانی نمی کنند در حال افزایش است. از انجا که "DirectInput" دکمه ها را به عنوان "1"، "2" و "3" تعریف می کند، سازندگان بازی باید سیستمی را ایجاد کنند که اجازه می دهد تا بازی و مکاتبات دکمه کنترل کننده به طور مناسب تنظیم شود.
"XInput" به عنوان نسل بعدی "DirectInput" تعریف شده است و دارای دکمه های A و B، محرک ها، چوب ها و غیره است. بنابراین، شکل کنترل کننده تنها می تواند مورد استفاده قرار گیرد، که تقریبا ثابت است. از انجا که تعریف دکمه ها به خوبی تعریف شده است، سازندگان بازی می توانند بازی هایی را ایجاد کنند که با کنترل کننده مطابقت داشته باشند بدون اینکه نگران قرار دادن دکمه ها باشند. تعداد فزاینده ای از کنترل کننده های بازی های اخیر تنها با "XInput" سازگار هستند.
درباره جوی استیک
همانطور که در بالا ذکر شد، هیچ تعریفی از دکمه وجود ندارد، بنابراین برای استفاده واقعی از ان، لازم است فرایندهای مشکل ساز مانند تخصیص عملیات بازی را در هنگام بررسی اطلاعات هر دکمه اضافه کنید. من فکر نمی کنم شما نیاز به استفاده از DirectInput در یک بازی جدید به دلیل ان قدیمی است، اما به خاطر داشته باشید که اگر شما واقعا می خواهید برای حمایت از ان، برنامه خود را می تواند پیچیده.
این نمونه اساسا محدود به به دست اوردن اطلاعات در دکمه های ذکر شده است.
name
در واقع، شما باید عملیات را بررسی و اختصاص دهید.
جوی استیک کسب اطلاعات
یک شیء متنی را برای نمایش اطلاعات مربوط به هر دکمه روی جوی استیک قرار دهید.
یک اسکریپت ایجاد کنید. نام خودسرانه است، اما در این مورد JoystickInfo
، ان است.
فیلمنامه به این شکل است: اطلاعات به دست امده بسته به نوع کنترل کننده متفاوت است. برنامه ریزی برای هر کنترل کننده بسیار دشوار است، بنابراین من فقط تمام دکمه ها را شمارش می کنم و نوع دکمه را دریافت می کنم و اطلاعات را فشار می دهم.
using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;
public class JoystickInfo : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
StringBuilder Builder = new StringBuilder();
// 更新はフレームごとに1回呼び出されます
void Update()
{
if (TextObject == null)
{
Debug.Log($"{nameof(TextObject)} が null です。");
return;
}
// 1つ目のジョイスティックの情報を取得
var joystick = Joystick.current;
if (joystick == null)
{
Debug.Log("ジョイスティックがありません。");
TextObject.text = "";
return;
}
Builder.Clear();
// ジョイスティックの情報取得
Builder.AppendLine($"deviceId:{joystick.deviceId}");
Builder.AppendLine($"name:{joystick.name}");
Builder.AppendLine($"displayName:{joystick.displayName}");
// ジョイスティックにはボタンの大部分が定義されていないので
// 基本的には allControls で列挙して入力の種類と値を確認していく
foreach (var key in joystick.allControls)
{
if (key is StickControl stick)
{
if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");
var value = stick.ReadValue();
if (value.magnitude > 0f)
{
Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
}
}
else if (key is Vector2Control vec2)
{
var value = vec2.ReadValue();
if (value.magnitude > 0f)
{
Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
}
if (vec2.x.ReadValue() != 0f)
{
Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
}
if (vec2.y.ReadValue() != 0f)
{
Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
}
}
else if (key is ButtonControl button)
{
if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
var value = button.ReadValue();
if (value != 0f)
{
Builder.AppendLine($"{key.name}:{value}");
}
}
else if (key is AxisControl axis)
{
if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");
var value = axis.ReadValue();
if (value != 0f)
{
Builder.AppendLine($"{key.name}:{value}");
}
}
else
{
Builder.AppendLine($"Type={key.GetType()}");
}
}
// 押しているボタン一覧をテキストで表示
TextObject.text = Builder.ToString();
}
}
شما می توانید اطلاعات Joystick.current
مربوط به جوی استیک متصل را در .
Joystick
پس از ان، ما هر اطلاعات را از کلاس دریافت خواهیم کرد.
Joystick
همانطور که از کلاس می بینید، stick
trigger
تعاریفی مانند و وجود دارد، اما هیچ تعریفی مانند دکمه A یا دکمه شروع وجود ندارد.
بنابراین، شما باید از خواص برای شمارش تمام دکمه ها، چوب هاallControls
و پیدا کردن نوع دکمه و فشار دادن اطلاعات استفاده کنید.
هنگامی که اسکریپت ذخیره می شود، EventSystem
ان را ضمیمه کنید و یک شیء متنی را برای نمایش اطلاعات تنظیم کنید.
سعی کنید بازی را با یک کنترلر که از DirectInput پشتیبانی می کند، اجرا کنید. هر قطعه از اطلاعات را می توان بازیابی کرد.
بسته به کنترل کننده، ممکن است هنگام فشار دادن یک چوب، کلید فلش و غیره، مقدار مورد نظر را دریافت نکنید. از انجا که دکمه ها به این روش تعریف نمی شوند، به دست اوردن اطلاعات دقیق مطبوعات برای هر دکمه دشوار است. علاوه بر این، شما می توانید ببینید که پشتیبانی کامل از جوی استیک بسیار دشوار است، مانند ترتیب دکمه ها بسته به کنترل کننده متفاوت است.
اگر بازی از جوی استیک پشتیبانی می کند، مطلوب است که یک صفحه تنظیم مانند یک پیکربندی کلیدی داشته باشید تا هر کاربر بتواند طرح دکمه کنترل کننده ای را که دارد سفارشی کند.
چگونه برای به دست اوردن اطلاعات برای جوی استیک های متعدد
اطلاعات مربوط به Joystick.all
تمام جوی استیک های متصل را می توان در .
ReadOnlyArray
می توان ان foreach
را در و غیره برشمرد.
از انجا که هر مقدار یک کلاس است Joystick
، می توانید اطلاعات جوی استیک را مانند برنامه قبلی دریافت کنید.