How to Develop a Game
Input System
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

Unity目前存在新旧两个输入系统,旧输入系统(Input类)和新输入系统(Input System包)

Unity旧输入系统(UnityEngine.Input)

这是Unity默认内建的输入方式,无配置即可用,使用非常直观,主要通过静态类Input获取各种输入信息

键盘输入

基本方法:

Input.GetKey(KeyCode.X); //判断某键是否按住
Input.GetKeyDown(KeyCode.X); // 是否按下(只触发一帧)
Input.GetKeyUp(KeyCode.X)l // 是否刚抬起

KeyCode是一个枚举,表示各种键盘和鼠标按键

鼠标输入

鼠标按钮

Input.GetMouseButton(int button);      // 0左键,1右键,2中键
Input.GetMouseButtonDown(int button);
Input.GetMouseButtonUp(int button);

鼠标位置和滚轮

Vector3 mousePos = Input.mousePosition;    // 屏幕坐标
float scrollDelta = Input.mouseScrollDelta.y; // 滚轮滑动

触摸屏输入(Touch)

移动端专用,支持多点触控

int count = Input.touchCount;

if (count > 0)
{
    Touch touch = Input.GetTouch(0);
    Debug.Log(touch.position); // 屏幕坐标
    Debug.Log(touch.phase); // Began, Moved, Stationary, Ended, Cancled
}

虚拟轴(Input Manager)

通过Unity的Project Setting -> Input Manager设置,可实现跨平台控制
它允许你用统一的名字来访问不同平台或设备上的输入
通过`Input.GetAxis(“Horizontal”)获取的是一个“横向控制”的抽象值,不需要关心是按了哪个具体按键或移动了哪个摇杆

float h = Input.GetAxis("Horizontal"); // A/D 或 左/右
float v = Input.GetAxis("Vertical"); // W/S 或 上/下

float raw = Input.GetAxisRaw("Horizontal"); //不经过平滑处理

常用默认名称列表

名称类型默认映射键描述
HorizontalA/D 键、←/→键、手柄左摇杆左右移动轴,范围 -1 到 1
VerticalW/S 键、↑/↓键、手柄左摇杆上下移动轴,范围 -1 到 1
Fire1按钮Ctrl、鼠标左键、手柄 A 键攻击、射击等
Fire2按钮Alt、鼠标右键、手柄 B 键次要攻击、取消
Fire3按钮Shift、鼠标中键、手柄 X 键冲刺或特殊技能
Jump按钮空格键、手柄 Y 键跳跃
Mouse X鼠标横向移动相机/视角横向旋转
Mouse Y鼠标纵向移动相机/视角纵向旋转
Mouse ScrollWheel鼠标滚轮上下滚动放大缩小、切换武器等
Submit按钮Enter、手柄 A 键UI确认
Cancel按钮Escape、手柄 B 键UI取消

手柄支持(旧系统的有限支持)

手柄也通过虚拟轴或KeyCode.JoystickButton0等访问,但:

Unity新输入系统(Input System Package)

Unity为了解决旧系统的局限,引入了新输入系统,是一个模块化、可配置、支持多设备的专业输入方案

核心概念

Input System包 你需要在Unity的Package Manager中安装Input System

与旧系统的对比

对比项旧系统(Input Manager)新系统(Input System)
支持设备键鼠、手柄(有限)键鼠、手柄、触控、移动传感器等
输入模式较为被动,基于轮询支持事件、轮询、回调
自定义操作不支持强大的 Action Map 系统
多玩家支持手动管理内建支持玩家输入分离
绑定方式硬编码字符串数据驱动 Asset 绑定

关键组成

Input Action(输入动作)
核心概念是“输入动作”,它是抽象层,将具体按键与游戏行为解耦
例如:Jump动作绑定Space键、Gamepad A键
你可以创建一个.inputactions文件来集中管理动作映射

Action Map
是Input Action的集合,例如:

控制方案 用于支持不同设备类型的输入方案,如:

使用流程(常规项目)

public class PlayerController : MonoBehaviour
{
    private PlayerInputActions inputActions;

    private void Awake() => inputActions = new PlayerInputActions();

    private void OnEnable()
    {
        inputActions.Enable();
        inputActions.Player.Jump.performed += OnJump;
    }

    private void OnDisable()
    {
        inputActions.Disable();
        inputActions.Player.Jump.performed -= OnJump;
    }

    private void OnJump(InputAction.CallbackContext context) => Debug.Log("Jump!");
}

配合PlayerInput组件

PlayerInput是Unity提供的MonoBehaviour,用于快速接入.inputactions资产,支持:

void OnMove(InputValue value) => Vector2 move = value.Get<Vector2>();

事件类型

类型描述
started按下的那一帧
performed动作生效(按住、滑动)
canceled动作取消(松开、停止滑动)

实用技巧

动态绑定

inputActions.Player.Fire.start += ctx => Shoot();

支持UI操作 Unity的Input System UI Input Module替代源EventSystem,需绑定Input Actions到UI

多人输入管理