unity硬件接入(二)---Inputsystem

该文介绍如何在Unity2021.3.16f1c1版本中使用InputSystem管理设备,特别是针对PID为0x17EF和VID为0x6018(如SonyWirelesscontroller)的HID设备进行注册和数据接收。通过声明硬件设备布局、配置控制面板和解析输入报告来实现硬件交互,包括轴数据读取和按钮状态判定。

安装环境

unity:2021.3.16f1c1
InputSystem

使用说明

设备管理器-人体学输入设备-选择你的控制器
打开事件管理,复制出设备的UID和PID

脚本配置

  1. 声明硬件设备
    配置VID,PID指向数据接收方
 InputSystem.RegisterLayout<CarJoyInput>(
            matches: new InputDeviceMatcher()
                .WithInterface("HID")
                  .WithCapability("vendorId", 0x17EF) // Sony Entertainment.
        .WithCapability("productId", 0x6018)); // Wireless controller.

配置面板布局以及接收数据解析方案

[InputControlLayout(stateType = typeof(JoyInputTest))]

硬件注册脚本总体脚本

using UnityEditor;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.InputSystem.DualShock;
using UnityEngine.InputSystem.Layouts;
[InputControlLayout(stateType = typeof(JoyInputTest))]
#if UNITY_EDITOR
[InitializeOnLoad] // Make sure static constructor is called during startup.
#endif
public class  CarJoyInput : InputDevice
{
    static CarJoyInput()
    {
     InputSystem.RegisterLayout<CarJoyInput>(
            matches: new InputDeviceMatcher()
                .WithInterface("HID")
                  .WithCapability("vendorId", 0x17EF) // Sony Entertainment.
        .WithCapability("productId", 0x6018)); // Wireless controller.
    }
  
   [RuntimeInitializeOnLoadMethod]
    public static void Init()
    {

    }
     protected override void FinishSetup()
    {
        base.FinishSetup();
        Oil = GetChildControl<AxisControl>("Oil");
     }
 }

硬件布局以及硬件解析方案配置

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.InputSystem.Layouts;
using UnityEngine.InputSystem.LowLevel;
using UnityEngine.InputSystem.Utilities;

[StructLayout(LayoutKind.Explicit, Size = 3)]
struct CarJoyInputReport : IInputStateTypeInfo
{
    public FourCC format => new FourCC('H', 'I', 'D');
    [InputControl(name = "Ignite", displayName = "点火器", offset = 1, bit = 4, sizeInBits = 1, layout = "Button", format = "BIT")]
    [FieldOffset(0)] public byte reportId;

}

InputControl相关参数说明:

参数名称参数定义
name元素名称
displayName备注名称
offsetbyte偏移
bitbyte中的位
sizeInBits对应数据长度
layout元素类型
format序列化方法

当前按照自己的想法改造的罗技输入面板可以进行轴数据读取,按钮状态判定等,与input本身系统较为类似
按照自己的想法改造的罗技方向盘输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值