首页/ 第 8 章 · 输入系统/ 第 112 课
LESSON 112 · 输入系统

键盘按键输入 GetKey 系列

键盘输入已掌握。下一课学鼠标输入。

⏱ 约 13 分钟📊 难度:入门🗂 第 8 章 · 输入系统📍 第 112 / 300 课
课程进度
112 / 300

🎯本节学习目标

  • 理解三个按键方法的区别
  • 掌握 KeyCode 枚举
  • 实现按键操作

🚀课程导读

“按一下空格跳”是 GetKeyDown;“按住 Shift 跑”是 GetKey;“松开跳更高”是 GetKeyUp。本课把三种时机讲透。

三种按键方法

时机不同。

  1. 【GetKeyDown】“按下那一刻”触发一次:if (Input.GetKeyDown(KeyCode.Space)) { 跳跃 }
  2. 适合:一次性的动作(跳、开枪、开门、暂停)。
  3. 【GetKey】“按住期间”每帧都为 true:if (Input.GetKey(KeyCode.LeftShift)) { 加速跑 }
  4. 适合:持续状态(跑步、蓄力、连发)。
  5. 【GetKeyUp】“松开那一刻”触发一次:if (Input.GetKeyUp(KeyCode.Space)) { 起跳结束 }
  6. 适合:松手触发的动作(蓄力释放、大跳)。
  7. 【KeyCode 枚举】KeyCode.Space、KeyCode.W、KeyCode.Escape、KeyCode.R 等,几乎覆盖所有键。
  8. 【别名】也可用 Input.GetKey("space") 字符串,但 KeyCode 更规范。
  9. 【判断任意键】Input.anyKeyDown(任何键按下);Input.anyKey(按住)。
💡
记住口诀:Down=按下的瞬间、默认=按住期间、Up=松开瞬间。

实战:跳跃与暂停

用三种方法实现。

  1. 新建脚本 KeyDemo,挂到角色上:
  2. void Update() {
  3. if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("起跳"); }
  4. if (Input.GetKey(KeyCode.LeftShift)) { Debug.Log("按住加速中"); }
  5. if (Input.GetKeyUp(KeyCode.Space)) { Debug.Log("松手"); }
  6. if (Input.GetKeyDown(KeyCode.Escape)) { Debug.Log("暂停游戏"); Time.timeScale = 0f; }
  7. if (Input.GetKeyDown(KeyCode.R)) { Time.timeScale = 1f; }
  8. }
  9. 播放:按空格、按住 Shift、松开空格、按 Esc 暂停、按 R 恢复。
  10. 【注意】GetKeyDown 只在“从没按到按”的一帧为 true,不会重复触发。
  11. 【组合键】if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.C)) { 复制 }
  12. 【输入框冲突】UI 有输入框时,打字会触发游戏按键,需用 EventSystem 判断焦点(第 152 课)。
按键三兄弟 + KeyCode 枚举,覆盖所有键盘操作需求。

常见错误与排查

错误:按住按键但 GetKeyDown 只触发一次?
原因:GetKeyDown 本来就只触发一次(这是对的)
解决:需要持续效果用 GetKey,而不是 GetKeyDown。

动手练习

课后小任务(做出来才算真的学会)

  • 用 GetKeyDown 实现跳跃
  • 用 GetKey 实现按住加速
  • 用 GetKeyUp 实现松手释放技能

本节小结

键盘输入已掌握。下一课学鼠标输入。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课Input.GetAxis 轴向输入