HOME / 第 3 部分 · 2D 游戏开发实战 / 第 18 课
MODULE 3 · 2D 游戏开发实战

第 18 课 · 输入系统入门(Input 与输入映射)

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 3 部分 · 2D 游戏开发实战

🎯 本课学习目标

让游戏响应键盘/鼠标/手柄,本课掌握 Godot 的输入系统。核心思想:先定义「动作名」,再绑定按键。

📖 详细教学步骤

什么是输入动作(Input Action)?概念

Godot 推荐的做法:不直接写「按键 W」,而是定义动作(Action)

  • 例如定义动作 move_up,然后绑定「W 键」
  • 以后想改成「↑ 键」,只需改绑定,不用改代码
  • 手柄、触屏也能绑定到同一个动作

创建输入映射实操

  1. 菜单 项目 → 项目设置(Project Settings)
  2. 左侧切换到 输入映射(Input Map) 标签
  3. 在输入框输入动作名(如 move_right),点 添加
  4. 展开该动作,点 + → 选择「键(Key)」
  5. 按键盘上想绑定的键(如 → 键或 D 键)
  6. 重复添加多个按键到同一动作

用代码检测按键实操

在脚本里用 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() 防止斜向加速。