Appearance
输入系统
玩家操作设备
↓
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 | 一组动作,比如 Player、UI、Menu |
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
└─ Cancel5. 新系统零基础搭建流程
推荐这样做:
Window > Package Manager安装Input SystemProject Settings > Player > Active Input Handling选择Input System Package或Both- 在 Project 里创建
Input Actions资源 - 新建
Action Map:比如Player - 新建动作:
Move、Jump、Attack - 给动作绑定键盘、鼠标、手柄
- 给 Player 对象添加
PlayerInput组件 - 脚本接收输入动作
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 移动
}不要在输入回调里直接做复杂物理移动。更稳的做法是: 输入回调只保存输入值,真正移动放到 Update 或 FixedUpdate。
8. UI 输入也是输入系统的一部分
菜单、按钮、背包、暂停界面也需要输入。
新系统里 UI 通常靠:
c
EventSystem
Input System UI Input Module这样键盘、鼠标、手柄都可以控制 UI。
常见 UI 动作:
c
Navigate 方向选择
Submit 确认
Cancel 返回
Point 鼠标/触屏位置
Click 点击
Scroll 滚轮9. 怎么学最稳
我建议你按这个顺序:
- 先用旧系统练
GetKeyDown、GetAxisRaw - 做一个简单角色移动
- 理解
Update每帧读取输入 - 安装新 Input System
- 创建
Move、Jump、Attack - 用
PlayerInput接收动作 - 加手柄绑定
- 再学 UI 输入
- 最后学改键、本地多人、触屏
一句话总结:
c
输入系统 = 设备输入 -> 动作抽象 -> 绑定配置 -> 脚本响应 -> 控制游戏对象参考链接