Skip to content

输入系统

unity-input-system

玩家操作设备

Unity 读取输入

转换成游戏动作

脚本根据动作控制角色、UI、镜头、技能

1. Unity 有两套输入系统

Unity 现在主要有两套:

系统名字适合谁
旧系统Input Manager / UnityEngine.Input小练习、老项目、快速入门
新系统Input System Package新项目、多平台、手柄、触屏、改键、本地多人

官方也明确说:新 Input System Package 更新、更灵活、支持更好;旧 Input Manager 是 legacy 系统。

2. 旧输入系统:最容易理解

旧系统常用 API:

c
Input.GetKey(KeyCode.A)        // 按住 A 时为 true
Input.GetKeyDown(KeyCode.A)    // 按下 A 的那一帧为 true
Input.GetKeyUp(KeyCode.A)      // 松开 A 的那一帧为 true

Input.GetAxis("Horizontal")    // 平滑轴,范围 -1 到 1
Input.GetAxisRaw("Horizontal") // 原始轴,通常是 -1、0、1

例子:左右移动和跳跃

c
using UnityEngine;

public class OldInputPlayer : MonoBehaviour
{
    [SerializeField] private float speed = 5f;

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");

        transform.position += new Vector3(x, 0, 0) * speed * Time.deltaTime;

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("Jump");
        }
    }
}

重点区别:

GetKey      = 按住期间每帧都触发
GetKeyDown  = 只在按下那一帧触发
GetAxis     = 带平滑,适合摇杆/连续移动
GetAxisRaw  = 不平滑,适合像素风/立即响应移动

旧系统的优点是简单。缺点是:多设备、手柄、触屏、改键、本地多人会越来越麻烦。

3. 新 Input System:真正推荐主学

新输入系统的核心思想是: 不要直接问“玩家按了哪个键”,而是问“玩家想做什么动作”。

比如不要写死:

Space = Jump
WASD = Move
Mouse = Look

而是抽象成:

Move
Jump
Attack
Look
Pause
Interact

然后这些动作可以绑定到不同设备:

Move   = WASD / 左摇杆 / 虚拟摇杆
Jump   = Space / 手柄 A 键 / 屏幕按钮
Attack = 鼠标左键 / 手柄 RT / 触屏点击

这就是新系统最重要的概念:Action 动作 和 Binding 绑定分离。

4. 新输入系统几个核心词

概念意思
Input Device输入设备,比如键盘、鼠标、手柄、触屏
Control设备上的具体控件,比如 W 键、鼠标左键、左摇杆
Input Action游戏动作,比如移动、跳跃、攻击
Binding把某个控件绑定到某个动作
Action Map一组动作,比如 PlayerUIMenu
Control Scheme控制方案,比如键鼠方案、手柄方案
PlayerInput官方提供的玩家输入组件
InputActionAsset保存所有输入动作配置的资源文件

你可以这样理解:

InputActionAsset
├─ Player Action Map
│  ├─ Move   -> WASD / Left Stick
│  ├─ Jump   -> Space / Gamepad South
│  └─ Attack -> Mouse Left / Gamepad Trigger
└─ UI Action Map
   ├─ Navigate
   ├─ Submit
   └─ Cancel

5. 新系统零基础搭建流程

推荐这样做:

  1. Window > Package Manager 安装 Input System
  2. Project Settings > Player > Active Input Handling 选择 Input System PackageBoth
  3. 在 Project 里创建 Input Actions 资源
  4. 新建 Action Map:比如 Player
  5. 新建动作:MoveJumpAttack
  6. 给动作绑定键盘、鼠标、手柄
  7. 给 Player 对象添加 PlayerInput 组件
  8. 脚本接收输入动作

6. 新系统代码例子:PlayerInput 方式

假设你有:

Action Map: Player
Action: Move  类型 Value / Vector2
Action: Jump  类型 Button

脚本:

c
using UnityEngine;
using UnityEngine.InputSystem;

public class NewInputPlayer : MonoBehaviour
{
    [SerializeField] private float speed = 5f;

    private Vector2 moveInput;

    public void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    public void OnJump(InputValue value)
    {
        if (value.isPressed)
        {
            Debug.Log("Jump");
        }
    }

    void Update()
    {
        Vector3 move = new Vector3(moveInput.x, 0, moveInput.y);
        transform.position += move * speed * Time.deltaTime;
    }
}

这里的关键是:

c
OnMove  对应 Move 动作
OnJump  对应 Jump 动作

如果 PlayerInput 的 Behavior 选择 Send Messages,Unity 会自动调用这些 On动作名 方法。

7. 输入和物理要分开

一个非常重要的新手规则:

c
Update       读输入
FixedUpdate 处理物理

例如:

c
void Update()
{
    // 读输入
}

void FixedUpdate()
{
    // 用 Rigidbody 移动
}

不要在输入回调里直接做复杂物理移动。更稳的做法是: 输入回调只保存输入值,真正移动放到 UpdateFixedUpdate

8. UI 输入也是输入系统的一部分

菜单、按钮、背包、暂停界面也需要输入。

新系统里 UI 通常靠:

c
EventSystem
Input System UI Input Module

这样键盘、鼠标、手柄都可以控制 UI。

常见 UI 动作:

c
Navigate  方向选择
Submit    确认
Cancel    返回
Point     鼠标/触屏位置
Click     点击
Scroll    滚轮

9. 怎么学最稳

我建议你按这个顺序:

  1. 先用旧系统练 GetKeyDownGetAxisRaw
  2. 做一个简单角色移动
  3. 理解 Update 每帧读取输入
  4. 安装新 Input System
  5. 创建 MoveJumpAttack
  6. PlayerInput 接收动作
  7. 加手柄绑定
  8. 再学 UI 输入
  9. 最后学改键、本地多人、触屏

一句话总结:

c
输入系统 = 设备输入 -> 动作抽象 -> 绑定配置 -> 脚本响应 -> 控制游戏对象

参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0