การทํางานด้วยจอยสติ๊ก (Input System packaged version)
สภาพแวดล้อมการตรวจสอบ
- หน้าต่าง
-
- หน้าต่าง 11
- บรรณาธิการ Unity
-
- ปี 2020.3.25f1
- แพ็คเกจระบบอินพุต
-
- 1.2.0
ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้
การตั้งค่าต่อไปนี้ถูกกําหนดค่าไว้ล่วงหน้าเป็นข้อกําหนดเบื้องต้นสําหรับคําอธิบายของเคล็ดลับเหล่านี้
เกี่ยวกับ XInput และ DirectInput
แม้ว่าจะ จํากัด เฉพาะ Windows แต่ก็มีรูปแบบการเชื่อมต่อสองรูปแบบสําหรับตัวควบคุมเกม: "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
คลาสคุณจึงสามารถรับข้อมูลจอยสติ๊กได้เช่นเดียวกับในโปรแกรมก่อนหน้า