using System; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.LowLevel; using UnityEngine.InputSystem.Utilities; #if UNITY_EDITOR using UnityEditor; #endif // 设备状态结构体 [StructLayout(LayoutKind.Explicit, Size = 2)] public struct CustomHIDDeviceState : IInputStateTypeInfo { public FourCC format => new FourCC('H', 'I', 'D'); [FieldOffset(0)] public byte reportId; // 报告ID [FieldOffset(1)] // 按钮状态紧随报告ID之后 [InputControl(name = "button", layout = "Button", bit = 0)] public byte buttons; } #if UNITY_EDITOR // [InitializeOnLoad] // 确保在编辑器加载时运行 #endif [InputControlLayout(stateType = typeof(CustomHIDDeviceState))] public class CustomHIDDevice : InputDevice { // 在这里可以添加更多自定义功能和属性 public ButtonControl button { get; private set; } protected override void FinishSetup() { // 初始化按钮控件 button = GetChildControl("button"); base.FinishSetup(); } // // 注册设备和布局 // static CustomHIDDevice() // { // InputSystem.RegisterLayout( // matches: new InputDeviceMatcher() // .WithInterface("HID") // .WithCapability("vendorId", 0x16C0) // .WithCapability("productId", 0x05DF) // ); // } // In the Player, to trigger the calling of the static constructor, // create an empty method annotated with RuntimeInitializeOnLoadMethod. // [RuntimeInitializeOnLoadMethod] // static void Init() { } public struct CustomHIDOutputReportCommand : IInputDeviceCommandInfo { public static FourCC Type { get { return new FourCC('C', 'H', 'O', 'R'); } } public FourCC typeStatic => Type; public InputDeviceCommand baseCommand; // Output report data [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] reportData; public static CustomHIDOutputReportCommand Create(byte[] data) { var command = new CustomHIDOutputReportCommand { baseCommand = new InputDeviceCommand(Type, Marshal.SizeOf()), reportData = data }; return command; } } }