这篇文章总体定位是提供解决问题的思路,当你看到这篇文章的时候,相信已经参考了许多解决Unity控制输入问题相关的文章(不准的猜测哈)。本人也是在输入设备接入Unity的开发中遇到问题,走了许多弯路后,来总结这篇经验贴,分享一下个人经验。
1.个人在开发中遇到的问题:输入设备按键信号如何被Unity识别
纵所周知的,Unity输入管理器默认提供18个轴,可自行再增加几个,但如果遇到控制轴数超过限制的情况怎么办?本人在开发过程中接手到一套罗技G29,方向盘+变速器+油门离合踏板,远远超出了Unity控制器默认轴数,实机操作过程中,一些按键信号始终无法被Unity识别,其中就有方向盘上的D-pad键,为了识别到这些按键进行下一步功能开发,我考虑了在Unity输入管理器中新增轴(无法找寻到按键具体信号轴,无果)、官方下载硬件SDK(参考别人帖子,SDK中有可直接挂载的脚本,c++环境都不缺的情况下,脚本挂载后还是一直报错)等方法,依旧无法解决。
2.Unity识别设备输入信号问题的解决思路
本文是经验思路总结,遇到这类设备信号输入问题没解决,通常来说都是技术路线和思路有问题,比如上面我自己实践的新增输入控制轴、SDK等方法,都TM又臭又长还难搞,下次遇到这类问题,记住了,用Unity自带的Inupt System就可以搞定,没错,就这么简单。目前Inupt System的博文已经很多了,我就不做细致介绍了,个人比较懒,所以选择直接摆烂,只提供解决问题的思路,具体技术实现我只浅浅谈一下。
3.Inupt System的简单使用说明
之前都是用默认的输入管理器,没怎么关注Inupt System,第一次学习Inupt System的使用,这界面给我一种特别熟悉的感觉,这和动画状态机的设计十分类似,简单易上手。
3.1Inupt System的导入
窗口——包管理器——Unity注册表,找到Inupt System导入即可,这里插个其他话题,Inupt System还用于支持UI的输入,相信很多人不陌生,只是用它来识别设备信号输入的操作可能涉及得比较少。
3.2输入动作的新建
输入动作控制器的新建,在Assets文件下,新建——Input Actions即可
双击动作控制器,即可打开动作控制面板(和动画状态机类似)。
这个动作面板,第一栏时动作图层,下一级是具体的动作添加,一个动作图层下可添加多个动作,新建的动作需要自己绑定输入信号,当你不熟悉你的控制器信号时,直接点击Listen监听,监听状态下,Unity会把所有监听到的硬件输入给识别出来,识别自己需要的按键后,直接绑定信号就行。
3.3绑定信号的脚本事件触发
具体事件的触发代码如下,直接在场景需要交互的物体中挂载脚本即可。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Cube : MonoBehaviour
{
PlayerControls controls;
private void Awake()
{
controls = new PlayerControls();//实例化我新建的动作控制器
controls.Gameplay.Up.performed += ctx => Up();//动作控制器——动作图层——具体动作——动作触发模式 => 触发函数事件,这里用的是lambda表达式
}
private void Up()
{
transform.localScale *= 1.1f;
}
private void OnEnable()
{
controls.Gameplay.Enable();
}
private void OnDisable()
{
controls.Gameplay.Disable();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
挂载好脚本,运行,触发硬件按钮,看看效果吧。
这里再给大家一篇帖子参考,里面对于动作的各类属性设置有详细的描述:(1条消息) 2022-09-09 Unity InputSystem3——InputAction_蔗理苦的博客-CSDN博客_unity inputaction