C# Unity未读取/检测自定义HID设备
所以我尝试在Unity中实现一个定制的HID设备 设备正在向我的Linux PC发送信号,正如我在CMD中看到的那样 我按照本教程设置HID脚本 控制器只有几个按钮 HID是8个字节。 我能够在控制台中检测到来自HID设备的输入。 Unity的输入调试器/Unity的输入控件(侦听)功能都没有检测到任何东西。 我不确定这是否是unity的许可问题 我收到0个编译器错误 我的问题是,为什么unity根本不阅读任何东西 CMD正在完美地阅读HID,但不是unity 如果有人好奇VID和PID地址是否正确,则VID和PID地址直接来自HID手册C# Unity未读取/检测自定义HID设备,c#,unity3d,C#,Unity3d,所以我尝试在Unity中实现一个定制的HID设备 设备正在向我的Linux PC发送信号,正如我在CMD中看到的那样 我按照本教程设置HID脚本 控制器只有几个按钮 HID是8个字节。 我能够在控制台中检测到来自HID设备的输入。 Unity的输入调试器/Unity的输入控件(侦听)功能都没有检测到任何东西。 我不确定这是否是unity的许可问题 我收到0个编译器错误 我的问题是,为什么unity根本不阅读任何东西 CMD正在完美地阅读HID,但不是unity 如果有人好奇VID和PID地址是
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Layouts;
using UnityEditor;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine.InputSystem.Layouts;
using UnityEngine.InputSystem.LowLevel;
using UnityEngine.InputSystem.Utilities;
[StructLayout(LayoutKind.Explicit, Size = 8)]
public class GrayhillControllerReport2 : IInputStateTypeInfo
{
public FourCC format => new FourCC('H', 'I', 'D');
[FieldOffset(0)] public byte ReportID;
[FieldOffset(1)] public byte ScreenNumber;
[FieldOffset(2)] public byte Reserved;
[FieldOffset(3)] public byte EventID;
[InputControl(name = "Encoder", layout = "Button")][FieldOffset(4)] public byte Encoder;
[InputControl(name = "TapMask", layout = "Button")][FieldOffset(5)] public short TapMask;
[InputControl(name = "SwipeMask", layout = "Button")][FieldOffset(7)] public byte SwipeMask;
}
[InputControlLayout(stateType = typeof(GrayhillControllerReport2))]
#if UNITY_EDITOR
[InitializeOnLoad]
#endif
public class GrayhillHID : InputDevice
{
static GrayhillHID()
{
InputSystem.RegisterLayout<GrayhillHID>("GrayhillINFO",
matches: new InputDeviceMatcher()
.WithInterface("HID")
.WithCapability("vendorId", 0x1658) // VID
.WithCapability("productId", 0x0060)); // PID
}
[RuntimeInitializeOnLoadMethod]
static void Init() { Debug.Log("Startup"); }
}
使用UnityEngine;
使用UnityEngine.InputSystem;
使用UnityEngine.InputSystem.Layouts;
使用UnityEditor;
使用制度;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
使用UnityEngine.InputSystem.Layouts;
使用UnityEngine.InputSystem.LowLevel;
使用UnityEngine.InputSystem.Utilities;
[StructLayout(LayoutKind.Explicit,Size=8)]
公共类GrayhillControllerReport2:IIInputStateTypeInfo
{
公共FourCC格式=>newfourcc('H','I','D');
[FieldOffset(0)]公共字节报告ID;
[FieldOffset(1)]公共字节屏幕编号;
[FieldOffset(2)]保留公共字节;
[FieldOffset(3)]公共字节事件ID;
[InputControl(name=“Encoder”,layout=“Button”)][FieldOffset(4)]公共字节编码器;
[InputControl(name=“TapMask”,layout=“Button”)][FieldOffset(5)]公共短TapMask;
[InputControl(name=“SwipeMask”,layout=“Button”)][FieldOffset(7)]公共字节SwipeMask;
}
[InputControlLayout(stateType=typeof(GrayhillControllerReport2))]
#如果统一编辑器
[初始化加载]
#恩迪夫
公共类GrayhillHID:InputDevice
{
静态灰色hillhid()
{
InputSystem.RegisterLayout(“GrayhillINFO”,
匹配:新InputDeviceMatcher()
.WithInterface(“HID”)
.WithCapability(“vendorId”,0x1658)//VID
.WithCapability(“productId”,0x0060));//PID
}
[RuntimeInitializeOnLoadMethod]
静态void Init(){Debug.Log(“启动”);}
}
我有一个简单的Gameloop脚本,可以尝试从自定义HID读取任何输入。
Gameloop.cs
void Start()
{
InputSystem.AddDevice<GrayhillHID>();
}
// Update is called once per frame
void Update()
{
if (Input.anyKey)
{
Debug.Log("An Input Detected");
}
}
void Start()
{
InputSystem.AddDevice();
}
//每帧调用一次更新
无效更新()
{
if(Input.anyKey)
{
Log(“检测到输入”);
}
}