HOME / 第 3 部分 · 2D 游戏开发实战 / 第 18 课
MODULE 3 · 2D 游戏开发实战
第 18 课 · 输入系统入门(Input 与输入映射)
🎯 本课学习目标
- 理解 Godot 的输入映射机制
- 学会创建输入动作(Action)
- 用 Input 单例检测按键
让游戏响应键盘/鼠标/手柄,本课掌握 Godot 的输入系统。核心思想:先定义「动作名」,再绑定按键。
📖 详细教学步骤
什么是输入动作(Input Action)?概念
Godot 推荐的做法:不直接写「按键 W」,而是定义动作(Action)。
- 例如定义动作
move_up,然后绑定「W 键」 - 以后想改成「↑ 键」,只需改绑定,不用改代码
- 手柄、触屏也能绑定到同一个动作
创建输入映射实操
- 菜单 项目 → 项目设置(Project Settings)
- 左侧切换到 输入映射(Input Map) 标签
- 在输入框输入动作名(如
move_right),点 添加 - 展开该动作,点 + → 选择「键(Key)」
- 按键盘上想绑定的键(如 → 键或 D 键)
- 重复添加多个按键到同一动作
用代码检测按键实操
在脚本里用 Input 单例检测:
GDSCRIPTextends Node2D
func _process(delta):
# is_action_pressed: 按住时为 true
if Input.is_action_pressed("move_right"):
print("向右移动中")
# 按下瞬间触发一次
if Input.is_action_just_pressed("jump"):
print("跳跃!")
# 松开瞬间触发一次
if Input.is_action_just_released("jump"):
print("落地")
常用内置动作与鼠标检测实操
Godot 已内置鼠标动作(ui_* 是 UI 动作),鼠标位置与点击:
GDSCRIPTfunc _process(delta):
# 鼠标位置(相对根节点坐标)
var mouse_pos = get_global_mouse_position()
print(mouse_pos)
# 鼠标左键
if Input.is_action_just_pressed("ui_accept"):
print("点击/回车")
# 也可以在 _unhandled_input 里处理事件
func _unhandled_input(event):
if event is InputEventMouseButton and event.pressed:
print("鼠标点击位置:", event.position)
经典:用 WASD 控制方向实战
组合成 8 方向移动向量(第 19 课会用上):
GDSCRIPTvar dir = Vector2.ZERO
func _process(delta):
dir = Vector2.ZERO
if Input.is_action_pressed("move_up"):
dir.y -= 1
if Input.is_action_pressed("move_down"):
dir.y += 1
if Input.is_action_pressed("move_left"):
dir.x -= 1
if Input.is_action_pressed("move_right"):
dir.x += 1
dir = dir.normalized() # 防止斜向更快
position += dir * 200 * delta
⚠️
is_action_pressed 报错找不到动作?
先在项目设置 → 输入映射里创建对应动作名。动作名必须与代码完全一致。
⚠️
斜向移动比直向快?
因为斜向时 x 和 y 同时为 1,速度变成 √2 倍。用 dir.normalized() 归一化即可。
🧪 动手试一试
🏋️ 课后练习
在输入映射里创建 move_up/move_down/move_left/move_right 四个动作并绑定 WASD 和方向键,写代码实现八方向移动。
dir = Vector2(右-左, 下-上),然后 normalized() 乘速度。
💡
想改按键?项目设置 → 输入映射里直接改绑定,不用动代码。
💡
is_action_just_pressed 用「按下瞬间」:跳跃、射击这类触发型动作用它。
🎓 本课小结
输入系统 = 定义动作 + 绑定按键 + Input 单例检测;is_action_pressed 检测按住、just_pressed 检测按下瞬间;记得 normalized() 防止斜向加速。