开这个教程的目的在于,在开发用新输入系统时,查了查网上没有太系统的讲解,并且相比视频,我个人更喜欢文字类的教程记录,这样效率比较高。InputSystem实际上有多种适用于不同场景的使用方式,而一些方式使用不当就容易出现BUG(比如一次按键触发两次),并且在未来有可能会将InputSystem基础上做一下封装进框架便于使用,所幸直接啃官方文档写个文字总结。本文字教程依据链接InputSystem1.5.0,最新版本为1.6,差别不大。

学习完本教程,你能够Get到:

  • 掌握InputSystem的四种工作流。
  • 相当于完整的读了一遍官方英文手册。
  • 掌握InputSystem的使用方式。
  • 精准定制自己想要的输入。

需要说明的是,本教程不仅是使用手册的汉化,我将以更加有逻辑的,易懂的文字对手册中的各部分进行分析讲解,并结合官方案例给予简单明了的使用用例。

InputSystem的安装

InputSystem需要Unity2019.4以上版本和.Net4,低版本不支持。安装在PackageManager搜索安装即可。

alt

在ProjectSetting中启用InputSystem,默认项目使用旧版InputManager,也可以勾选Both同时启用用于测试。

alt

InputSystem的快速使用

直接从当前设备获取输入

和InputManager类似,InputSystem也支持从当前硬件设备直接获取输入。

        //按下S InputSystem
        Keyboard keyboard = Keyboard.current;
        if(keyboard.sKey.wasPressedThisFrame)
        {
            Debug.Log("按下S");
        }

        //按下S InputManager
        if (Input.GetKeyDown(KeyCode.S))
        {
            Debug.Log("按下S");
        }

通过InputAction间接获取输入

尽管传统通过设备直接获取输入的方式简单明了,但在支持多类型设备/修改输入逻辑时,维护起来十分麻烦。为了将硬件输入和输入对应的动作响应进行解耦,InputSystem将动作响应借助事件与实际的硬件输入分开,并由InputActions可视化配置输入和动作响应的映射关系,这样在脚本中无需关注硬件设备类型。

添加PlayerInput组件

alt

为监听输入响应的对象添加PlayerInput组件(PlayerInput对应一个玩家,PlayerInputManager用于获取多个玩家输入)。

创建InputActions

alt

PlayerInput通过与InputAction关联配置响应事件,CreateAction会自动创建默认的Input Action Maps, Input Actions, and Input Bindings。InputAction对应一项具体的输入动作(比如鼠标移动、人物前进后退,单个按键按下),InputBindings则用于配置输入动作与设备的哪些按键绑定,并可以进行功能的细分,详细会在后续章节讲述。

alt

在PlayerInput中配置动作响应

到目前为止已经完成了硬件输入->动作的绑定,还需要将这个动作对应脚本中的方法进行绑定。

alt

alt

使用UnityEvent这种最简单的方式,可以自由指定响应方法,该方法需要为public公开方法,如果想调用动作的相关信息,比如是否按下,坐标值,可以通过InputAction.CallbackContext获取。

    public void hello(InputAction.CallbackContext context)
    {

    }

至此,完整的逻辑已经打通,从硬件输入->动作,动作->实际的响应方法逻辑。可以看出,动作即InputAction充当着中介,将硬件设备与响应方法进行了解耦。

alt