手把手教会你使用Unity新版输入系统

Unity 新版输入系统详解 (2025)

一、新版输入系统概述

Unity 的新版输入系统 (Input System) 是一个现代化、灵活且高效的输入处理框架,相比旧版输入系统 (Input Manager) 有以下优势:

  1. 跨平台一致性​:统一处理各种输入设备(键盘、鼠标、手柄、触摸屏等)
  2. 事件驱动​:基于事件的输入处理,减少不必要的轮询
  3. 可配置性​:通过 Input Actions 灵活配置输入映射
  4. 更好的性能​:优化的底层架构减少CPU开销
  5. 支持现代设备​:更好地支持VR控制器、触觉反馈等新设备

二、安装与设置

安装

通过 Package Manager 安装 Input System 包:

  1. 菜单栏 Window > Package Manager
  2. 选择 "Unity Registry"
  3. 搜索 "Input System" 并安装

手把手教会你使用Unity新版输入系统_第1张图片

启用

安装后需要在 Player Settings 中启用:

Edit > Project Settings > Player > Other Settings
将 Active Input Handling 设置为 "Input System Package (New)" 或 "Both"

三、核心概念

1. Input Actions

Input Actions 是抽象的用户输入动作(如"跳跃"、"移动"),可以映射到多个物理输入。

2. Input Action Assets

包含一组 Input Actions 的配置文件(.inputactions 文件),可在编辑器中可视化配置。

3. Control Schemes

控制方案,允许为不同设备(如键盘鼠标、游戏手柄)定义不同的输入映射。

4. Bindings

将物理输入(如空格键、游戏手柄A键)映射到 Input Actions 的规则。

四、基本使用流程

1. 创建 Input Action Asset

  1. 右键 Project 窗口 > Create > Input Actions
  2. 双击新创建的 .inputactions 文件打开编辑器

2. 配置 Input Actions

在 Input Action Editor 中:

  1. 添加 Action Map(如"Player"、"UI")
  2. 在每个 Action Map 中添加 Actions(如"Move"、"Jump")
  3. 为每个 Action 添加 Bindings(如 WASD 键、左摇杆)

3. 在代码中使用

方法一:直接通过 InputAction 引用
public class PlayerController : MonoBehaviour
{
    public InputAction moveAction;
    
    private void OnEnable()
    {
        moveAction.Enable();
        moveAction.performed += OnMove;
    }
    
    private void OnDisable()
    {
        moveAction.Disable();
        moveAction.performed -= OnMove;
    }
    
    private void OnMove(InputAction.CallbackContext context)
    {
        Vector2 moveInput = context.ReadValue();
        // 处理移动逻辑
    }
}
方法二:通过生成的 C# 类(推荐)
  1. 在 Input Action Asset 检查器中勾选 "Generate C# Class"
  2. 使用生成的类:
public class PlayerController : MonoBehaviour
{
    private PlayerInputActions inputActions;
    
    private void Awake()
    {
        inputActions = new PlayerInputActions();
    }
    
    private void OnEnable()
    {
        inputActions.Player.Enable();
        inputActions.Player.Jump.performed += OnJump;
    }
    
    private void OnDisable()
    {
        inputActions.Player.Disable();
        inputActions.Player.Jump.performed -= OnJump;
    }
    
    private void OnJump(InputAction.CallbackContext context)
    {
        // 处理跳跃逻辑
    }
    
    private void Update()
    {
        Vector2 moveInput = inputActions.Player.Move.ReadValue();
        // 每帧处理移动
    }
}

五、高级特性

1. 复合输入绑定

可以将多个输入组合成一个复合输入,如:

  • 2D Vector(WASD 或摇杆控制移动)
  • 1D Axis(单个轴的正负方向)
  • 3D Vector(VR 控制器方向)

2. 输入处理器

可以对原始输入值进行处理,如:

  • 标准化向量
  • 死区处理
  • 缩放
  • 反转

3. 交互

定义输入如何触发动作,如:

  • Press(按下时)
  • Hold(按住)
  • Tap(轻击)
  • SlowTap(慢速轻击)
  • MultiTap(多次轻击)

4. 设备切换

自动或手动切换控制方案:

// 获取当前所有控制方案
var schemes = InputSystem.ListControlSchemes();

// 切换控制方案
InputSystem.EnableDevice(Keyboard.current);
InputSystem.DisableDevice(Gamepad.current);

 

5. 触觉反馈

支持手柄的震动反馈:

// 设置左马达强度0.5,右马达强度0.8,持续1秒
Gamepad.current.SetMotorSpeeds(0.5f, 0.8f);
yield return new WaitForSeconds(1f);
Gamepad.current.PauseHaptics();

七、性能优化建议

  1. 避免在 Update 中频繁调用 ReadValue,尽量使用事件驱动
  2. 对不使用的设备调用 Disable 减少处理开销
  3. 使用 InputAction.CallbackContext 中的 startedperformed 和 canceled 精确控制输入响应
  4. 对移动平台,考虑降低输入采样率

八、常见问题解决

  1. 输入不响应​:

    • 检查 Input Action Asset 是否正确启用
    • 确认设备已连接并被系统识别
    • 检查 Player Settings 中的 Input System 设置
  2. 多个输入冲突​:

    • 使用 Control Schemes 分离不同设备的输入
    • 在 Bindings 中设置优先级
  3. 输入延迟​:

    • 减少输入处理中的复杂计算
    • 考虑使用 InputSystem.settings.updateMode 调整更新模式

新版输入系统提供了强大而灵活的输入处理能力,虽然学习曲线略陡峭,但一旦掌握可以显著提升开发效率和游戏质量。建议从简单项目开始实践,逐步掌握其高级功能。

 

 

你可能感兴趣的:(手把手教会你使用Unity新版输入系统)